blob: e32b9f37562fcddf7bbd9d6bbf5117fed026c209 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jiyong Park25fc6a92018-11-18 18:02:45 +090019 "io/ioutil"
20 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090021 "path"
Paul Duffin37856732021-02-26 14:24:15 +000022 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070023 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010024 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090025 "sort"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
29 "github.com/google/blueprint/proptools"
30
31 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080032 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000034 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070035 prebuilt_etc "android/soong/etc"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090036 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090037 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070038 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090039)
40
Jaewoong Jung14f5ff62019-06-18 13:09:13 -070041var buildDir string
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Jooyung Han344d5432019-08-23 11:17:39 +090053func testApexError(t *testing.T, pattern, bp string, handlers ...testCustomizer) {
54 t.Helper()
Paul Duffine05480a2021-03-08 15:07:14 +000055 testApexFixtureFactory(bp, handlers).
56 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
57 RunTest(t)
Jooyung Han5c998b92019-06-27 11:30:33 +090058}
59
Colin Cross1c460562021-02-16 17:55:47 -080060func testApex(t *testing.T, bp string, handlers ...testCustomizer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090061 t.Helper()
Paul Duffine05480a2021-03-08 15:07:14 +000062 result := testApexFixtureFactory(bp, handlers).RunTest(t)
63 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffine05480a2021-03-08 15:07:14 +000066// apex package specific mechanism for customizing the test configuration.
67//
68// Use FixturePreparer instances instead.
69//
70// deprecated
Jooyung Han344d5432019-08-23 11:17:39 +090071type testCustomizer func(fs map[string][]byte, config android.Config)
72
73func withFiles(files map[string][]byte) testCustomizer {
74 return func(fs map[string][]byte, config android.Config) {
75 for k, v := range files {
76 fs[k] = v
77 }
78 }
79}
80
81func withTargets(targets map[android.OsType][]android.Target) testCustomizer {
82 return func(fs map[string][]byte, config android.Config) {
83 for k, v := range targets {
84 config.Targets[k] = v
85 }
86 }
87}
88
Jooyung Han35155c42020-02-06 17:33:20 +090089// withNativeBridgeTargets sets configuration with targets including:
90// - X86_64 (primary)
91// - X86 (secondary)
92// - Arm64 on X86_64 (native bridge)
93// - Arm on X86 (native bridge)
Sasha Smundak18d98bc2020-05-27 16:36:07 -070094func withNativeBridgeEnabled(_ map[string][]byte, config android.Config) {
Jooyung Han35155c42020-02-06 17:33:20 +090095 config.Targets[android.Android] = []android.Target{
96 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
97 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
101 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
104 }
105}
106
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900107func withManifestPackageNameOverrides(specs []string) testCustomizer {
108 return func(fs map[string][]byte, config android.Config) {
109 config.TestProductVariables.ManifestPackageNameOverrides = specs
110 }
111}
112
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700113func withBinder32bit(_ map[string][]byte, config android.Config) {
Jooyung Han31c470b2019-10-18 16:26:59 +0900114 config.TestProductVariables.Binder32bit = proptools.BoolPtr(true)
115}
116
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700117func withUnbundledBuild(_ map[string][]byte, config android.Config) {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900118 config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
119}
120
Paul Duffina02cae32021-03-09 01:44:06 +0000121var emptyFixtureFactory = android.NewFixtureFactory(&buildDir)
122
Paul Duffin37aad602021-03-08 09:47:16 +0000123var apexFixtureFactory = android.NewFixtureFactory(
124 &buildDir,
125 // General preparers in alphabetical order as test infrastructure will enforce correct
126 // registration order.
127 android.PrepareForTestWithAndroidBuildComponents,
128 bpf.PrepareForTestWithBpf,
129 cc.PrepareForTestWithCcBuildComponents,
130 java.PrepareForTestWithJavaDefaultModules,
131 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
132 rust.PrepareForTestWithRustDefaultModules,
133 sh.PrepareForTestWithShBuildComponents,
134
135 PrepareForTestWithApexBuildComponents,
136
137 // Additional apex test specific preparers.
138 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
139 filegroup {
140 name: "myapex-file_contexts",
141 srcs: [
142 "apex/myapex-file_contexts",
143 ],
144 }
145 `),
146 android.FixtureMergeMockFs(android.MockFS{
147 "a.java": nil,
148 "PrebuiltAppFoo.apk": nil,
149 "PrebuiltAppFooPriv.apk": nil,
150 "build/make/target/product/security": nil,
151 "apex_manifest.json": nil,
152 "AndroidManifest.xml": nil,
153 "system/sepolicy/apex/myapex-file_contexts": nil,
154 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
155 "system/sepolicy/apex/myapex2-file_contexts": nil,
156 "system/sepolicy/apex/otherapex-file_contexts": nil,
157 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
158 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
159 "mylib.cpp": nil,
160 "mytest.cpp": nil,
161 "mytest1.cpp": nil,
162 "mytest2.cpp": nil,
163 "mytest3.cpp": nil,
164 "myprebuilt": nil,
165 "my_include": nil,
166 "foo/bar/MyClass.java": nil,
167 "prebuilt.jar": nil,
168 "prebuilt.so": nil,
169 "vendor/foo/devkeys/test.x509.pem": nil,
170 "vendor/foo/devkeys/test.pk8": nil,
171 "testkey.x509.pem": nil,
172 "testkey.pk8": nil,
173 "testkey.override.x509.pem": nil,
174 "testkey.override.pk8": nil,
175 "vendor/foo/devkeys/testkey.avbpubkey": nil,
176 "vendor/foo/devkeys/testkey.pem": nil,
177 "NOTICE": nil,
178 "custom_notice": nil,
179 "custom_notice_for_static_lib": nil,
180 "testkey2.avbpubkey": nil,
181 "testkey2.pem": nil,
182 "myapex-arm64.apex": nil,
183 "myapex-arm.apex": nil,
184 "myapex.apks": nil,
185 "frameworks/base/api/current.txt": nil,
186 "framework/aidl/a.aidl": nil,
187 "build/make/core/proguard.flags": nil,
188 "build/make/core/proguard_basic_keeps.flags": nil,
189 "dummy.txt": nil,
190 "baz": nil,
191 "bar/baz": nil,
192 "testdata/baz": nil,
193 "AppSet.apks": nil,
194 "foo.rs": nil,
195 "libfoo.jar": nil,
196 "libbar.jar": nil,
197 },
198 ),
199
200 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
201 variables.DeviceVndkVersion = proptools.StringPtr("current")
202 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
203 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
204 variables.Platform_sdk_codename = proptools.StringPtr("Q")
205 variables.Platform_sdk_final = proptools.BoolPtr(false)
206 variables.Platform_version_active_codenames = []string{"Q"}
207 variables.Platform_vndk_version = proptools.StringPtr("VER")
208 }),
209)
210
Paul Duffine05480a2021-03-08 15:07:14 +0000211func testApexFixtureFactory(bp string, handlers []testCustomizer) android.FixtureFactory {
212 factory := apexFixtureFactory.Extend(
213 android.FixtureCustomPreparer(func(fixture android.Fixture) {
214 for _, handler := range handlers {
215 handler(fixture.MockFS(), fixture.Config())
216 }
217 }),
218 )
219 if bp != "" {
220 factory = factory.Extend(android.FixtureWithRootAndroidBp(bp))
Jooyung Han344d5432019-08-23 11:17:39 +0900221 }
Paul Duffine05480a2021-03-08 15:07:14 +0000222 return factory
Jiyong Park25fc6a92018-11-18 18:02:45 +0900223}
224
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700225func setUp() {
226 var err error
227 buildDir, err = ioutil.TempDir("", "soong_apex_test")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900228 if err != nil {
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700229 panic(err)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900230 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900231}
232
Jaewoong Jungc1001ec2019-06-25 11:20:53 -0700233func tearDown() {
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700234 _ = os.RemoveAll(buildDir)
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235}
236
Jooyung Han643adc42020-02-27 13:50:06 +0900237// ensure that 'result' equals 'expected'
238func ensureEquals(t *testing.T, result string, expected string) {
239 t.Helper()
240 if result != expected {
241 t.Errorf("%q != %q", expected, result)
242 }
243}
244
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245// ensure that 'result' contains 'expected'
246func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900247 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900248 if !strings.Contains(result, expected) {
249 t.Errorf("%q is not found in %q", expected, result)
250 }
251}
252
Liz Kammer5bd365f2020-05-27 15:15:11 -0700253// ensure that 'result' contains 'expected' exactly one time
254func ensureContainsOnce(t *testing.T, result string, expected string) {
255 t.Helper()
256 count := strings.Count(result, expected)
257 if count != 1 {
258 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
259 }
260}
261
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262// ensures that 'result' does not contain 'notExpected'
263func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265 if strings.Contains(result, notExpected) {
266 t.Errorf("%q is found in %q", notExpected, result)
267 }
268}
269
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700270func ensureMatches(t *testing.T, result string, expectedRex string) {
271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900282 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283 if !android.InList(expected, result) {
284 t.Errorf("%q is not found in %v", expected, result)
285 }
286}
287
288func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if android.InList(notExpected, result) {
291 t.Errorf("%q is found in %v", notExpected, result)
292 }
293}
294
Jooyung Hane1633032019-08-01 17:41:43 +0900295func ensureListEmpty(t *testing.T, result []string) {
296 t.Helper()
297 if len(result) > 0 {
298 t.Errorf("%q is expected to be empty", result)
299 }
300}
301
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000302func ensureListNotEmpty(t *testing.T, result []string) {
303 t.Helper()
304 if len(result) == 0 {
305 t.Errorf("%q is expected to be not empty", result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// Minimal test
310func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800311 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900312 apex_defaults {
313 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900314 manifest: ":myapex.manifest",
315 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900318 native_shared_libs: [
319 "mylib",
320 "libfoo.ffi",
321 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900322 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800323 multilib: {
324 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800326 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900327 },
Jiyong Park77acec62020-06-01 21:39:15 +0900328 java_libs: [
329 "myjar",
330 "myjar_dex",
331 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000332 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333 }
334
Jiyong Park30ca9372019-02-07 16:27:23 +0900335 apex {
336 name: "myapex",
337 defaults: ["myapex-defaults"],
338 }
339
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 apex_key {
341 name: "myapex.key",
342 public_key: "testkey.avbpubkey",
343 private_key: "testkey.pem",
344 }
345
Jiyong Park809bb722019-02-13 21:33:49 +0900346 filegroup {
347 name: "myapex.manifest",
348 srcs: ["apex_manifest.json"],
349 }
350
351 filegroup {
352 name: "myapex.androidmanifest",
353 srcs: ["AndroidManifest.xml"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 cc_library {
357 name: "mylib",
358 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900359 shared_libs: [
360 "mylib2",
361 "libbar.ffi",
362 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 system_shared_libs: [],
364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000365 // TODO: remove //apex_available:platform
366 apex_available: [
367 "//apex_available:platform",
368 "myapex",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 }
371
Alex Light3d673592019-01-18 14:37:31 -0800372 cc_binary {
373 name: "foo",
374 srcs: ["mylib.cpp"],
375 compile_multilib: "both",
376 multilib: {
377 lib32: {
378 suffix: "32",
379 },
380 lib64: {
381 suffix: "64",
382 },
383 },
384 symlinks: ["foo_link_"],
385 symlink_preferred_arch: true,
386 system_shared_libs: [],
387 static_executable: true,
388 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700389 apex_available: [ "myapex", "com.android.gki.*" ],
390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
396 dylibs: ["libfoo.dylib.rust"],
397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
405 }
406
407 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000408 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
412 }
413
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900414 rust_ffi_shared {
415 name: "libfoo.ffi",
416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
421 rust_ffi_shared {
422 name: "libbar.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "bar",
425 apex_available: ["myapex"],
426 }
427
Yifan Hongd22a84a2020-07-28 17:37:46 -0700428 apex {
429 name: "com.android.gki.fake",
430 binaries: ["foo"],
431 key: "myapex.key",
432 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000433 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800434 }
435
Paul Duffindddd5462020-04-07 15:25:44 +0100436 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900437 name: "mylib2",
438 srcs: ["mylib.cpp"],
439 system_shared_libs: [],
440 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900441 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900442 static_libs: ["libstatic"],
443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_prebuilt_library_shared {
451 name: "mylib2",
452 srcs: ["prebuilt.so"],
453 // TODO: remove //apex_available:platform
454 apex_available: [
455 "//apex_available:platform",
456 "myapex",
457 ],
458 }
459
Jiyong Park9918e1a2020-03-17 19:16:40 +0900460 cc_library_static {
461 name: "libstatic",
462 srcs: ["mylib.cpp"],
463 system_shared_libs: [],
464 stl: "none",
465 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000466 // TODO: remove //apex_available:platform
467 apex_available: [
468 "//apex_available:platform",
469 "myapex",
470 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900471 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900472
473 java_library {
474 name: "myjar",
475 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900476 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 sdk_version: "none",
478 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900480 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000481 // TODO: remove //apex_available:platform
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900486 }
487
Jiyong Park77acec62020-06-01 21:39:15 +0900488 dex_import {
489 name: "myjar_dex",
490 jars: ["prebuilt.jar"],
491 apex_available: [
492 "//apex_available:platform",
493 "myapex",
494 ],
495 }
496
Jiyong Park7f7766d2019-07-25 22:02:35 +0900497 java_library {
498 name: "myotherjar",
499 srcs: ["foo/bar/MyClass.java"],
500 sdk_version: "none",
501 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900502 // TODO: remove //apex_available:platform
503 apex_available: [
504 "//apex_available:platform",
505 "myapex",
506 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900507 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900508
509 java_library {
510 name: "mysharedjar",
511 srcs: ["foo/bar/MyClass.java"],
512 sdk_version: "none",
513 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900514 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900515 `)
516
Sundong Ahnabb64432019-10-22 13:58:29 +0900517 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900518
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 // Make sure that Android.mk is created
520 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700521 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900522 var builder strings.Builder
523 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
524
525 androidMk := builder.String()
526 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
527 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
528
Jiyong Park42cca6c2019-04-01 11:15:50 +0900529 optFlags := apexRule.Args["opt_flags"]
530 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700531 // Ensure that the NOTICE output is being packaged as an asset.
Sundong Ahnabb64432019-10-22 13:58:29 +0900532 ensureContains(t, optFlags, "--assets_dir "+buildDir+"/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900533
Jiyong Park25fc6a92018-11-18 18:02:45 +0900534 copyCmds := apexRule.Args["copy_commands"]
535
536 // Ensure that main rule creates an output
537 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
538
539 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
542 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700547 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800554 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
555 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900556 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900557 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900558 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900561 // .. but not for java libs
562 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900563 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800564
Colin Cross7113d202019-11-20 16:39:12 -0800565 // Ensure that the platform variant ends with _shared or _common
566 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
567 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900568 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
569 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900570 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
571
572 // Ensure that dynamic dependency to java libs are not included
573 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800574
575 // Ensure that all symlinks are present.
576 found_foo_link_64 := false
577 found_foo := false
578 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900579 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800580 if strings.HasSuffix(cmd, "bin/foo") {
581 found_foo = true
582 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
583 found_foo_link_64 = true
584 }
585 }
586 }
587 good := found_foo && found_foo_link_64
588 if !good {
589 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
590 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900591
Sundong Ahnabb64432019-10-22 13:58:29 +0900592 mergeNoticesRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("mergeNoticesRule")
Jaewoong Jung5b425e22019-06-17 17:40:56 -0700593 noticeInputs := mergeNoticesRule.Inputs.Strings()
Jiyong Park9918e1a2020-03-17 19:16:40 +0900594 if len(noticeInputs) != 3 {
595 t.Errorf("number of input notice files: expected = 3, actual = %q", len(noticeInputs))
Jiyong Park52818fc2019-03-18 12:01:38 +0900596 }
597 ensureListContains(t, noticeInputs, "NOTICE")
598 ensureListContains(t, noticeInputs, "custom_notice")
Jiyong Park9918e1a2020-03-17 19:16:40 +0900599 ensureListContains(t, noticeInputs, "custom_notice_for_static_lib")
Jiyong Park83dc74b2020-01-14 18:38:44 +0900600
Artur Satayeva8bd1132020-04-27 18:07:06 +0100601 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
604 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
605 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100606
607 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800612}
613
Jooyung Hanf21c7972019-12-16 22:32:06 +0900614func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800615 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900616 apex_defaults {
617 name: "myapex-defaults",
618 key: "myapex.key",
619 prebuilts: ["myetc"],
620 native_shared_libs: ["mylib"],
621 java_libs: ["myjar"],
622 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900623 rros: ["rro"],
markchien2f59ec92020-09-02 16:23:38 +0800624 bpfs: ["bpf"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000625 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900626 }
627
628 prebuilt_etc {
629 name: "myetc",
630 src: "myprebuilt",
631 }
632
633 apex {
634 name: "myapex",
635 defaults: ["myapex-defaults"],
636 }
637
638 apex_key {
639 name: "myapex.key",
640 public_key: "testkey.avbpubkey",
641 private_key: "testkey.pem",
642 }
643
644 cc_library {
645 name: "mylib",
646 system_shared_libs: [],
647 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 java_library {
652 name: "myjar",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
658
659 android_app {
660 name: "AppFoo",
661 srcs: ["foo/bar/MyClass.java"],
662 sdk_version: "none",
663 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000664 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900665 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900666
667 runtime_resource_overlay {
668 name: "rro",
669 theme: "blue",
670 }
671
markchien2f59ec92020-09-02 16:23:38 +0800672 bpf {
673 name: "bpf",
674 srcs: ["bpf.c", "bpf2.c"],
675 }
676
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000678 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900679 "etc/myetc",
680 "javalib/myjar.jar",
681 "lib64/mylib.so",
682 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900683 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800684 "etc/bpf/bpf.o",
685 "etc/bpf/bpf2.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 })
687}
688
Jooyung Han01a3ee22019-11-02 02:52:25 +0900689func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
704 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Alex Light5098a612018-11-29 17:12:15 -0800711func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800712 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800713 apex {
714 name: "myapex",
715 key: "myapex.key",
716 payload_type: "zip",
717 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000718 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800719 }
720
721 apex_key {
722 name: "myapex.key",
723 public_key: "testkey.avbpubkey",
724 private_key: "testkey.pem",
725 }
726
727 cc_library {
728 name: "mylib",
729 srcs: ["mylib.cpp"],
730 shared_libs: ["mylib2"],
731 system_shared_libs: [],
732 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000733 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800734 }
735
736 cc_library {
737 name: "mylib2",
738 srcs: ["mylib.cpp"],
739 system_shared_libs: [],
740 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000741 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800742 }
743 `)
744
Sundong Ahnabb64432019-10-22 13:58:29 +0900745 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800746 copyCmds := zipApexRule.Args["copy_commands"]
747
748 // Ensure that main rule creates an output
749 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
750
751 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700752 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800753
754 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700755 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800756
757 // Ensure that both direct and indirect deps are copied into apex
758 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
759 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900760}
761
762func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800763 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900764 apex {
765 name: "myapex",
766 key: "myapex.key",
767 native_shared_libs: ["mylib", "mylib3"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000768 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900769 }
770
771 apex_key {
772 name: "myapex.key",
773 public_key: "testkey.avbpubkey",
774 private_key: "testkey.pem",
775 }
776
777 cc_library {
778 name: "mylib",
779 srcs: ["mylib.cpp"],
780 shared_libs: ["mylib2", "mylib3"],
781 system_shared_libs: [],
782 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000783 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900784 }
785
786 cc_library {
787 name: "mylib2",
788 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900789 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900790 system_shared_libs: [],
791 stl: "none",
792 stubs: {
793 versions: ["1", "2", "3"],
794 },
795 }
796
797 cc_library {
798 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900799 srcs: ["mylib.cpp"],
800 shared_libs: ["mylib4"],
801 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900802 stl: "none",
803 stubs: {
804 versions: ["10", "11", "12"],
805 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000806 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900807 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900808
809 cc_library {
810 name: "mylib4",
811 srcs: ["mylib.cpp"],
812 system_shared_libs: [],
813 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000814 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900815 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900816 `)
817
Sundong Ahnabb64432019-10-22 13:58:29 +0900818 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900819 copyCmds := apexRule.Args["copy_commands"]
820
821 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800822 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900823
824 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800825 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826
827 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800828 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900829
Colin Crossaede88c2020-08-11 12:17:01 -0700830 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900831
832 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900833 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_3/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900835 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900836
837 // 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 -0700838 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900839 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700840 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900841
842 // Ensure that stubs libs are built without -include flags
Jiyong Park0f80c182020-01-31 02:49:53 +0900843 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park64379952018-12-13 18:37:29 +0900844 ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900845
846 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700847 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900848
Jooyung Hana57af4a2020-01-23 05:36:59 +0000849 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900850 "lib64/mylib.so",
851 "lib64/mylib3.so",
852 "lib64/mylib4.so",
853 })
Jiyong Park25fc6a92018-11-18 18:02:45 +0900854}
855
Colin Cross7812fd32020-09-25 12:35:10 -0700856func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
857 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800858 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -0700859 apex {
860 name: "myapex",
861 key: "myapex.key",
862 native_shared_libs: ["mylib", "mylib3"],
863 min_sdk_version: "29",
864 }
865
866 apex_key {
867 name: "myapex.key",
868 public_key: "testkey.avbpubkey",
869 private_key: "testkey.pem",
870 }
871
872 cc_library {
873 name: "mylib",
874 srcs: ["mylib.cpp"],
875 shared_libs: ["mylib2", "mylib3"],
876 system_shared_libs: [],
877 stl: "none",
878 apex_available: [ "myapex" ],
879 min_sdk_version: "28",
880 }
881
882 cc_library {
883 name: "mylib2",
884 srcs: ["mylib.cpp"],
885 cflags: ["-include mylib.h"],
886 system_shared_libs: [],
887 stl: "none",
888 stubs: {
889 versions: ["28", "29", "30", "current"],
890 },
891 min_sdk_version: "28",
892 }
893
894 cc_library {
895 name: "mylib3",
896 srcs: ["mylib.cpp"],
897 shared_libs: ["mylib4"],
898 system_shared_libs: [],
899 stl: "none",
900 stubs: {
901 versions: ["28", "29", "30", "current"],
902 },
903 apex_available: [ "myapex" ],
904 min_sdk_version: "28",
905 }
906
907 cc_library {
908 name: "mylib4",
909 srcs: ["mylib.cpp"],
910 system_shared_libs: [],
911 stl: "none",
912 apex_available: [ "myapex" ],
913 min_sdk_version: "28",
914 }
915 `)
916
917 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
918 copyCmds := apexRule.Args["copy_commands"]
919
920 // Ensure that direct non-stubs dep is always included
921 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
922
923 // Ensure that indirect stubs dep is not included
924 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
925
926 // Ensure that direct stubs dep is included
927 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
928
929 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
930
Jiyong Park55549df2021-02-26 23:57:23 +0900931 // Ensure that mylib is linking with the latest version of stub for mylib2
932 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -0700933 // ... and not linking to the non-stub (impl) variant of mylib2
934 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
935
936 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
937 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
938 // .. and not linking to the stubs variant of mylib3
939 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
940
941 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -0700942 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -0700943 ensureNotContains(t, mylib2Cflags, "-include ")
944
945 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700946 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -0700947
948 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
949 "lib64/mylib.so",
950 "lib64/mylib3.so",
951 "lib64/mylib4.so",
952 })
953}
954
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900955func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
956 t.Parallel()
957 // myapex (Z)
958 // mylib -----------------.
959 // |
960 // otherapex (29) |
961 // libstub's versions: 29 Z current
962 // |
963 // <platform> |
964 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -0800965 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +0900966 apex {
967 name: "myapex",
968 key: "myapex.key",
969 native_shared_libs: ["mylib"],
970 min_sdk_version: "Z", // non-final
971 }
972
973 cc_library {
974 name: "mylib",
975 srcs: ["mylib.cpp"],
976 shared_libs: ["libstub"],
977 apex_available: ["myapex"],
978 min_sdk_version: "Z",
979 }
980
981 apex_key {
982 name: "myapex.key",
983 public_key: "testkey.avbpubkey",
984 private_key: "testkey.pem",
985 }
986
987 apex {
988 name: "otherapex",
989 key: "myapex.key",
990 native_shared_libs: ["libstub"],
991 min_sdk_version: "29",
992 }
993
994 cc_library {
995 name: "libstub",
996 srcs: ["mylib.cpp"],
997 stubs: {
998 versions: ["29", "Z", "current"],
999 },
1000 apex_available: ["otherapex"],
1001 min_sdk_version: "29",
1002 }
1003
1004 // platform module depending on libstub from otherapex should use the latest stub("current")
1005 cc_library {
1006 name: "libplatform",
1007 srcs: ["mylib.cpp"],
1008 shared_libs: ["libstub"],
1009 }
1010 `, func(fs map[string][]byte, config android.Config) {
1011 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("Z")
1012 config.TestProductVariables.Platform_sdk_final = proptools.BoolPtr(false)
1013 config.TestProductVariables.Platform_version_active_codenames = []string{"Z"}
1014 })
1015
Jiyong Park55549df2021-02-26 23:57:23 +09001016 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001017 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001018 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001019 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001020 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001021
1022 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1023 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1024 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1025 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1026 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1027}
1028
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001029func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001030 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001031 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001032 name: "myapex2",
1033 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001034 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001035 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001036 }
1037
1038 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001039 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001040 public_key: "testkey.avbpubkey",
1041 private_key: "testkey.pem",
1042 }
1043
1044 cc_library {
1045 name: "mylib",
1046 srcs: ["mylib.cpp"],
1047 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001048 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001049 system_shared_libs: [],
1050 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001051 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001052 }
1053
1054 cc_library {
1055 name: "libfoo",
1056 srcs: ["mylib.cpp"],
1057 shared_libs: ["libbar"],
1058 system_shared_libs: [],
1059 stl: "none",
1060 stubs: {
1061 versions: ["10", "20", "30"],
1062 },
1063 }
1064
1065 cc_library {
1066 name: "libbar",
1067 srcs: ["mylib.cpp"],
1068 system_shared_libs: [],
1069 stl: "none",
1070 }
1071
Jiyong Park678c8812020-02-07 17:25:49 +09001072 cc_library_static {
1073 name: "libbaz",
1074 srcs: ["mylib.cpp"],
1075 system_shared_libs: [],
1076 stl: "none",
1077 apex_available: [ "myapex2" ],
1078 }
1079
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001080 `)
1081
Jiyong Park83dc74b2020-01-14 18:38:44 +09001082 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001083 copyCmds := apexRule.Args["copy_commands"]
1084
1085 // Ensure that direct non-stubs dep is always included
1086 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1087
1088 // Ensure that indirect stubs dep is not included
1089 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1090
1091 // Ensure that dependency of stubs is not included
1092 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1093
Colin Crossaede88c2020-08-11 12:17:01 -07001094 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001095
1096 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001097 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001098 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001099 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001100
Jiyong Park3ff16992019-12-27 14:11:47 +09001101 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001102
1103 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1104 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001105
Artur Satayeva8bd1132020-04-27 18:07:06 +01001106 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001107 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001108
Artur Satayeva8bd1132020-04-27 18:07:06 +01001109 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001110 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001111}
1112
Jooyung Hand3639552019-08-09 12:57:43 +09001113func TestApexWithRuntimeLibsDependency(t *testing.T) {
1114 /*
1115 myapex
1116 |
1117 v (runtime_libs)
1118 mylib ------+------> libfoo [provides stub]
1119 |
1120 `------> libbar
1121 */
Colin Cross1c460562021-02-16 17:55:47 -08001122 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001123 apex {
1124 name: "myapex",
1125 key: "myapex.key",
1126 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001127 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001128 }
1129
1130 apex_key {
1131 name: "myapex.key",
1132 public_key: "testkey.avbpubkey",
1133 private_key: "testkey.pem",
1134 }
1135
1136 cc_library {
1137 name: "mylib",
1138 srcs: ["mylib.cpp"],
1139 runtime_libs: ["libfoo", "libbar"],
1140 system_shared_libs: [],
1141 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001142 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001143 }
1144
1145 cc_library {
1146 name: "libfoo",
1147 srcs: ["mylib.cpp"],
1148 system_shared_libs: [],
1149 stl: "none",
1150 stubs: {
1151 versions: ["10", "20", "30"],
1152 },
1153 }
1154
1155 cc_library {
1156 name: "libbar",
1157 srcs: ["mylib.cpp"],
1158 system_shared_libs: [],
1159 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001160 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001161 }
1162
1163 `)
1164
Sundong Ahnabb64432019-10-22 13:58:29 +09001165 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001166 copyCmds := apexRule.Args["copy_commands"]
1167
1168 // Ensure that direct non-stubs dep is always included
1169 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1170
1171 // Ensure that indirect stubs dep is not included
1172 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1173
1174 // Ensure that runtime_libs dep in included
1175 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1176
Sundong Ahnabb64432019-10-22 13:58:29 +09001177 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001178 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1179 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001180
1181}
1182
Paul Duffina02cae32021-03-09 01:44:06 +00001183var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1184 cc.PrepareForTestWithCcBuildComponents,
1185 PrepareForTestWithApexBuildComponents,
1186 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001187 apex {
1188 name: "com.android.runtime",
1189 key: "com.android.runtime.key",
1190 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001191 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001192 }
1193
1194 apex_key {
1195 name: "com.android.runtime.key",
1196 public_key: "testkey.avbpubkey",
1197 private_key: "testkey.pem",
1198 }
Paul Duffina02cae32021-03-09 01:44:06 +00001199 `),
1200 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1201)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001202
Paul Duffina02cae32021-03-09 01:44:06 +00001203func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
1204 result := emptyFixtureFactory.Extend(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001205 cc_library {
1206 name: "libc",
1207 no_libcrt: true,
1208 nocrt: true,
1209 stl: "none",
1210 system_shared_libs: [],
1211 stubs: { versions: ["1"] },
1212 apex_available: ["com.android.runtime"],
1213
1214 sanitize: {
1215 hwaddress: true,
1216 }
1217 }
1218
1219 cc_prebuilt_library_shared {
1220 name: "libclang_rt.hwasan-aarch64-android",
1221 no_libcrt: true,
1222 nocrt: true,
1223 stl: "none",
1224 system_shared_libs: [],
1225 srcs: [""],
1226 stubs: { versions: ["1"] },
1227
1228 sanitize: {
1229 never: true,
1230 },
Paul Duffina02cae32021-03-09 01:44:06 +00001231 } `)
1232 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001233
1234 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1235 "lib64/bionic/libc.so",
1236 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1237 })
1238
1239 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1240
1241 installed := hwasan.Description("install libclang_rt.hwasan")
1242 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1243
1244 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1245 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1246 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1247}
1248
1249func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffina02cae32021-03-09 01:44:06 +00001250 result := emptyFixtureFactory.Extend(
1251 prepareForTestOfRuntimeApexWithHwasan,
1252 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1253 variables.SanitizeDevice = []string{"hwaddress"}
1254 }),
1255 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001256 cc_library {
1257 name: "libc",
1258 no_libcrt: true,
1259 nocrt: true,
1260 stl: "none",
1261 system_shared_libs: [],
1262 stubs: { versions: ["1"] },
1263 apex_available: ["com.android.runtime"],
1264 }
1265
1266 cc_prebuilt_library_shared {
1267 name: "libclang_rt.hwasan-aarch64-android",
1268 no_libcrt: true,
1269 nocrt: true,
1270 stl: "none",
1271 system_shared_libs: [],
1272 srcs: [""],
1273 stubs: { versions: ["1"] },
1274
1275 sanitize: {
1276 never: true,
1277 },
1278 }
Paul Duffina02cae32021-03-09 01:44:06 +00001279 `)
1280 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001281
1282 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1283 "lib64/bionic/libc.so",
1284 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1285 })
1286
1287 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1288
1289 installed := hwasan.Description("install libclang_rt.hwasan")
1290 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1291
1292 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1293 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1294 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1295}
1296
Jooyung Han61b66e92020-03-21 14:21:46 +00001297func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1298 testcases := []struct {
1299 name string
1300 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001301 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001302 shouldLink string
1303 shouldNotLink []string
1304 }{
1305 {
Jiyong Park55549df2021-02-26 23:57:23 +09001306 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001307 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001308 apexVariant: "apex10000",
Jooyung Han61b66e92020-03-21 14:21:46 +00001309 shouldLink: "30",
1310 shouldNotLink: []string{"29"},
1311 },
1312 {
Jiyong Park55549df2021-02-26 23:57:23 +09001313 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001314 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001315 apexVariant: "apex29",
Jiyong Park55549df2021-02-26 23:57:23 +09001316 shouldLink: "30",
1317 shouldNotLink: []string{"29"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001318 },
1319 }
1320 for _, tc := range testcases {
1321 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001322 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001323 apex {
1324 name: "myapex",
1325 key: "myapex.key",
1326 use_vendor: true,
1327 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001328 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001329 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001330 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001331
Jooyung Han61b66e92020-03-21 14:21:46 +00001332 apex_key {
1333 name: "myapex.key",
1334 public_key: "testkey.avbpubkey",
1335 private_key: "testkey.pem",
1336 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001337
Jooyung Han61b66e92020-03-21 14:21:46 +00001338 cc_library {
1339 name: "mylib",
1340 srcs: ["mylib.cpp"],
1341 vendor_available: true,
1342 shared_libs: ["libbar"],
1343 system_shared_libs: [],
1344 stl: "none",
1345 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001346 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001347 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001348
Jooyung Han61b66e92020-03-21 14:21:46 +00001349 cc_library {
1350 name: "libbar",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
1354 stubs: { versions: ["29","30"] },
Colin Cross0477b422020-10-13 18:43:54 -07001355 llndk_stubs: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001356 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001357
Jooyung Han61b66e92020-03-21 14:21:46 +00001358 llndk_library {
Colin Cross0477b422020-10-13 18:43:54 -07001359 name: "libbar.llndk",
Jooyung Han61b66e92020-03-21 14:21:46 +00001360 symbol_file: "",
1361 }
1362 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07001363 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Han61b66e92020-03-21 14:21:46 +00001364 }, withUnbundledBuild)
Jooyung Han9c80bae2019-08-20 17:30:57 +09001365
Jooyung Han61b66e92020-03-21 14:21:46 +00001366 // Ensure that LLNDK dep is not included
1367 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1368 "lib64/mylib.so",
1369 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001370
Jooyung Han61b66e92020-03-21 14:21:46 +00001371 // Ensure that LLNDK dep is required
1372 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1373 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1374 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001375
Colin Crossaede88c2020-08-11 12:17:01 -07001376 mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
Colin Cross127bb8b2020-12-16 16:46:01 -08001377 ensureContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001378 for _, ver := range tc.shouldNotLink {
Colin Cross127bb8b2020-12-16 16:46:01 -08001379 ensureNotContains(t, mylibLdFlags, "libbar/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001380 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001381
Colin Crossaede88c2020-08-11 12:17:01 -07001382 mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jooyung Han61b66e92020-03-21 14:21:46 +00001383 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink)
1384 })
1385 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001386}
1387
Jiyong Park25fc6a92018-11-18 18:02:45 +09001388func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001389 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001390 apex {
1391 name: "myapex",
1392 key: "myapex.key",
1393 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001394 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001395 }
1396
1397 apex_key {
1398 name: "myapex.key",
1399 public_key: "testkey.avbpubkey",
1400 private_key: "testkey.pem",
1401 }
1402
1403 cc_library {
1404 name: "mylib",
1405 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001406 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001407 shared_libs: ["libdl#27"],
1408 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001409 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001410 }
1411
1412 cc_library_shared {
1413 name: "mylib_shared",
1414 srcs: ["mylib.cpp"],
1415 shared_libs: ["libdl#27"],
1416 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001417 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001418 }
1419
1420 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001421 name: "libBootstrap",
1422 srcs: ["mylib.cpp"],
1423 stl: "none",
1424 bootstrap: true,
1425 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001426 `)
1427
Sundong Ahnabb64432019-10-22 13:58:29 +09001428 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001429 copyCmds := apexRule.Args["copy_commands"]
1430
1431 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001432 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001433 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1434 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001435
1436 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001437 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001438
Colin Crossaede88c2020-08-11 12:17:01 -07001439 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1440 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1441 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001442
1443 // For dependency to libc
1444 // Ensure that mylib is linking with the latest version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001445 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_29/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001446 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001447 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001448 // ... Cflags from stub is correctly exported to mylib
1449 ensureContains(t, mylibCFlags, "__LIBC_API__=29")
1450 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=29")
1451
1452 // For dependency to libm
1453 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001454 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001455 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001456 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001457 // ... and is not compiling with the stub
1458 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1459 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1460
1461 // For dependency to libdl
1462 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001463 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001464 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001465 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1466 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001467 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001468 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001469 // ... Cflags from stub is correctly exported to mylib
1470 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1471 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001472
1473 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001474 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1475 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1476 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1477 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001478}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001479
Jooyung Han749dc692020-04-15 11:03:39 +09001480func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001481 // there are three links between liba --> libz.
1482 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001483 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001484 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001485 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001486 apex {
1487 name: "myapex",
1488 key: "myapex.key",
1489 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001490 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001491 }
1492
1493 apex {
1494 name: "otherapex",
1495 key: "myapex.key",
1496 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001497 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001498 }
1499
1500 apex_key {
1501 name: "myapex.key",
1502 public_key: "testkey.avbpubkey",
1503 private_key: "testkey.pem",
1504 }
1505
1506 cc_library {
1507 name: "libx",
1508 shared_libs: ["liba"],
1509 system_shared_libs: [],
1510 stl: "none",
1511 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001512 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001513 }
1514
1515 cc_library {
1516 name: "liby",
1517 shared_libs: ["liba"],
1518 system_shared_libs: [],
1519 stl: "none",
1520 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001521 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001522 }
1523
1524 cc_library {
1525 name: "liba",
1526 shared_libs: ["libz"],
1527 system_shared_libs: [],
1528 stl: "none",
1529 apex_available: [
1530 "//apex_available:anyapex",
1531 "//apex_available:platform",
1532 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001533 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001534 }
1535
1536 cc_library {
1537 name: "libz",
1538 system_shared_libs: [],
1539 stl: "none",
1540 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001541 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001542 },
1543 }
Jooyung Han749dc692020-04-15 11:03:39 +09001544 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001545
1546 expectLink := func(from, from_variant, to, to_variant string) {
1547 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1548 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1549 }
1550 expectNoLink := func(from, from_variant, to, to_variant string) {
1551 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1552 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1553 }
1554 // platform liba is linked to non-stub version
1555 expectLink("liba", "shared", "libz", "shared")
Jiyong Park55549df2021-02-26 23:57:23 +09001556 // liba in myapex is linked to #30
1557 expectLink("liba", "shared_apex29", "libz", "shared_30")
1558 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001559 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jooyung Han749dc692020-04-15 11:03:39 +09001560 // liba in otherapex is linked to #30
Colin Crossaede88c2020-08-11 12:17:01 -07001561 expectLink("liba", "shared_apex30", "libz", "shared_30")
1562 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1563 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001564}
1565
Jooyung Hanaed150d2020-04-02 01:41:41 +09001566func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001567 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001568 apex {
1569 name: "myapex",
1570 key: "myapex.key",
1571 native_shared_libs: ["libx"],
1572 min_sdk_version: "R",
1573 }
1574
1575 apex_key {
1576 name: "myapex.key",
1577 public_key: "testkey.avbpubkey",
1578 private_key: "testkey.pem",
1579 }
1580
1581 cc_library {
1582 name: "libx",
1583 shared_libs: ["libz"],
1584 system_shared_libs: [],
1585 stl: "none",
1586 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001587 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001588 }
1589
1590 cc_library {
1591 name: "libz",
1592 system_shared_libs: [],
1593 stl: "none",
1594 stubs: {
1595 versions: ["29", "R"],
1596 },
1597 }
1598 `, func(fs map[string][]byte, config android.Config) {
1599 config.TestProductVariables.Platform_version_active_codenames = []string{"R"}
1600 })
1601
1602 expectLink := func(from, from_variant, to, to_variant string) {
1603 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1604 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1605 }
1606 expectNoLink := func(from, from_variant, to, to_variant string) {
1607 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1608 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1609 }
Dan Albertc8060532020-07-22 22:32:17 -07001610 expectLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001611 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1612 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001613}
1614
Jooyung Han749dc692020-04-15 11:03:39 +09001615func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001616 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001617 apex {
1618 name: "myapex",
1619 key: "myapex.key",
1620 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001621 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001622 }
1623
1624 apex_key {
1625 name: "myapex.key",
1626 public_key: "testkey.avbpubkey",
1627 private_key: "testkey.pem",
1628 }
1629
1630 cc_library {
1631 name: "libx",
1632 shared_libs: ["libz"],
1633 system_shared_libs: [],
1634 stl: "none",
1635 apex_available: [ "myapex" ],
1636 }
1637
1638 cc_library {
1639 name: "libz",
1640 system_shared_libs: [],
1641 stl: "none",
1642 stubs: {
1643 versions: ["1", "2"],
1644 },
1645 }
1646 `)
1647
1648 expectLink := func(from, from_variant, to, to_variant string) {
1649 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1650 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1651 }
1652 expectNoLink := func(from, from_variant, to, to_variant string) {
1653 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1654 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1655 }
Colin Crossaede88c2020-08-11 12:17:01 -07001656 expectLink("libx", "shared_apex10000", "libz", "shared_2")
1657 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
1658 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001659}
1660
1661func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001662 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001663 apex {
1664 name: "myapex",
1665 key: "myapex.key",
1666 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001667 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001668 }
1669
1670 apex_key {
1671 name: "myapex.key",
1672 public_key: "testkey.avbpubkey",
1673 private_key: "testkey.pem",
1674 }
1675
1676 cc_library {
1677 name: "libx",
1678 system_shared_libs: [],
1679 stl: "none",
1680 apex_available: [ "myapex" ],
1681 stubs: {
1682 versions: ["1", "2"],
1683 },
1684 }
1685
1686 cc_library {
1687 name: "libz",
1688 shared_libs: ["libx"],
1689 system_shared_libs: [],
1690 stl: "none",
1691 }
1692 `)
1693
1694 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001695 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001696 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1697 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1698 }
1699 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001700 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001701 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1702 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1703 }
1704 expectLink("libz", "shared", "libx", "shared_2")
1705 expectNoLink("libz", "shared", "libz", "shared_1")
1706 expectNoLink("libz", "shared", "libz", "shared")
1707}
1708
Jooyung Han75568392020-03-20 04:29:24 +09001709func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001710 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001711 apex {
1712 name: "myapex",
1713 key: "myapex.key",
1714 native_shared_libs: ["libx"],
1715 min_sdk_version: "29",
1716 }
1717
1718 apex_key {
1719 name: "myapex.key",
1720 public_key: "testkey.avbpubkey",
1721 private_key: "testkey.pem",
1722 }
1723
1724 cc_library {
1725 name: "libx",
1726 shared_libs: ["libbar"],
1727 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001728 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001729 }
1730
1731 cc_library {
1732 name: "libbar",
1733 stubs: {
1734 versions: ["29", "30"],
1735 },
1736 }
Jooyung Han75568392020-03-20 04:29:24 +09001737 `, func(fs map[string][]byte, config android.Config) {
1738 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
1739 })
Jooyung Han03b51852020-02-26 22:45:42 +09001740 expectLink := func(from, from_variant, to, to_variant string) {
1741 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
1742 libFlags := ld.Args["libFlags"]
1743 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1744 }
Colin Crossaede88c2020-08-11 12:17:01 -07001745 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_30")
Jooyung Han03b51852020-02-26 22:45:42 +09001746}
1747
Jooyung Han75568392020-03-20 04:29:24 +09001748func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001749 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001750 apex {
1751 name: "myapex",
1752 key: "myapex.key",
1753 native_shared_libs: ["libx"],
1754 min_sdk_version: "29",
1755 }
1756
1757 apex_key {
1758 name: "myapex.key",
1759 public_key: "testkey.avbpubkey",
1760 private_key: "testkey.pem",
1761 }
1762
1763 cc_library {
1764 name: "libx",
1765 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001766 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001767 }
Jooyung Han75568392020-03-20 04:29:24 +09001768 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001769
1770 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07001771 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001772 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001773 // note that platform variant is not.
1774 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08001775 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09001776}
1777
Jooyung Han749dc692020-04-15 11:03:39 +09001778func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
1779 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09001780 apex {
1781 name: "myapex",
1782 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09001783 native_shared_libs: ["mylib"],
1784 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001785 }
1786
1787 apex_key {
1788 name: "myapex.key",
1789 public_key: "testkey.avbpubkey",
1790 private_key: "testkey.pem",
1791 }
Jooyung Han749dc692020-04-15 11:03:39 +09001792
1793 cc_library {
1794 name: "mylib",
1795 srcs: ["mylib.cpp"],
1796 system_shared_libs: [],
1797 stl: "none",
1798 apex_available: [
1799 "myapex",
1800 ],
1801 min_sdk_version: "30",
1802 }
1803 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05001804
1805 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
1806 apex {
1807 name: "myapex",
1808 key: "myapex.key",
1809 native_shared_libs: ["libfoo.ffi"],
1810 min_sdk_version: "29",
1811 }
1812
1813 apex_key {
1814 name: "myapex.key",
1815 public_key: "testkey.avbpubkey",
1816 private_key: "testkey.pem",
1817 }
1818
1819 rust_ffi_shared {
1820 name: "libfoo.ffi",
1821 srcs: ["foo.rs"],
1822 crate_name: "foo",
1823 apex_available: [
1824 "myapex",
1825 ],
1826 min_sdk_version: "30",
1827 }
1828 `)
Jooyung Han749dc692020-04-15 11:03:39 +09001829}
1830
1831func TestApexMinSdkVersion_Okay(t *testing.T) {
1832 testApex(t, `
1833 apex {
1834 name: "myapex",
1835 key: "myapex.key",
1836 native_shared_libs: ["libfoo"],
1837 java_libs: ["libbar"],
1838 min_sdk_version: "29",
1839 }
1840
1841 apex_key {
1842 name: "myapex.key",
1843 public_key: "testkey.avbpubkey",
1844 private_key: "testkey.pem",
1845 }
1846
1847 cc_library {
1848 name: "libfoo",
1849 srcs: ["mylib.cpp"],
1850 shared_libs: ["libfoo_dep"],
1851 apex_available: ["myapex"],
1852 min_sdk_version: "29",
1853 }
1854
1855 cc_library {
1856 name: "libfoo_dep",
1857 srcs: ["mylib.cpp"],
1858 apex_available: ["myapex"],
1859 min_sdk_version: "29",
1860 }
1861
1862 java_library {
1863 name: "libbar",
1864 sdk_version: "current",
1865 srcs: ["a.java"],
1866 static_libs: ["libbar_dep"],
1867 apex_available: ["myapex"],
1868 min_sdk_version: "29",
1869 }
1870
1871 java_library {
1872 name: "libbar_dep",
1873 sdk_version: "current",
1874 srcs: ["a.java"],
1875 apex_available: ["myapex"],
1876 min_sdk_version: "29",
1877 }
Jooyung Han03b51852020-02-26 22:45:42 +09001878 `)
1879}
1880
Artur Satayev8cf899a2020-04-15 17:29:42 +01001881func TestJavaStableSdkVersion(t *testing.T) {
1882 testCases := []struct {
1883 name string
1884 expectedError string
1885 bp string
1886 }{
1887 {
1888 name: "Non-updatable apex with non-stable dep",
1889 bp: `
1890 apex {
1891 name: "myapex",
1892 java_libs: ["myjar"],
1893 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001894 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01001895 }
1896 apex_key {
1897 name: "myapex.key",
1898 public_key: "testkey.avbpubkey",
1899 private_key: "testkey.pem",
1900 }
1901 java_library {
1902 name: "myjar",
1903 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00001904 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001905 apex_available: ["myapex"],
1906 }
1907 `,
1908 },
1909 {
1910 name: "Updatable apex with stable dep",
1911 bp: `
1912 apex {
1913 name: "myapex",
1914 java_libs: ["myjar"],
1915 key: "myapex.key",
1916 updatable: true,
1917 min_sdk_version: "29",
1918 }
1919 apex_key {
1920 name: "myapex.key",
1921 public_key: "testkey.avbpubkey",
1922 private_key: "testkey.pem",
1923 }
1924 java_library {
1925 name: "myjar",
1926 srcs: ["foo/bar/MyClass.java"],
1927 sdk_version: "current",
1928 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09001929 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001930 }
1931 `,
1932 },
1933 {
1934 name: "Updatable apex with non-stable dep",
1935 expectedError: "cannot depend on \"myjar\"",
1936 bp: `
1937 apex {
1938 name: "myapex",
1939 java_libs: ["myjar"],
1940 key: "myapex.key",
1941 updatable: true,
1942 }
1943 apex_key {
1944 name: "myapex.key",
1945 public_key: "testkey.avbpubkey",
1946 private_key: "testkey.pem",
1947 }
1948 java_library {
1949 name: "myjar",
1950 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00001951 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001952 apex_available: ["myapex"],
1953 }
1954 `,
1955 },
1956 {
Paul Duffin043f5e72021-03-05 00:00:01 +00001957 name: "Updatable apex with non-stable transitive dep",
1958 // This is not actually detecting that the transitive dependency is unstable, rather it is
1959 // detecting that the transitive dependency is building against a wider API surface than the
1960 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09001961 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01001962 bp: `
1963 apex {
1964 name: "myapex",
1965 java_libs: ["myjar"],
1966 key: "myapex.key",
1967 updatable: true,
1968 }
1969 apex_key {
1970 name: "myapex.key",
1971 public_key: "testkey.avbpubkey",
1972 private_key: "testkey.pem",
1973 }
1974 java_library {
1975 name: "myjar",
1976 srcs: ["foo/bar/MyClass.java"],
1977 sdk_version: "current",
1978 apex_available: ["myapex"],
1979 static_libs: ["transitive-jar"],
1980 }
1981 java_library {
1982 name: "transitive-jar",
1983 srcs: ["foo/bar/MyClass.java"],
1984 sdk_version: "core_platform",
1985 apex_available: ["myapex"],
1986 }
1987 `,
1988 },
1989 }
1990
1991 for _, test := range testCases {
1992 t.Run(test.name, func(t *testing.T) {
1993 if test.expectedError == "" {
1994 testApex(t, test.bp)
1995 } else {
1996 testApexError(t, test.expectedError, test.bp)
1997 }
1998 })
1999 }
2000}
2001
Jooyung Han749dc692020-04-15 11:03:39 +09002002func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2003 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2004 apex {
2005 name: "myapex",
2006 key: "myapex.key",
2007 native_shared_libs: ["mylib"],
2008 min_sdk_version: "29",
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 cc_library {
2018 name: "mylib",
2019 srcs: ["mylib.cpp"],
2020 shared_libs: ["mylib2"],
2021 system_shared_libs: [],
2022 stl: "none",
2023 apex_available: [
2024 "myapex",
2025 ],
2026 min_sdk_version: "29",
2027 }
2028
2029 // indirect part of the apex
2030 cc_library {
2031 name: "mylib2",
2032 srcs: ["mylib.cpp"],
2033 system_shared_libs: [],
2034 stl: "none",
2035 apex_available: [
2036 "myapex",
2037 ],
2038 min_sdk_version: "30",
2039 }
2040 `)
2041}
2042
2043func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2044 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2045 apex {
2046 name: "myapex",
2047 key: "myapex.key",
2048 apps: ["AppFoo"],
2049 min_sdk_version: "29",
2050 }
2051
2052 apex_key {
2053 name: "myapex.key",
2054 public_key: "testkey.avbpubkey",
2055 private_key: "testkey.pem",
2056 }
2057
2058 android_app {
2059 name: "AppFoo",
2060 srcs: ["foo/bar/MyClass.java"],
2061 sdk_version: "current",
2062 min_sdk_version: "29",
2063 system_modules: "none",
2064 stl: "none",
2065 static_libs: ["bar"],
2066 apex_available: [ "myapex" ],
2067 }
2068
2069 java_library {
2070 name: "bar",
2071 sdk_version: "current",
2072 srcs: ["a.java"],
2073 apex_available: [ "myapex" ],
2074 }
2075 `)
2076}
2077
2078func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002079 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002080 apex {
2081 name: "myapex",
2082 key: "myapex.key",
2083 native_shared_libs: ["mylib"],
2084 min_sdk_version: "29",
2085 }
2086
2087 apex_key {
2088 name: "myapex.key",
2089 public_key: "testkey.avbpubkey",
2090 private_key: "testkey.pem",
2091 }
2092
Jiyong Park55549df2021-02-26 23:57:23 +09002093 // mylib in myapex will link to mylib2#30
Jooyung Han749dc692020-04-15 11:03:39 +09002094 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2095 cc_library {
2096 name: "mylib",
2097 srcs: ["mylib.cpp"],
2098 shared_libs: ["mylib2"],
2099 system_shared_libs: [],
2100 stl: "none",
2101 apex_available: ["myapex", "otherapex"],
2102 min_sdk_version: "29",
2103 }
2104
2105 cc_library {
2106 name: "mylib2",
2107 srcs: ["mylib.cpp"],
2108 system_shared_libs: [],
2109 stl: "none",
2110 apex_available: ["otherapex"],
2111 stubs: { versions: ["29", "30"] },
2112 min_sdk_version: "30",
2113 }
2114
2115 apex {
2116 name: "otherapex",
2117 key: "myapex.key",
2118 native_shared_libs: ["mylib", "mylib2"],
2119 min_sdk_version: "30",
2120 }
2121 `)
2122 expectLink := func(from, from_variant, to, to_variant string) {
2123 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2124 libFlags := ld.Args["libFlags"]
2125 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2126 }
Jiyong Park55549df2021-02-26 23:57:23 +09002127 expectLink("mylib", "shared_apex29", "mylib2", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002128 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002129}
2130
Jooyung Haned124c32021-01-26 11:43:46 +09002131func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
2132 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2133 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2134 config.TestProductVariables.Platform_version_active_codenames = []string{"S"}
2135 }
2136 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["libfoo"],
2141 min_sdk_version: "S",
2142 }
2143 apex_key {
2144 name: "myapex.key",
2145 public_key: "testkey.avbpubkey",
2146 private_key: "testkey.pem",
2147 }
2148 cc_library {
2149 name: "libfoo",
2150 shared_libs: ["libbar"],
2151 apex_available: ["myapex"],
2152 min_sdk_version: "29",
2153 }
2154 cc_library {
2155 name: "libbar",
2156 apex_available: ["myapex"],
2157 }
2158 `, withSAsActiveCodeNames)
2159}
2160
2161func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
2162 withSAsActiveCodeNames := func(fs map[string][]byte, config android.Config) {
2163 config.TestProductVariables.Platform_sdk_codename = proptools.StringPtr("S")
2164 config.TestProductVariables.Platform_version_active_codenames = []string{"S", "T"}
2165 }
Colin Cross1c460562021-02-16 17:55:47 -08002166 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002167 apex {
2168 name: "myapex",
2169 key: "myapex.key",
2170 native_shared_libs: ["libfoo"],
2171 min_sdk_version: "S",
2172 }
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178 cc_library {
2179 name: "libfoo",
2180 shared_libs: ["libbar"],
2181 apex_available: ["myapex"],
2182 min_sdk_version: "S",
2183 }
2184 cc_library {
2185 name: "libbar",
2186 stubs: {
2187 symbol_file: "libbar.map.txt",
2188 versions: ["30", "S", "T"],
2189 },
2190 }
2191 `, withSAsActiveCodeNames)
2192
2193 // ensure libfoo is linked with "S" version of libbar stub
2194 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2195 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09002196 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_T/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002197}
2198
Jiyong Park7c2ee712018-12-07 00:42:25 +09002199func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002200 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002201 apex {
2202 name: "myapex",
2203 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002204 native_shared_libs: ["mylib"],
2205 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002206 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002207 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002208 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002209 }
2210
2211 apex_key {
2212 name: "myapex.key",
2213 public_key: "testkey.avbpubkey",
2214 private_key: "testkey.pem",
2215 }
2216
2217 prebuilt_etc {
2218 name: "myetc",
2219 src: "myprebuilt",
2220 sub_dir: "foo/bar",
2221 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002222
2223 cc_library {
2224 name: "mylib",
2225 srcs: ["mylib.cpp"],
2226 relative_install_path: "foo/bar",
2227 system_shared_libs: [],
2228 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002229 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002230 }
2231
2232 cc_binary {
2233 name: "mybin",
2234 srcs: ["mylib.cpp"],
2235 relative_install_path: "foo/bar",
2236 system_shared_libs: [],
2237 static_executable: true,
2238 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002239 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002240 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002241 `)
2242
Sundong Ahnabb64432019-10-22 13:58:29 +09002243 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002244 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2245
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002246 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002247 ensureListContains(t, dirs, "etc")
2248 ensureListContains(t, dirs, "etc/foo")
2249 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002250 ensureListContains(t, dirs, "lib64")
2251 ensureListContains(t, dirs, "lib64/foo")
2252 ensureListContains(t, dirs, "lib64/foo/bar")
2253 ensureListContains(t, dirs, "lib")
2254 ensureListContains(t, dirs, "lib/foo")
2255 ensureListContains(t, dirs, "lib/foo/bar")
2256
Jiyong Parkbd13e442019-03-15 18:10:35 +09002257 ensureListContains(t, dirs, "bin")
2258 ensureListContains(t, dirs, "bin/foo")
2259 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002260}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002261
Jooyung Han35155c42020-02-06 17:33:20 +09002262func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002263 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002264 apex {
2265 name: "myapex",
2266 key: "myapex.key",
2267 multilib: {
2268 both: {
2269 native_shared_libs: ["mylib"],
2270 binaries: ["mybin"],
2271 },
2272 },
2273 compile_multilib: "both",
2274 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002275 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002276 }
2277
2278 apex_key {
2279 name: "myapex.key",
2280 public_key: "testkey.avbpubkey",
2281 private_key: "testkey.pem",
2282 }
2283
2284 cc_library {
2285 name: "mylib",
2286 relative_install_path: "foo/bar",
2287 system_shared_libs: [],
2288 stl: "none",
2289 apex_available: [ "myapex" ],
2290 native_bridge_supported: true,
2291 }
2292
2293 cc_binary {
2294 name: "mybin",
2295 relative_install_path: "foo/bar",
2296 system_shared_libs: [],
2297 static_executable: true,
2298 stl: "none",
2299 apex_available: [ "myapex" ],
2300 native_bridge_supported: true,
2301 compile_multilib: "both", // default is "first" for binary
2302 multilib: {
2303 lib64: {
2304 suffix: "64",
2305 },
2306 },
2307 }
2308 `, withNativeBridgeEnabled)
2309 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2310 "bin/foo/bar/mybin",
2311 "bin/foo/bar/mybin64",
2312 "bin/arm/foo/bar/mybin",
2313 "bin/arm64/foo/bar/mybin64",
2314 "lib/foo/bar/mylib.so",
2315 "lib/arm/foo/bar/mylib.so",
2316 "lib64/foo/bar/mylib.so",
2317 "lib64/arm64/foo/bar/mylib.so",
2318 })
2319}
2320
Jiyong Parkda6eb592018-12-19 17:12:36 +09002321func TestUseVendor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002322 ctx := testApex(t, `
Jiyong Parkda6eb592018-12-19 17:12:36 +09002323 apex {
2324 name: "myapex",
2325 key: "myapex.key",
2326 native_shared_libs: ["mylib"],
2327 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002328 updatable: false,
Jiyong Parkda6eb592018-12-19 17:12:36 +09002329 }
2330
2331 apex_key {
2332 name: "myapex.key",
2333 public_key: "testkey.avbpubkey",
2334 private_key: "testkey.pem",
2335 }
2336
2337 cc_library {
2338 name: "mylib",
2339 srcs: ["mylib.cpp"],
2340 shared_libs: ["mylib2"],
2341 system_shared_libs: [],
2342 vendor_available: true,
2343 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002344 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002345 }
2346
2347 cc_library {
2348 name: "mylib2",
2349 srcs: ["mylib.cpp"],
2350 system_shared_libs: [],
2351 vendor_available: true,
2352 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002353 apex_available: [ "myapex" ],
Jiyong Parkda6eb592018-12-19 17:12:36 +09002354 }
Jooyung Handc782442019-11-01 03:14:38 +09002355 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002356 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002357 })
Jiyong Parkda6eb592018-12-19 17:12:36 +09002358
2359 inputsList := []string{}
Sundong Ahnabb64432019-10-22 13:58:29 +09002360 for _, i := range ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().BuildParamsForTests() {
Jiyong Parkda6eb592018-12-19 17:12:36 +09002361 for _, implicit := range i.Implicits {
2362 inputsList = append(inputsList, implicit.String())
2363 }
2364 }
2365 inputsString := strings.Join(inputsList, " ")
2366
2367 // ensure that the apex includes vendor variants of the direct and indirect deps
Colin Crossaede88c2020-08-11 12:17:01 -07002368 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib.so")
2369 ensureContains(t, inputsString, "android_vendor.VER_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002370
2371 // ensure that the apex does not include core variants
Colin Crossaede88c2020-08-11 12:17:01 -07002372 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib.so")
2373 ensureNotContains(t, inputsString, "android_arm64_armv8-a_shared_apex10000/mylib2.so")
Jiyong Parkda6eb592018-12-19 17:12:36 +09002374}
Jiyong Park16e91a02018-12-20 18:18:08 +09002375
Jooyung Han85d61762020-06-24 23:50:26 +09002376func TestUseVendorNotAllowedForSystemApexes(t *testing.T) {
Jooyung Handc782442019-11-01 03:14:38 +09002377 testApexError(t, `module "myapex" .*: use_vendor: not allowed`, `
2378 apex {
2379 name: "myapex",
2380 key: "myapex.key",
2381 use_vendor: true,
2382 }
2383 apex_key {
2384 name: "myapex.key",
2385 public_key: "testkey.avbpubkey",
2386 private_key: "testkey.pem",
2387 }
2388 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002389 setUseVendorAllowListForTest(config, []string{""})
Jooyung Handc782442019-11-01 03:14:38 +09002390 })
Colin Cross440e0d02020-06-11 11:32:11 -07002391 // no error with allow list
Jooyung Handc782442019-11-01 03:14:38 +09002392 testApex(t, `
2393 apex {
2394 name: "myapex",
2395 key: "myapex.key",
2396 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002397 updatable: false,
Jooyung Handc782442019-11-01 03:14:38 +09002398 }
2399 apex_key {
2400 name: "myapex.key",
2401 public_key: "testkey.avbpubkey",
2402 private_key: "testkey.pem",
2403 }
2404 `, func(fs map[string][]byte, config android.Config) {
Colin Cross440e0d02020-06-11 11:32:11 -07002405 setUseVendorAllowListForTest(config, []string{"myapex"})
Jooyung Handc782442019-11-01 03:14:38 +09002406 })
2407}
2408
Jooyung Han5c998b92019-06-27 11:30:33 +09002409func TestUseVendorFailsIfNotVendorAvailable(t *testing.T) {
2410 testApexError(t, `dependency "mylib" of "myapex" missing variant:\n.*image:vendor`, `
2411 apex {
2412 name: "myapex",
2413 key: "myapex.key",
2414 native_shared_libs: ["mylib"],
2415 use_vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002416 updatable: false,
Jooyung Han5c998b92019-06-27 11:30:33 +09002417 }
2418
2419 apex_key {
2420 name: "myapex.key",
2421 public_key: "testkey.avbpubkey",
2422 private_key: "testkey.pem",
2423 }
2424
2425 cc_library {
2426 name: "mylib",
2427 srcs: ["mylib.cpp"],
2428 system_shared_libs: [],
2429 stl: "none",
2430 }
2431 `)
2432}
2433
Jooyung Han85d61762020-06-24 23:50:26 +09002434func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002435 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002436 apex {
2437 name: "myapex",
2438 key: "myapex.key",
2439 binaries: ["mybin"],
2440 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002441 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002442 }
2443 apex_key {
2444 name: "myapex.key",
2445 public_key: "testkey.avbpubkey",
2446 private_key: "testkey.pem",
2447 }
2448 cc_binary {
2449 name: "mybin",
2450 vendor: true,
2451 shared_libs: ["libfoo"],
2452 }
2453 cc_library {
2454 name: "libfoo",
2455 proprietary: true,
2456 }
2457 `)
2458
2459 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2460 "bin/mybin",
2461 "lib64/libfoo.so",
2462 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2463 "lib64/libc++.so",
2464 })
2465
2466 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002467 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002468 name := apexBundle.BaseModuleName()
2469 prefix := "TARGET_"
2470 var builder strings.Builder
2471 data.Custom(&builder, name, prefix, "", data)
2472 androidMk := builder.String()
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002473 installPath := path.Join(buildDir, "../target/product/test_device/vendor/apex")
2474 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002475
2476 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2477 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2478 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002479}
2480
Jooyung Handf78e212020-07-22 15:54:47 +09002481func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002482 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002483 apex {
2484 name: "myapex",
2485 key: "myapex.key",
2486 binaries: ["mybin"],
2487 vendor: true,
2488 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002489 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002490 }
2491 apex_key {
2492 name: "myapex.key",
2493 public_key: "testkey.avbpubkey",
2494 private_key: "testkey.pem",
2495 }
2496 cc_binary {
2497 name: "mybin",
2498 vendor: true,
2499 shared_libs: ["libvndk", "libvendor"],
2500 }
2501 cc_library {
2502 name: "libvndk",
2503 vndk: {
2504 enabled: true,
2505 },
2506 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002507 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002508 }
2509 cc_library {
2510 name: "libvendor",
2511 vendor: true,
2512 }
2513 `)
2514
2515 vendorVariant := "android_vendor.VER_arm64_armv8-a"
2516
Colin Crossaede88c2020-08-11 12:17:01 -07002517 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002518 libs := names(ldRule.Args["libFlags"])
2519 // VNDK libs(libvndk/libc++) as they are
2520 ensureListContains(t, libs, buildDir+"/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
Paul Duffine05480a2021-03-08 15:07:14 +00002521 ensureListContains(t, libs, buildDir+"/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002522 // non-stable Vendor libs as APEX variants
Colin Crossaede88c2020-08-11 12:17:01 -07002523 ensureListContains(t, libs, buildDir+"/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002524
2525 // VNDK libs are not included when use_vndk_as_stable: true
2526 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2527 "bin/mybin",
2528 "lib64/libvendor.so",
2529 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002530
2531 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2532 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2533 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002534}
2535
Justin Yun13decfb2021-03-08 19:25:55 +09002536func TestProductVariant(t *testing.T) {
2537 ctx := testApex(t, `
2538 apex {
2539 name: "myapex",
2540 key: "myapex.key",
2541 updatable: false,
2542 product_specific: true,
2543 binaries: ["foo"],
2544 }
2545
2546 apex_key {
2547 name: "myapex.key",
2548 public_key: "testkey.avbpubkey",
2549 private_key: "testkey.pem",
2550 }
2551
2552 cc_binary {
2553 name: "foo",
2554 product_available: true,
2555 apex_available: ["myapex"],
2556 srcs: ["foo.cpp"],
2557 }
2558 `, func(fs map[string][]byte, config android.Config) {
2559 config.TestProductVariables.ProductVndkVersion = proptools.StringPtr("current")
2560 })
2561
2562 cflags := strings.Fields(
2563 ctx.ModuleForTests("foo", "android_product.VER_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
2564 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2565 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2566 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2567 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2568}
2569
Jooyung Han8e5685d2020-09-21 11:02:57 +09002570func TestApex_withPrebuiltFirmware(t *testing.T) {
2571 testCases := []struct {
2572 name string
2573 additionalProp string
2574 }{
2575 {"system apex with prebuilt_firmware", ""},
2576 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2577 }
2578 for _, tc := range testCases {
2579 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002580 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002581 apex {
2582 name: "myapex",
2583 key: "myapex.key",
2584 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002585 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002586 `+tc.additionalProp+`
2587 }
2588 apex_key {
2589 name: "myapex.key",
2590 public_key: "testkey.avbpubkey",
2591 private_key: "testkey.pem",
2592 }
2593 prebuilt_firmware {
2594 name: "myfirmware",
2595 src: "myfirmware.bin",
2596 filename_from_src: true,
2597 `+tc.additionalProp+`
2598 }
2599 `)
2600 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2601 "etc/firmware/myfirmware.bin",
2602 })
2603 })
2604 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002605}
2606
Jooyung Hanefb184e2020-06-25 17:14:25 +09002607func TestAndroidMk_UseVendorRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002608 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002609 apex {
2610 name: "myapex",
2611 key: "myapex.key",
2612 use_vendor: true,
2613 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002614 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002615 }
2616
2617 apex_key {
2618 name: "myapex.key",
2619 public_key: "testkey.avbpubkey",
2620 private_key: "testkey.pem",
2621 }
2622
2623 cc_library {
2624 name: "mylib",
2625 vendor_available: true,
2626 apex_available: ["myapex"],
2627 }
2628 `, func(fs map[string][]byte, config android.Config) {
2629 setUseVendorAllowListForTest(config, []string{"myapex"})
2630 })
2631
2632 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002633 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002634 name := apexBundle.BaseModuleName()
2635 prefix := "TARGET_"
2636 var builder strings.Builder
2637 data.Custom(&builder, name, prefix, "", data)
2638 androidMk := builder.String()
2639 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc libm libdl\n")
2640}
2641
2642func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002643 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002644 apex {
2645 name: "myapex",
2646 key: "myapex.key",
2647 vendor: true,
2648 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002649 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002650 }
2651
2652 apex_key {
2653 name: "myapex.key",
2654 public_key: "testkey.avbpubkey",
2655 private_key: "testkey.pem",
2656 }
2657
2658 cc_library {
2659 name: "mylib",
2660 vendor_available: true,
2661 }
2662 `)
2663
2664 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002665 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002666 name := apexBundle.BaseModuleName()
2667 prefix := "TARGET_"
2668 var builder strings.Builder
2669 data.Custom(&builder, name, prefix, "", data)
2670 androidMk := builder.String()
2671 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2672}
2673
Jooyung Han2ed99d02020-06-24 23:26:26 +09002674func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002675 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 vintf_fragments: ["fragment.xml"],
2680 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002681 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002682 }
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688 cc_binary {
2689 name: "mybin",
2690 }
2691 `)
2692
2693 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002694 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002695 name := apexBundle.BaseModuleName()
2696 prefix := "TARGET_"
2697 var builder strings.Builder
2698 data.Custom(&builder, name, prefix, "", data)
2699 androidMk := builder.String()
2700 ensureContains(t, androidMk, "LOCAL_VINTF_FRAGMENTS := fragment.xml\n")
2701 ensureContains(t, androidMk, "LOCAL_INIT_RC := init.rc\n")
2702}
2703
Jiyong Park16e91a02018-12-20 18:18:08 +09002704func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002705 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002710 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002711 }
2712
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718
2719 cc_library {
2720 name: "mylib",
2721 srcs: ["mylib.cpp"],
2722 system_shared_libs: [],
2723 stl: "none",
2724 stubs: {
2725 versions: ["1", "2", "3"],
2726 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002727 apex_available: [
2728 "//apex_available:platform",
2729 "myapex",
2730 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002731 }
2732
2733 cc_binary {
2734 name: "not_in_apex",
2735 srcs: ["mylib.cpp"],
2736 static_libs: ["mylib"],
2737 static_executable: true,
2738 system_shared_libs: [],
2739 stl: "none",
2740 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002741 `)
2742
Colin Cross7113d202019-11-20 16:39:12 -08002743 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002744
2745 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002746 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002747}
Jiyong Park9335a262018-12-24 11:31:58 +09002748
2749func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002750 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002751 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002752 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002753 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002754 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002755 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002756 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002757 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002758 }
2759
2760 cc_library {
2761 name: "mylib",
2762 srcs: ["mylib.cpp"],
2763 system_shared_libs: [],
2764 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002765 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002766 }
2767
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002774 android_app_certificate {
2775 name: "myapex.certificate",
2776 certificate: "testkey",
2777 }
2778
2779 android_app_certificate {
2780 name: "myapex.certificate.override",
2781 certificate: "testkey.override",
2782 }
2783
Jiyong Park9335a262018-12-24 11:31:58 +09002784 `)
2785
2786 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002787 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002788
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002789 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2790 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002791 "vendor/foo/devkeys/testkey.avbpubkey")
2792 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002793 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2794 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002795 "vendor/foo/devkeys/testkey.pem")
2796 }
2797
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002798 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002799 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002800 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002801 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002802 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09002803 }
2804}
Jiyong Park58e364a2019-01-19 19:24:06 +09002805
Jooyung Hanf121a652019-12-17 14:30:11 +09002806func TestCertificate(t *testing.T) {
2807 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002808 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002809 apex {
2810 name: "myapex",
2811 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002812 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002813 }
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }`)
2819 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2820 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
2821 if actual := rule.Args["certificates"]; actual != expected {
2822 t.Errorf("certificates should be %q, not %q", expected, actual)
2823 }
2824 })
2825 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002826 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002827 apex {
2828 name: "myapex_keytest",
2829 key: "myapex.key",
2830 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002831 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002832 }
2833 apex_key {
2834 name: "myapex.key",
2835 public_key: "testkey.avbpubkey",
2836 private_key: "testkey.pem",
2837 }
2838 android_app_certificate {
2839 name: "myapex.certificate.override",
2840 certificate: "testkey.override",
2841 }`)
2842 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2843 expected := "testkey.override.x509.pem testkey.override.pk8"
2844 if actual := rule.Args["certificates"]; actual != expected {
2845 t.Errorf("certificates should be %q, not %q", expected, actual)
2846 }
2847 })
2848 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002849 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002850 apex {
2851 name: "myapex",
2852 key: "myapex.key",
2853 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002854 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002855 }
2856 apex_key {
2857 name: "myapex.key",
2858 public_key: "testkey.avbpubkey",
2859 private_key: "testkey.pem",
2860 }
2861 android_app_certificate {
2862 name: "myapex.certificate",
2863 certificate: "testkey",
2864 }`)
2865 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2866 expected := "testkey.x509.pem testkey.pk8"
2867 if actual := rule.Args["certificates"]; actual != expected {
2868 t.Errorf("certificates should be %q, not %q", expected, actual)
2869 }
2870 })
2871 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002872 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002873 apex {
2874 name: "myapex_keytest",
2875 key: "myapex.key",
2876 file_contexts: ":myapex-file_contexts",
2877 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002878 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002879 }
2880 apex_key {
2881 name: "myapex.key",
2882 public_key: "testkey.avbpubkey",
2883 private_key: "testkey.pem",
2884 }
2885 android_app_certificate {
2886 name: "myapex.certificate.override",
2887 certificate: "testkey.override",
2888 }`)
2889 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2890 expected := "testkey.override.x509.pem testkey.override.pk8"
2891 if actual := rule.Args["certificates"]; actual != expected {
2892 t.Errorf("certificates should be %q, not %q", expected, actual)
2893 }
2894 })
2895 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002896 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002897 apex {
2898 name: "myapex",
2899 key: "myapex.key",
2900 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002901 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002902 }
2903 apex_key {
2904 name: "myapex.key",
2905 public_key: "testkey.avbpubkey",
2906 private_key: "testkey.pem",
2907 }`)
2908 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
2909 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
2910 if actual := rule.Args["certificates"]; actual != expected {
2911 t.Errorf("certificates should be %q, not %q", expected, actual)
2912 }
2913 })
2914 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002915 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09002916 apex {
2917 name: "myapex_keytest",
2918 key: "myapex.key",
2919 file_contexts: ":myapex-file_contexts",
2920 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002921 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09002922 }
2923 apex_key {
2924 name: "myapex.key",
2925 public_key: "testkey.avbpubkey",
2926 private_key: "testkey.pem",
2927 }
2928 android_app_certificate {
2929 name: "myapex.certificate.override",
2930 certificate: "testkey.override",
2931 }`)
2932 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
2933 expected := "testkey.override.x509.pem testkey.override.pk8"
2934 if actual := rule.Args["certificates"]; actual != expected {
2935 t.Errorf("certificates should be %q, not %q", expected, actual)
2936 }
2937 })
2938}
2939
Jiyong Park58e364a2019-01-19 19:24:06 +09002940func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002941 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09002942 apex {
2943 name: "myapex",
2944 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002945 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002946 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09002947 }
2948
2949 apex {
2950 name: "otherapex",
2951 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002952 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09002953 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002954 }
2955
2956 apex_key {
2957 name: "myapex.key",
2958 public_key: "testkey.avbpubkey",
2959 private_key: "testkey.pem",
2960 }
2961
2962 cc_library {
2963 name: "mylib",
2964 srcs: ["mylib.cpp"],
2965 system_shared_libs: [],
2966 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002967 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002968 "myapex",
2969 "otherapex",
2970 ],
Jooyung Han24282772020-03-21 23:20:55 +09002971 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002972 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09002973 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09002974 cc_library {
2975 name: "mylib2",
2976 srcs: ["mylib.cpp"],
2977 system_shared_libs: [],
2978 stl: "none",
2979 apex_available: [
2980 "myapex",
2981 "otherapex",
2982 ],
Colin Crossaede88c2020-08-11 12:17:01 -07002983 static_libs: ["mylib3"],
2984 recovery_available: true,
2985 min_sdk_version: "29",
2986 }
2987 cc_library {
2988 name: "mylib3",
2989 srcs: ["mylib.cpp"],
2990 system_shared_libs: [],
2991 stl: "none",
2992 apex_available: [
2993 "myapex",
2994 "otherapex",
2995 ],
Jooyung Hanc87a0592020-03-02 17:44:33 +09002996 use_apex_name_macro: true,
Colin Crossaede88c2020-08-11 12:17:01 -07002997 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002998 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09002999 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003000 `)
3001
Jooyung Hanc87a0592020-03-02 17:44:33 +09003002 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003003 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003004 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003005 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003006
Jooyung Hanccce2f22020-03-07 03:45:53 +09003007 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003008 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003009 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003010 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Han77988572019-10-18 16:26:16 +09003011 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003012
Jooyung Hanccce2f22020-03-07 03:45:53 +09003013 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003014 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003015 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003016 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jooyung Han77988572019-10-18 16:26:16 +09003017 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003018
Colin Crossaede88c2020-08-11 12:17:01 -07003019 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3020 // each variant defines additional macros to distinguish which apex variant it is built for
3021
3022 // non-APEX variant does not have __ANDROID_APEX__ defined
3023 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3024 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3025
3026 // APEX variant has __ANDROID_APEX__ defined
3027 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
3028 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3029 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3030 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3031
3032 // APEX variant has __ANDROID_APEX__ defined
3033 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
3034 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3035 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
3036 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
3037
Dan Albertb19953d2020-11-17 15:29:36 -08003038 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003039 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3040 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003041 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003042
3043 // When a dependency of a cc_library sets use_apex_name_macro: true each apex gets a unique
3044 // variant.
Jooyung Hanc87a0592020-03-02 17:44:33 +09003045
3046 // non-APEX variant does not have __ANDROID_APEX__ defined
3047 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3048 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3049
3050 // APEX variant has __ANDROID_APEX__ defined
3051 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003052 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003053 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003054 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003055
Jooyung Hanc87a0592020-03-02 17:44:33 +09003056 // APEX variant has __ANDROID_APEX__ defined
3057 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_otherapex").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003058 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Han77988572019-10-18 16:26:16 +09003059 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MYAPEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003060 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_OTHERAPEX__")
Jooyung Han24282772020-03-21 23:20:55 +09003061
Dan Albertb19953d2020-11-17 15:29:36 -08003062 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003063 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003064 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003065 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003066}
Jiyong Park7e636d02019-01-28 16:16:54 +09003067
3068func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003069 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003070 apex {
3071 name: "myapex",
3072 key: "myapex.key",
3073 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003074 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003075 }
3076
3077 apex_key {
3078 name: "myapex.key",
3079 public_key: "testkey.avbpubkey",
3080 private_key: "testkey.pem",
3081 }
3082
3083 cc_library_headers {
3084 name: "mylib_headers",
3085 export_include_dirs: ["my_include"],
3086 system_shared_libs: [],
3087 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003088 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003089 }
3090
3091 cc_library {
3092 name: "mylib",
3093 srcs: ["mylib.cpp"],
3094 system_shared_libs: [],
3095 stl: "none",
3096 header_libs: ["mylib_headers"],
3097 export_header_lib_headers: ["mylib_headers"],
3098 stubs: {
3099 versions: ["1", "2", "3"],
3100 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003101 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003102 }
3103
3104 cc_library {
3105 name: "otherlib",
3106 srcs: ["mylib.cpp"],
3107 system_shared_libs: [],
3108 stl: "none",
3109 shared_libs: ["mylib"],
3110 }
3111 `)
3112
Colin Cross7113d202019-11-20 16:39:12 -08003113 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003114
3115 // Ensure that the include path of the header lib is exported to 'otherlib'
3116 ensureContains(t, cFlags, "-Imy_include")
3117}
Alex Light9670d332019-01-29 18:07:33 -08003118
Jiyong Park7cd10e32020-01-14 09:22:18 +09003119type fileInApex struct {
3120 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003121 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003122 isLink bool
3123}
3124
Jooyung Hana57af4a2020-01-23 05:36:59 +00003125func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003126 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003127 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003128 copyCmds := apexRule.Args["copy_commands"]
3129 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003130 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003131 for _, cmd := range strings.Split(copyCmds, "&&") {
3132 cmd = strings.TrimSpace(cmd)
3133 if cmd == "" {
3134 continue
3135 }
3136 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003137 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003138 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003139 switch terms[0] {
3140 case "mkdir":
3141 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003142 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003143 t.Fatal("copyCmds contains invalid cp command", cmd)
3144 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003145 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003146 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003147 isLink = false
3148 case "ln":
3149 if len(terms) != 3 && len(terms) != 4 {
3150 // ln LINK TARGET or ln -s LINK TARGET
3151 t.Fatal("copyCmds contains invalid ln command", cmd)
3152 }
3153 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003154 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003155 isLink = true
3156 default:
3157 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3158 }
3159 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003160 index := strings.Index(dst, imageApexDir)
3161 if index == -1 {
3162 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3163 }
3164 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003165 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003166 }
3167 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003168 return ret
3169}
3170
Jooyung Hana57af4a2020-01-23 05:36:59 +00003171func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3172 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003173 var failed bool
3174 var surplus []string
3175 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003176 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003177 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003178 for _, expected := range files {
3179 if matched, _ := path.Match(expected, file.path); matched {
3180 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003181 mactchFound = true
3182 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003183 }
3184 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003185 if !mactchFound {
3186 surplus = append(surplus, file.path)
3187 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003188 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003189
Jooyung Han31c470b2019-10-18 16:26:59 +09003190 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003191 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003192 t.Log("surplus files", surplus)
3193 failed = true
3194 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003195
3196 if len(files) > len(filesMatched) {
3197 var missing []string
3198 for _, expected := range files {
3199 if !filesMatched[expected] {
3200 missing = append(missing, expected)
3201 }
3202 }
3203 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003204 t.Log("missing files", missing)
3205 failed = true
3206 }
3207 if failed {
3208 t.Fail()
3209 }
3210}
3211
Jooyung Han344d5432019-08-23 11:17:39 +09003212func TestVndkApexCurrent(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003213 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003214 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003215 name: "com.android.vndk.current",
3216 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003217 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003218 }
3219
3220 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003221 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003222 public_key: "testkey.avbpubkey",
3223 private_key: "testkey.pem",
3224 }
3225
3226 cc_library {
3227 name: "libvndk",
3228 srcs: ["mylib.cpp"],
3229 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003230 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003231 vndk: {
3232 enabled: true,
3233 },
3234 system_shared_libs: [],
3235 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003236 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003237 }
3238
3239 cc_library {
3240 name: "libvndksp",
3241 srcs: ["mylib.cpp"],
3242 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003243 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003244 vndk: {
3245 enabled: true,
3246 support_system_process: true,
3247 },
3248 system_shared_libs: [],
3249 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003250 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003251 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003252 `+vndkLibrariesTxtFiles("current"))
Jooyung Han344d5432019-08-23 11:17:39 +09003253
Colin Cross2807f002021-03-02 10:15:29 -08003254 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003255 "lib/libvndk.so",
3256 "lib/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003257 "lib/libc++.so",
Jooyung Han31c470b2019-10-18 16:26:59 +09003258 "lib64/libvndk.so",
3259 "lib64/libvndksp.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003260 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003261 "etc/llndk.libraries.VER.txt",
3262 "etc/vndkcore.libraries.VER.txt",
3263 "etc/vndksp.libraries.VER.txt",
3264 "etc/vndkprivate.libraries.VER.txt",
Justin Yun8a2600c2020-12-07 12:44:03 +09003265 "etc/vndkproduct.libraries.VER.txt",
Jooyung Han31c470b2019-10-18 16:26:59 +09003266 })
Jooyung Han344d5432019-08-23 11:17:39 +09003267}
3268
3269func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003270 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003271 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003272 name: "com.android.vndk.current",
3273 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003274 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003275 }
3276
3277 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003278 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282
3283 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003284 name: "libvndk",
3285 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003286 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003287 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003288 vndk: {
3289 enabled: true,
3290 },
3291 system_shared_libs: [],
3292 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003293 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003294 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003295
3296 cc_prebuilt_library_shared {
3297 name: "libvndk.arm",
3298 srcs: ["libvndk.arm.so"],
3299 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003300 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003301 vndk: {
3302 enabled: true,
3303 },
3304 enabled: false,
3305 arch: {
3306 arm: {
3307 enabled: true,
3308 },
3309 },
3310 system_shared_libs: [],
3311 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003312 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003313 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003314 `+vndkLibrariesTxtFiles("current"),
3315 withFiles(map[string][]byte{
3316 "libvndk.so": nil,
3317 "libvndk.arm.so": nil,
3318 }))
Colin Cross2807f002021-03-02 10:15:29 -08003319 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003320 "lib/libvndk.so",
3321 "lib/libvndk.arm.so",
3322 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003323 "lib/libc++.so",
3324 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003325 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003326 })
Jooyung Han344d5432019-08-23 11:17:39 +09003327}
3328
Jooyung Han39edb6c2019-11-06 16:53:07 +09003329func vndkLibrariesTxtFiles(vers ...string) (result string) {
3330 for _, v := range vers {
3331 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003332 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003333 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003334 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003335 name: "` + txt + `.libraries.txt",
3336 }
3337 `
3338 }
3339 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003340 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003341 result += `
3342 prebuilt_etc {
3343 name: "` + txt + `.libraries.` + v + `.txt",
3344 src: "dummy.txt",
3345 }
3346 `
3347 }
3348 }
3349 }
3350 return
3351}
3352
Jooyung Han344d5432019-08-23 11:17:39 +09003353func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003354 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003355 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003356 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003357 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003358 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003359 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003360 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003361 }
3362
3363 apex_key {
3364 name: "myapex.key",
3365 public_key: "testkey.avbpubkey",
3366 private_key: "testkey.pem",
3367 }
3368
Jooyung Han31c470b2019-10-18 16:26:59 +09003369 vndk_prebuilt_shared {
3370 name: "libvndk27",
3371 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003372 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003373 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003374 vndk: {
3375 enabled: true,
3376 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003377 target_arch: "arm64",
3378 arch: {
3379 arm: {
3380 srcs: ["libvndk27_arm.so"],
3381 },
3382 arm64: {
3383 srcs: ["libvndk27_arm64.so"],
3384 },
3385 },
Colin Cross2807f002021-03-02 10:15:29 -08003386 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003387 }
3388
3389 vndk_prebuilt_shared {
3390 name: "libvndk27",
3391 version: "27",
3392 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003393 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003394 vndk: {
3395 enabled: true,
3396 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003397 target_arch: "x86_64",
3398 arch: {
3399 x86: {
3400 srcs: ["libvndk27_x86.so"],
3401 },
3402 x86_64: {
3403 srcs: ["libvndk27_x86_64.so"],
3404 },
3405 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003406 }
3407 `+vndkLibrariesTxtFiles("27"),
3408 withFiles(map[string][]byte{
3409 "libvndk27_arm.so": nil,
3410 "libvndk27_arm64.so": nil,
3411 "libvndk27_x86.so": nil,
3412 "libvndk27_x86_64.so": nil,
3413 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003414
Colin Cross2807f002021-03-02 10:15:29 -08003415 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003416 "lib/libvndk27_arm.so",
3417 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003418 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003419 })
Jooyung Han344d5432019-08-23 11:17:39 +09003420}
3421
Jooyung Han90eee022019-10-01 20:02:42 +09003422func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003423 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003424 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003425 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003426 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003427 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003428 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003429 }
3430 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003431 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003432 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003433 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003434 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003435 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003436 }
3437 apex_key {
3438 name: "myapex.key",
3439 public_key: "testkey.avbpubkey",
3440 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003441 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003442
3443 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003444 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003445 actual := proptools.String(bundle.properties.Apex_name)
3446 if !reflect.DeepEqual(actual, expected) {
3447 t.Errorf("Got '%v', expected '%v'", actual, expected)
3448 }
3449 }
3450
Colin Cross2807f002021-03-02 10:15:29 -08003451 assertApexName("com.android.vndk.vVER", "com.android.vndk.current")
3452 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003453}
3454
Jooyung Han344d5432019-08-23 11:17:39 +09003455func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003456 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003457 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003458 name: "com.android.vndk.current",
3459 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003460 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003461 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003462 }
3463
3464 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003465 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003466 public_key: "testkey.avbpubkey",
3467 private_key: "testkey.pem",
3468 }
3469
3470 cc_library {
3471 name: "libvndk",
3472 srcs: ["mylib.cpp"],
3473 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003474 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003475 native_bridge_supported: true,
3476 host_supported: true,
3477 vndk: {
3478 enabled: true,
3479 },
3480 system_shared_libs: [],
3481 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003482 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003483 }
Colin Cross2807f002021-03-02 10:15:29 -08003484 `+vndkLibrariesTxtFiles("current"),
3485 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003486
Colin Cross2807f002021-03-02 10:15:29 -08003487 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003488 "lib/libvndk.so",
3489 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003490 "lib/libc++.so",
3491 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003492 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003493 })
Jooyung Han344d5432019-08-23 11:17:39 +09003494}
3495
3496func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003497 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003498 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003499 name: "com.android.vndk.current",
3500 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003501 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003502 native_bridge_supported: true,
3503 }
3504
3505 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003506 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003507 public_key: "testkey.avbpubkey",
3508 private_key: "testkey.pem",
3509 }
3510
3511 cc_library {
3512 name: "libvndk",
3513 srcs: ["mylib.cpp"],
3514 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003515 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003516 native_bridge_supported: true,
3517 host_supported: true,
3518 vndk: {
3519 enabled: true,
3520 },
3521 system_shared_libs: [],
3522 stl: "none",
3523 }
3524 `)
3525}
3526
Jooyung Han31c470b2019-10-18 16:26:59 +09003527func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003529 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003530 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003531 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003532 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003533 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003534 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003535 }
3536
3537 apex_key {
3538 name: "myapex.key",
3539 public_key: "testkey.avbpubkey",
3540 private_key: "testkey.pem",
3541 }
3542
3543 vndk_prebuilt_shared {
3544 name: "libvndk27",
3545 version: "27",
3546 target_arch: "arm",
3547 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003548 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003549 vndk: {
3550 enabled: true,
3551 },
3552 arch: {
3553 arm: {
3554 srcs: ["libvndk27.so"],
3555 }
3556 },
3557 }
3558
3559 vndk_prebuilt_shared {
3560 name: "libvndk27",
3561 version: "27",
3562 target_arch: "arm",
3563 binder32bit: true,
3564 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003565 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003566 vndk: {
3567 enabled: true,
3568 },
3569 arch: {
3570 arm: {
3571 srcs: ["libvndk27binder32.so"],
3572 }
3573 },
Colin Cross2807f002021-03-02 10:15:29 -08003574 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003575 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003576 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003577 withFiles(map[string][]byte{
3578 "libvndk27.so": nil,
3579 "libvndk27binder32.so": nil,
3580 }),
3581 withBinder32bit,
3582 withTargets(map[android.OsType][]android.Target{
3583 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003584 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3585 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003586 },
3587 }),
3588 )
3589
Colin Cross2807f002021-03-02 10:15:29 -08003590 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003591 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003592 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003593 })
3594}
3595
Jooyung Han45a96772020-06-15 14:59:42 +09003596func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003598 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003599 name: "com.android.vndk.current",
3600 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003601 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003602 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003603 }
3604
3605 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003606 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003607 public_key: "testkey.avbpubkey",
3608 private_key: "testkey.pem",
3609 }
3610
3611 cc_library {
3612 name: "libz",
3613 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003614 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003615 vndk: {
3616 enabled: true,
3617 },
3618 stubs: {
3619 symbol_file: "libz.map.txt",
3620 versions: ["30"],
3621 }
3622 }
3623 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3624 "libz.map.txt": nil,
3625 }))
3626
Colin Cross2807f002021-03-02 10:15:29 -08003627 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003628 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3629 ensureListEmpty(t, provideNativeLibs)
3630}
3631
Jooyung Hane1633032019-08-01 17:41:43 +09003632func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003633 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003634 apex {
3635 name: "myapex_nodep",
3636 key: "myapex.key",
3637 native_shared_libs: ["lib_nodep"],
3638 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003639 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003640 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003641 }
3642
3643 apex {
3644 name: "myapex_dep",
3645 key: "myapex.key",
3646 native_shared_libs: ["lib_dep"],
3647 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003648 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003649 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003650 }
3651
3652 apex {
3653 name: "myapex_provider",
3654 key: "myapex.key",
3655 native_shared_libs: ["libfoo"],
3656 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003657 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003658 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003659 }
3660
3661 apex {
3662 name: "myapex_selfcontained",
3663 key: "myapex.key",
3664 native_shared_libs: ["lib_dep", "libfoo"],
3665 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003666 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003667 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003668 }
3669
3670 apex_key {
3671 name: "myapex.key",
3672 public_key: "testkey.avbpubkey",
3673 private_key: "testkey.pem",
3674 }
3675
3676 cc_library {
3677 name: "lib_nodep",
3678 srcs: ["mylib.cpp"],
3679 system_shared_libs: [],
3680 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003681 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003682 }
3683
3684 cc_library {
3685 name: "lib_dep",
3686 srcs: ["mylib.cpp"],
3687 shared_libs: ["libfoo"],
3688 system_shared_libs: [],
3689 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003690 apex_available: [
3691 "myapex_dep",
3692 "myapex_provider",
3693 "myapex_selfcontained",
3694 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003695 }
3696
3697 cc_library {
3698 name: "libfoo",
3699 srcs: ["mytest.cpp"],
3700 stubs: {
3701 versions: ["1"],
3702 },
3703 system_shared_libs: [],
3704 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003705 apex_available: [
3706 "myapex_provider",
3707 "myapex_selfcontained",
3708 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003709 }
3710 `)
3711
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003712 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003713 var provideNativeLibs, requireNativeLibs []string
3714
Sundong Ahnabb64432019-10-22 13:58:29 +09003715 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003716 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3717 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003718 ensureListEmpty(t, provideNativeLibs)
3719 ensureListEmpty(t, requireNativeLibs)
3720
Sundong Ahnabb64432019-10-22 13:58:29 +09003721 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003722 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3723 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003724 ensureListEmpty(t, provideNativeLibs)
3725 ensureListContains(t, requireNativeLibs, "libfoo.so")
3726
Sundong Ahnabb64432019-10-22 13:58:29 +09003727 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003728 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3729 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003730 ensureListContains(t, provideNativeLibs, "libfoo.so")
3731 ensureListEmpty(t, requireNativeLibs)
3732
Sundong Ahnabb64432019-10-22 13:58:29 +09003733 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003734 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3735 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003736 ensureListContains(t, provideNativeLibs, "libfoo.so")
3737 ensureListEmpty(t, requireNativeLibs)
3738}
3739
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003740func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003741 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003742 apex {
3743 name: "myapex",
3744 key: "myapex.key",
3745 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003746 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003747 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003748 }
3749
3750 apex_key {
3751 name: "myapex.key",
3752 public_key: "testkey.avbpubkey",
3753 private_key: "testkey.pem",
3754 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003755
3756 cc_library {
3757 name: "mylib",
3758 srcs: ["mylib.cpp"],
3759 system_shared_libs: [],
3760 stl: "none",
3761 apex_available: [
3762 "//apex_available:platform",
3763 "myapex",
3764 ],
3765 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003766 `)
3767
Sundong Ahnabb64432019-10-22 13:58:29 +09003768 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003769 apexManifestRule := module.Rule("apexManifestRule")
3770 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3771 apexRule := module.Rule("apexRule")
3772 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003773
3774 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003775 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003776 name := apexBundle.BaseModuleName()
3777 prefix := "TARGET_"
3778 var builder strings.Builder
3779 data.Custom(&builder, name, prefix, "", data)
3780 androidMk := builder.String()
3781 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3782 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003783}
3784
Alex Light0851b882019-02-07 13:20:53 -08003785func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003786 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003787 apex {
3788 name: "myapex",
3789 key: "myapex.key",
3790 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003791 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003792 }
3793
3794 apex_key {
3795 name: "myapex.key",
3796 public_key: "testkey.avbpubkey",
3797 private_key: "testkey.pem",
3798 }
3799
3800 cc_library {
3801 name: "mylib_common",
3802 srcs: ["mylib.cpp"],
3803 system_shared_libs: [],
3804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003805 apex_available: [
3806 "//apex_available:platform",
3807 "myapex",
3808 ],
Alex Light0851b882019-02-07 13:20:53 -08003809 }
3810 `)
3811
Sundong Ahnabb64432019-10-22 13:58:29 +09003812 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003813 apexRule := module.Rule("apexRule")
3814 copyCmds := apexRule.Args["copy_commands"]
3815
3816 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
3817 t.Log("Apex was a test apex!")
3818 t.Fail()
3819 }
3820 // Ensure that main rule creates an output
3821 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3822
3823 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003824 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003825
3826 // Ensure that both direct and indirect deps are copied into apex
3827 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3828
Colin Cross7113d202019-11-20 16:39:12 -08003829 // Ensure that the platform variant ends with _shared
3830 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003831
Colin Cross56a83212020-09-15 18:30:11 -07003832 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08003833 t.Log("Found mylib_common not in any apex!")
3834 t.Fail()
3835 }
3836}
3837
3838func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003839 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08003840 apex_test {
3841 name: "myapex",
3842 key: "myapex.key",
3843 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003844 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08003845 }
3846
3847 apex_key {
3848 name: "myapex.key",
3849 public_key: "testkey.avbpubkey",
3850 private_key: "testkey.pem",
3851 }
3852
3853 cc_library {
3854 name: "mylib_common_test",
3855 srcs: ["mylib.cpp"],
3856 system_shared_libs: [],
3857 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003858 // TODO: remove //apex_available:platform
3859 apex_available: [
3860 "//apex_available:platform",
3861 "myapex",
3862 ],
Alex Light0851b882019-02-07 13:20:53 -08003863 }
3864 `)
3865
Sundong Ahnabb64432019-10-22 13:58:29 +09003866 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08003867 apexRule := module.Rule("apexRule")
3868 copyCmds := apexRule.Args["copy_commands"]
3869
3870 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
3871 t.Log("Apex was not a test apex!")
3872 t.Fail()
3873 }
3874 // Ensure that main rule creates an output
3875 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3876
3877 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003878 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08003879
3880 // Ensure that both direct and indirect deps are copied into apex
3881 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
3882
Colin Cross7113d202019-11-20 16:39:12 -08003883 // Ensure that the platform variant ends with _shared
3884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08003885}
3886
Alex Light9670d332019-01-29 18:07:33 -08003887func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003888 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08003889 apex {
3890 name: "myapex",
3891 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003892 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08003893 multilib: {
3894 first: {
3895 native_shared_libs: ["mylib_common"],
3896 }
3897 },
3898 target: {
3899 android: {
3900 multilib: {
3901 first: {
3902 native_shared_libs: ["mylib"],
3903 }
3904 }
3905 },
3906 host: {
3907 multilib: {
3908 first: {
3909 native_shared_libs: ["mylib2"],
3910 }
3911 }
3912 }
3913 }
3914 }
3915
3916 apex_key {
3917 name: "myapex.key",
3918 public_key: "testkey.avbpubkey",
3919 private_key: "testkey.pem",
3920 }
3921
3922 cc_library {
3923 name: "mylib",
3924 srcs: ["mylib.cpp"],
3925 system_shared_libs: [],
3926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003927 // TODO: remove //apex_available:platform
3928 apex_available: [
3929 "//apex_available:platform",
3930 "myapex",
3931 ],
Alex Light9670d332019-01-29 18:07:33 -08003932 }
3933
3934 cc_library {
3935 name: "mylib_common",
3936 srcs: ["mylib.cpp"],
3937 system_shared_libs: [],
3938 stl: "none",
3939 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003940 // TODO: remove //apex_available:platform
3941 apex_available: [
3942 "//apex_available:platform",
3943 "myapex",
3944 ],
Alex Light9670d332019-01-29 18:07:33 -08003945 }
3946
3947 cc_library {
3948 name: "mylib2",
3949 srcs: ["mylib.cpp"],
3950 system_shared_libs: [],
3951 stl: "none",
3952 compile_multilib: "first",
3953 }
3954 `)
3955
Sundong Ahnabb64432019-10-22 13:58:29 +09003956 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08003957 copyCmds := apexRule.Args["copy_commands"]
3958
3959 // Ensure that main rule creates an output
3960 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
3961
3962 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07003963 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
3964 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
3965 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08003966
3967 // Ensure that both direct and indirect deps are copied into apex
3968 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
3969 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
3970 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
3971
Colin Cross7113d202019-11-20 16:39:12 -08003972 // Ensure that the platform variant ends with _shared
3973 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
3974 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
3975 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08003976}
Jiyong Park04480cf2019-02-06 00:16:29 +09003977
Jiyong Park59140302020-12-14 18:44:04 +09003978func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003979 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09003980 apex {
3981 name: "myapex",
3982 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09003984 arch: {
3985 arm64: {
3986 native_shared_libs: ["mylib.arm64"],
3987 },
3988 x86_64: {
3989 native_shared_libs: ["mylib.x64"],
3990 },
3991 }
3992 }
3993
3994 apex_key {
3995 name: "myapex.key",
3996 public_key: "testkey.avbpubkey",
3997 private_key: "testkey.pem",
3998 }
3999
4000 cc_library {
4001 name: "mylib.arm64",
4002 srcs: ["mylib.cpp"],
4003 system_shared_libs: [],
4004 stl: "none",
4005 // TODO: remove //apex_available:platform
4006 apex_available: [
4007 "//apex_available:platform",
4008 "myapex",
4009 ],
4010 }
4011
4012 cc_library {
4013 name: "mylib.x64",
4014 srcs: ["mylib.cpp"],
4015 system_shared_libs: [],
4016 stl: "none",
4017 // TODO: remove //apex_available:platform
4018 apex_available: [
4019 "//apex_available:platform",
4020 "myapex",
4021 ],
4022 }
4023 `)
4024
4025 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4026 copyCmds := apexRule.Args["copy_commands"]
4027
4028 // Ensure that apex variant is created for the direct dep
4029 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4030 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4031
4032 // Ensure that both direct and indirect deps are copied into apex
4033 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4034 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4035}
4036
Jiyong Park04480cf2019-02-06 00:16:29 +09004037func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004038 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004039 apex {
4040 name: "myapex",
4041 key: "myapex.key",
4042 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004043 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004044 }
4045
4046 apex_key {
4047 name: "myapex.key",
4048 public_key: "testkey.avbpubkey",
4049 private_key: "testkey.pem",
4050 }
4051
4052 sh_binary {
4053 name: "myscript",
4054 src: "mylib.cpp",
4055 filename: "myscript.sh",
4056 sub_dir: "script",
4057 }
4058 `)
4059
Sundong Ahnabb64432019-10-22 13:58:29 +09004060 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004061 copyCmds := apexRule.Args["copy_commands"]
4062
4063 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4064}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004065
Jooyung Han91df2082019-11-20 01:49:42 +09004066func TestApexInVariousPartition(t *testing.T) {
4067 testcases := []struct {
4068 propName, parition, flattenedPartition string
4069 }{
4070 {"", "system", "system_ext"},
4071 {"product_specific: true", "product", "product"},
4072 {"soc_specific: true", "vendor", "vendor"},
4073 {"proprietary: true", "vendor", "vendor"},
4074 {"vendor: true", "vendor", "vendor"},
4075 {"system_ext_specific: true", "system_ext", "system_ext"},
4076 }
4077 for _, tc := range testcases {
4078 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004079 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004080 apex {
4081 name: "myapex",
4082 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004083 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004084 `+tc.propName+`
4085 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004086
Jooyung Han91df2082019-11-20 01:49:42 +09004087 apex_key {
4088 name: "myapex.key",
4089 public_key: "testkey.avbpubkey",
4090 private_key: "testkey.pem",
4091 }
4092 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004093
Jooyung Han91df2082019-11-20 01:49:42 +09004094 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
4095 expected := buildDir + "/target/product/test_device/" + tc.parition + "/apex"
4096 actual := apex.installDir.String()
4097 if actual != expected {
4098 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4099 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004100
Jooyung Han91df2082019-11-20 01:49:42 +09004101 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
4102 expected = buildDir + "/target/product/test_device/" + tc.flattenedPartition + "/apex"
4103 actual = flattened.installDir.String()
4104 if actual != expected {
4105 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4106 }
4107 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004108 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004109}
Jiyong Park67882562019-03-21 01:11:21 +09004110
Jooyung Han580eb4f2020-06-24 19:33:06 +09004111func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004112 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004113 apex {
4114 name: "myapex",
4115 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004116 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004117 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004118
Jooyung Han580eb4f2020-06-24 19:33:06 +09004119 apex_key {
4120 name: "myapex.key",
4121 public_key: "testkey.avbpubkey",
4122 private_key: "testkey.pem",
4123 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004124 `)
4125 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004126 rule := module.Output("file_contexts")
4127 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4128}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004129
Jooyung Han580eb4f2020-06-24 19:33:06 +09004130func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004131 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004132 apex {
4133 name: "myapex",
4134 key: "myapex.key",
4135 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004136 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004137 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004138
Jooyung Han580eb4f2020-06-24 19:33:06 +09004139 apex_key {
4140 name: "myapex.key",
4141 public_key: "testkey.avbpubkey",
4142 private_key: "testkey.pem",
4143 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004144 `, withFiles(map[string][]byte{
4145 "my_own_file_contexts": nil,
4146 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004147}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004148
Jooyung Han580eb4f2020-06-24 19:33:06 +09004149func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004151 apex {
4152 name: "myapex",
4153 key: "myapex.key",
4154 product_specific: true,
4155 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004156 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004157 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004158
Jooyung Han580eb4f2020-06-24 19:33:06 +09004159 apex_key {
4160 name: "myapex.key",
4161 public_key: "testkey.avbpubkey",
4162 private_key: "testkey.pem",
4163 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004164 `)
4165
Colin Cross1c460562021-02-16 17:55:47 -08004166 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004167 apex {
4168 name: "myapex",
4169 key: "myapex.key",
4170 product_specific: true,
4171 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004172 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004173 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004174
Jooyung Han580eb4f2020-06-24 19:33:06 +09004175 apex_key {
4176 name: "myapex.key",
4177 public_key: "testkey.avbpubkey",
4178 private_key: "testkey.pem",
4179 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004180 `, withFiles(map[string][]byte{
4181 "product_specific_file_contexts": nil,
4182 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004183 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4184 rule := module.Output("file_contexts")
4185 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4186}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004187
Jooyung Han580eb4f2020-06-24 19:33:06 +09004188func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004189 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004190 apex {
4191 name: "myapex",
4192 key: "myapex.key",
4193 product_specific: true,
4194 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004195 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004196 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004197
Jooyung Han580eb4f2020-06-24 19:33:06 +09004198 apex_key {
4199 name: "myapex.key",
4200 public_key: "testkey.avbpubkey",
4201 private_key: "testkey.pem",
4202 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004203
Jooyung Han580eb4f2020-06-24 19:33:06 +09004204 filegroup {
4205 name: "my-file-contexts",
4206 srcs: ["product_specific_file_contexts"],
4207 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004208 `, withFiles(map[string][]byte{
4209 "product_specific_file_contexts": nil,
4210 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004211 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4212 rule := module.Output("file_contexts")
4213 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004214}
4215
Jiyong Park67882562019-03-21 01:11:21 +09004216func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004217 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004218 apex_key {
4219 name: "myapex.key",
4220 public_key: ":my.avbpubkey",
4221 private_key: ":my.pem",
4222 product_specific: true,
4223 }
4224
4225 filegroup {
4226 name: "my.avbpubkey",
4227 srcs: ["testkey2.avbpubkey"],
4228 }
4229
4230 filegroup {
4231 name: "my.pem",
4232 srcs: ["testkey2.pem"],
4233 }
4234 `)
4235
4236 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4237 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004238 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004239 if actual_pubkey != expected_pubkey {
4240 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4241 }
4242 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004243 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004244 if actual_privkey != expected_privkey {
4245 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4246 }
4247}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004248
4249func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004250 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004251 prebuilt_apex {
4252 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004253 arch: {
4254 arm64: {
4255 src: "myapex-arm64.apex",
4256 },
4257 arm: {
4258 src: "myapex-arm.apex",
4259 },
4260 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004261 }
4262 `)
4263
4264 prebuilt := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4265
Jiyong Parkc95714e2019-03-29 14:23:10 +09004266 expectedInput := "myapex-arm64.apex"
4267 if prebuilt.inputApex.String() != expectedInput {
4268 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4269 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004270}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004271
4272func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004273 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004274 prebuilt_apex {
4275 name: "myapex",
4276 src: "myapex-arm.apex",
4277 filename: "notmyapex.apex",
4278 }
4279 `)
4280
4281 p := ctx.ModuleForTests("myapex", "android_common").Module().(*Prebuilt)
4282
4283 expected := "notmyapex.apex"
4284 if p.installFilename != expected {
4285 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4286 }
4287}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004288
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004289func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004290 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004291 prebuilt_apex {
4292 name: "myapex.prebuilt",
4293 src: "myapex-arm.apex",
4294 overrides: [
4295 "myapex",
4296 ],
4297 }
4298 `)
4299
4300 p := ctx.ModuleForTests("myapex.prebuilt", "android_common").Module().(*Prebuilt)
4301
4302 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004303 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004304 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004305 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004306 }
4307}
4308
Paul Duffin092153d2021-01-26 11:42:39 +00004309// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4310// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004311func TestPrebuiltExportDexImplementationJars(t *testing.T) {
4312 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin092153d2021-01-26 11:42:39 +00004313 // Empty transformation.
Paul Duffin064b70c2020-11-02 17:32:38 +00004314 }
4315
Paul Duffin89886cb2021-02-05 16:44:03 +00004316 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004317 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004318 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Paul Duffin064b70c2020-11-02 17:32:38 +00004319 dexJarBuildPath := p.DexJarBuildPath()
Paul Duffin39853512021-02-26 11:09:39 +00004320 stem := android.RemoveOptionalPrebuiltPrefix(name)
4321 if expected, actual := ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar", android.NormalizePathForTesting(dexJarBuildPath); actual != expected {
Paul Duffin064b70c2020-11-02 17:32:38 +00004322 t.Errorf("Incorrect DexJarBuildPath value '%s', expected '%s'", actual, expected)
4323 }
4324 }
4325
Paul Duffin39853512021-02-26 11:09:39 +00004326 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004327 // Make sure that an apex variant is not created for the source module.
Paul Duffin39853512021-02-26 11:09:39 +00004328 if expected, actual := []string{"android_common"}, ctx.ModuleVariantsForTests(name); !reflect.DeepEqual(expected, actual) {
Paul Duffin064b70c2020-11-02 17:32:38 +00004329 t.Errorf("invalid set of variants for %q: expected %q, found %q", "libfoo", expected, actual)
4330 }
4331 }
4332
4333 t.Run("prebuilt only", func(t *testing.T) {
4334 bp := `
4335 prebuilt_apex {
4336 name: "myapex",
4337 arch: {
4338 arm64: {
4339 src: "myapex-arm64.apex",
4340 },
4341 arm: {
4342 src: "myapex-arm.apex",
4343 },
4344 },
Paul Duffin39853512021-02-26 11:09:39 +00004345 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004346 }
4347
4348 java_import {
4349 name: "libfoo",
4350 jars: ["libfoo.jar"],
4351 }
Paul Duffin39853512021-02-26 11:09:39 +00004352
4353 java_sdk_library_import {
4354 name: "libbar",
4355 public: {
4356 jars: ["libbar.jar"],
4357 },
4358 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004359 `
4360
4361 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4362 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4363
Paul Duffinf6932af2021-02-26 18:21:56 +00004364 // Make sure that the deapexer has the correct input APEX.
4365 deapexer := ctx.ModuleForTests("myapex.deapexer", "android_common")
4366 rule := deapexer.Rule("deapexer")
4367 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4368 t.Errorf("expected: %q, found: %q", expected, actual)
4369 }
4370
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004371 // Make sure that the prebuilt_apex has the correct input APEX.
4372 prebuiltApex := ctx.ModuleForTests("myapex", "android_common")
4373 rule = prebuiltApex.Rule("android/soong/android.Cp")
4374 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4375 t.Errorf("expected: %q, found: %q", expected, actual)
4376 }
4377
Paul Duffin89886cb2021-02-05 16:44:03 +00004378 checkDexJarBuildPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004379
4380 checkDexJarBuildPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004381 })
4382
4383 t.Run("prebuilt with source preferred", func(t *testing.T) {
4384
4385 bp := `
4386 prebuilt_apex {
4387 name: "myapex",
4388 arch: {
4389 arm64: {
4390 src: "myapex-arm64.apex",
4391 },
4392 arm: {
4393 src: "myapex-arm.apex",
4394 },
4395 },
Paul Duffin39853512021-02-26 11:09:39 +00004396 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004397 }
4398
4399 java_import {
4400 name: "libfoo",
4401 jars: ["libfoo.jar"],
4402 }
4403
4404 java_library {
4405 name: "libfoo",
4406 }
Paul Duffin39853512021-02-26 11:09:39 +00004407
4408 java_sdk_library_import {
4409 name: "libbar",
4410 public: {
4411 jars: ["libbar.jar"],
4412 },
4413 }
4414
4415 java_sdk_library {
4416 name: "libbar",
4417 srcs: ["foo/bar/MyClass.java"],
4418 unsafe_ignore_missing_latest_api: true,
4419 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004420 `
4421
4422 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4423 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4424
Paul Duffin89886cb2021-02-05 16:44:03 +00004425 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004426 ensureNoSourceVariant(t, ctx, "libfoo")
4427
4428 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4429 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004430 })
4431
4432 t.Run("prebuilt preferred with source", func(t *testing.T) {
4433 bp := `
4434 prebuilt_apex {
4435 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004436 arch: {
4437 arm64: {
4438 src: "myapex-arm64.apex",
4439 },
4440 arm: {
4441 src: "myapex-arm.apex",
4442 },
4443 },
Paul Duffin39853512021-02-26 11:09:39 +00004444 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004445 }
4446
4447 java_import {
4448 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004449 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004450 jars: ["libfoo.jar"],
4451 }
4452
4453 java_library {
4454 name: "libfoo",
4455 }
Paul Duffin39853512021-02-26 11:09:39 +00004456
4457 java_sdk_library_import {
4458 name: "libbar",
4459 prefer: true,
4460 public: {
4461 jars: ["libbar.jar"],
4462 },
4463 }
4464
4465 java_sdk_library {
4466 name: "libbar",
4467 srcs: ["foo/bar/MyClass.java"],
4468 unsafe_ignore_missing_latest_api: true,
4469 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004470 `
4471
4472 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4473 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4474
Paul Duffin89886cb2021-02-05 16:44:03 +00004475 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004476 ensureNoSourceVariant(t, ctx, "libfoo")
4477
4478 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
4479 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004480 })
4481}
4482
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004483func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
4484 transform := func(config *dexpreopt.GlobalConfig) {
Paul Duffin37856732021-02-26 14:24:15 +00004485 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo", "myapex:libbar"})
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004486 }
4487
Paul Duffin37856732021-02-26 14:24:15 +00004488 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4489 t.Helper()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004490 s := ctx.SingletonForTests("dex_bootjars")
4491 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004492 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004493 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004494 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004495 foundLibfooJar = true
4496 buildRule := s.Output(output)
4497 actual := android.NormalizePathForTesting(buildRule.Input)
4498 if actual != bootDexJarPath {
4499 t.Errorf("Incorrect boot dex jar path '%s', expected '%s'", actual, bootDexJarPath)
4500 }
4501 }
4502 }
4503 if !foundLibfooJar {
4504 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs")
4505 }
4506 }
4507
Paul Duffin4fd997b2021-02-03 20:06:33 +00004508 checkHiddenAPIIndexInputs := func(t *testing.T, ctx *android.TestContext, expectedInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004509 t.Helper()
Paul Duffin4fd997b2021-02-03 20:06:33 +00004510 hiddenAPIIndex := ctx.SingletonForTests("hiddenapi_index")
4511 indexRule := hiddenAPIIndex.Rule("singleton-merged-hiddenapi-index")
4512 java.CheckHiddenAPIRuleInputs(t, expectedInputs, indexRule)
4513 }
4514
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004515 t.Run("prebuilt only", func(t *testing.T) {
4516 bp := `
4517 prebuilt_apex {
4518 name: "myapex",
4519 arch: {
4520 arm64: {
4521 src: "myapex-arm64.apex",
4522 },
4523 arm: {
4524 src: "myapex-arm.apex",
4525 },
4526 },
Paul Duffin37856732021-02-26 14:24:15 +00004527 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004528 }
4529
4530 java_import {
4531 name: "libfoo",
4532 jars: ["libfoo.jar"],
4533 apex_available: ["myapex"],
4534 }
Paul Duffin37856732021-02-26 14:24:15 +00004535
4536 java_sdk_library_import {
4537 name: "libbar",
4538 public: {
4539 jars: ["libbar.jar"],
4540 },
4541 apex_available: ["myapex"],
4542 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004543 `
4544
4545 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004546 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4547 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004548
Paul Duffin9d67ca62021-02-03 20:06:33 +00004549 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4550 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004551.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004552.intermediates/libfoo/android_common_myapex/hiddenapi/index.csv
4553`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004554 })
4555
4556 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4557 bp := `
4558 prebuilt_apex {
4559 name: "myapex",
4560 arch: {
4561 arm64: {
4562 src: "myapex-arm64.apex",
4563 },
4564 arm: {
4565 src: "myapex-arm.apex",
4566 },
4567 },
Paul Duffin37856732021-02-26 14:24:15 +00004568 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004569 }
4570
4571 java_import {
4572 name: "libfoo",
4573 jars: ["libfoo.jar"],
4574 apex_available: ["myapex"],
4575 }
4576
4577 java_library {
4578 name: "libfoo",
4579 srcs: ["foo/bar/MyClass.java"],
4580 apex_available: ["myapex"],
4581 }
Paul Duffin37856732021-02-26 14:24:15 +00004582
4583 java_sdk_library_import {
4584 name: "libbar",
4585 public: {
4586 jars: ["libbar.jar"],
4587 },
4588 apex_available: ["myapex"],
4589 }
4590
4591 java_sdk_library {
4592 name: "libbar",
4593 srcs: ["foo/bar/MyClass.java"],
4594 unsafe_ignore_missing_latest_api: true,
4595 apex_available: ["myapex"],
4596 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004597 `
4598
4599 // In this test the source (java_library) libfoo is active since the
4600 // prebuilt (java_import) defaults to prefer:false. However the
4601 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
4602 // find the dex boot jar in it. We either need to disable the source libfoo
4603 // or make the prebuilt libfoo preferred.
4604 testDexpreoptWithApexes(t, bp, "failed to find a dex jar path for module 'libfoo'", transform)
4605 })
4606
4607 t.Run("prebuilt library preferred with source", func(t *testing.T) {
4608 bp := `
4609 prebuilt_apex {
4610 name: "myapex",
4611 arch: {
4612 arm64: {
4613 src: "myapex-arm64.apex",
4614 },
4615 arm: {
4616 src: "myapex-arm.apex",
4617 },
4618 },
Paul Duffin37856732021-02-26 14:24:15 +00004619 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004620 }
4621
4622 java_import {
4623 name: "libfoo",
4624 prefer: true,
4625 jars: ["libfoo.jar"],
4626 apex_available: ["myapex"],
4627 }
4628
4629 java_library {
4630 name: "libfoo",
4631 srcs: ["foo/bar/MyClass.java"],
4632 apex_available: ["myapex"],
4633 }
Paul Duffin37856732021-02-26 14:24:15 +00004634
4635 java_sdk_library_import {
4636 name: "libbar",
4637 prefer: true,
4638 public: {
4639 jars: ["libbar.jar"],
4640 },
4641 apex_available: ["myapex"],
4642 }
4643
4644 java_sdk_library {
4645 name: "libbar",
4646 srcs: ["foo/bar/MyClass.java"],
4647 unsafe_ignore_missing_latest_api: true,
4648 apex_available: ["myapex"],
4649 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004650 `
4651
4652 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004653 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4654 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004655
Paul Duffin9d67ca62021-02-03 20:06:33 +00004656 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4657 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004658.intermediates/prebuilt_libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004659.intermediates/prebuilt_libfoo/android_common_myapex/hiddenapi/index.csv
4660`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004661 })
4662
4663 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
4664 bp := `
4665 apex {
4666 name: "myapex",
4667 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00004668 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004669 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004670 }
4671
4672 apex_key {
4673 name: "myapex.key",
4674 public_key: "testkey.avbpubkey",
4675 private_key: "testkey.pem",
4676 }
4677
4678 prebuilt_apex {
4679 name: "myapex",
4680 arch: {
4681 arm64: {
4682 src: "myapex-arm64.apex",
4683 },
4684 arm: {
4685 src: "myapex-arm.apex",
4686 },
4687 },
Paul Duffin37856732021-02-26 14:24:15 +00004688 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004689 }
4690
4691 java_import {
4692 name: "libfoo",
4693 jars: ["libfoo.jar"],
4694 apex_available: ["myapex"],
4695 }
4696
4697 java_library {
4698 name: "libfoo",
4699 srcs: ["foo/bar/MyClass.java"],
4700 apex_available: ["myapex"],
4701 }
Paul Duffin37856732021-02-26 14:24:15 +00004702
4703 java_sdk_library_import {
4704 name: "libbar",
4705 public: {
4706 jars: ["libbar.jar"],
4707 },
4708 apex_available: ["myapex"],
4709 }
4710
4711 java_sdk_library {
4712 name: "libbar",
4713 srcs: ["foo/bar/MyClass.java"],
4714 unsafe_ignore_missing_latest_api: true,
4715 apex_available: ["myapex"],
4716 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004717 `
4718
4719 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004720 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
4721 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004722
4723 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4724 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004725.intermediates/libbar/android_common_myapex/hiddenapi/index.csv
Paul Duffin4fd997b2021-02-03 20:06:33 +00004726.intermediates/libfoo/android_common_apex10000/hiddenapi/index.csv
4727`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004728 })
4729
4730 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
4731 bp := `
4732 apex {
4733 name: "myapex",
4734 enabled: false,
4735 key: "myapex.key",
4736 java_libs: ["libfoo"],
4737 }
4738
4739 apex_key {
4740 name: "myapex.key",
4741 public_key: "testkey.avbpubkey",
4742 private_key: "testkey.pem",
4743 }
4744
4745 prebuilt_apex {
4746 name: "myapex",
4747 arch: {
4748 arm64: {
4749 src: "myapex-arm64.apex",
4750 },
4751 arm: {
4752 src: "myapex-arm.apex",
4753 },
4754 },
Paul Duffin37856732021-02-26 14:24:15 +00004755 exported_java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004756 }
4757
4758 java_import {
4759 name: "libfoo",
4760 prefer: true,
4761 jars: ["libfoo.jar"],
4762 apex_available: ["myapex"],
4763 }
4764
4765 java_library {
4766 name: "libfoo",
4767 srcs: ["foo/bar/MyClass.java"],
4768 apex_available: ["myapex"],
4769 }
Paul Duffin37856732021-02-26 14:24:15 +00004770
4771 java_sdk_library_import {
4772 name: "libbar",
4773 prefer: true,
4774 public: {
4775 jars: ["libbar.jar"],
4776 },
4777 apex_available: ["myapex"],
4778 }
4779
4780 java_sdk_library {
4781 name: "libbar",
4782 srcs: ["foo/bar/MyClass.java"],
4783 unsafe_ignore_missing_latest_api: true,
4784 apex_available: ["myapex"],
4785 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004786 `
4787
4788 ctx := testDexpreoptWithApexes(t, bp, "", transform)
Paul Duffin37856732021-02-26 14:24:15 +00004789 checkBootDexJarPath(t, ctx, "libfoo", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4790 checkBootDexJarPath(t, ctx, "libbar", ".intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004791
Paul Duffin9d67ca62021-02-03 20:06:33 +00004792 // Make sure that the dex file from the prebuilt_apex contributes to the hiddenapi index file.
4793 checkHiddenAPIIndexInputs(t, ctx, `
Paul Duffin37856732021-02-26 14:24:15 +00004794.intermediates/prebuilt_libbar/android_common_prebuilt_myapex/hiddenapi/index.csv
Paul Duffin9d67ca62021-02-03 20:06:33 +00004795.intermediates/prebuilt_libfoo/android_common_prebuilt_myapex/hiddenapi/index.csv
4796`)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004797 })
4798}
4799
Roland Levillain630846d2019-06-26 12:48:34 +01004800func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004801 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01004802 apex_test {
4803 name: "myapex",
4804 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004805 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01004806 tests: [
4807 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01004808 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01004809 ],
4810 }
4811
4812 apex_key {
4813 name: "myapex.key",
4814 public_key: "testkey.avbpubkey",
4815 private_key: "testkey.pem",
4816 }
4817
Liz Kammer1c14a212020-05-12 15:26:55 -07004818 filegroup {
4819 name: "fg",
4820 srcs: [
4821 "baz",
4822 "bar/baz"
4823 ],
4824 }
4825
Roland Levillain630846d2019-06-26 12:48:34 +01004826 cc_test {
4827 name: "mytest",
4828 gtest: false,
4829 srcs: ["mytest.cpp"],
4830 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004831 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01004832 system_shared_libs: [],
4833 static_executable: true,
4834 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07004835 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01004836 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01004837
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004838 cc_library {
4839 name: "mylib",
4840 srcs: ["mylib.cpp"],
4841 system_shared_libs: [],
4842 stl: "none",
4843 }
4844
Liz Kammer5bd365f2020-05-27 15:15:11 -07004845 filegroup {
4846 name: "fg2",
4847 srcs: [
4848 "testdata/baz"
4849 ],
4850 }
4851
Roland Levillain9b5fde92019-06-28 15:41:19 +01004852 cc_test {
4853 name: "mytests",
4854 gtest: false,
4855 srcs: [
4856 "mytest1.cpp",
4857 "mytest2.cpp",
4858 "mytest3.cpp",
4859 ],
4860 test_per_src: true,
4861 relative_install_path: "test",
4862 system_shared_libs: [],
4863 static_executable: true,
4864 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07004865 data: [
4866 ":fg",
4867 ":fg2",
4868 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01004869 }
Roland Levillain630846d2019-06-26 12:48:34 +01004870 `)
4871
Sundong Ahnabb64432019-10-22 13:58:29 +09004872 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01004873 copyCmds := apexRule.Args["copy_commands"]
4874
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004875 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01004876 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09004877 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01004878
Liz Kammer1c14a212020-05-12 15:26:55 -07004879 //Ensure that test data are copied into apex.
4880 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
4881 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
4882
Roland Levillain9b5fde92019-06-28 15:41:19 +01004883 // Ensure that test deps built with `test_per_src` are copied into apex.
4884 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
4885 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
4886 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01004887
4888 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07004889 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004890 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004891 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01004892 prefix := "TARGET_"
4893 var builder strings.Builder
4894 data.Custom(&builder, name, prefix, "", data)
4895 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09004896 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
4897 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
4898 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
4899 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09004900 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09004901 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01004902 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07004903
4904 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07004905 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07004906 data.Custom(&builder, name, prefix, "", data)
4907 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07004908 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
4909 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01004910}
4911
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004912func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004913 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004914 apex {
4915 name: "myapex",
4916 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004917 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004918 }
4919 apex_key {
4920 name: "myapex.key",
4921 public_key: "testkey.avbpubkey",
4922 private_key: "testkey.pem",
4923 }
4924 `, func(fs map[string][]byte, config android.Config) {
4925 config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
4926 })
4927 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09004928 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07004929 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09004930 var builder strings.Builder
4931 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
4932 androidMk := builder.String()
4933 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
4934}
4935
Jooyung Hand48f3c32019-08-23 11:18:57 +09004936func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
4937 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
4938 apex {
4939 name: "myapex",
4940 key: "myapex.key",
4941 native_shared_libs: ["libfoo"],
4942 }
4943
4944 apex_key {
4945 name: "myapex.key",
4946 public_key: "testkey.avbpubkey",
4947 private_key: "testkey.pem",
4948 }
4949
4950 cc_library {
4951 name: "libfoo",
4952 stl: "none",
4953 system_shared_libs: [],
4954 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004955 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004956 }
4957 `)
4958 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
4959 apex {
4960 name: "myapex",
4961 key: "myapex.key",
4962 java_libs: ["myjar"],
4963 }
4964
4965 apex_key {
4966 name: "myapex.key",
4967 public_key: "testkey.avbpubkey",
4968 private_key: "testkey.pem",
4969 }
4970
4971 java_library {
4972 name: "myjar",
4973 srcs: ["foo/bar/MyClass.java"],
4974 sdk_version: "none",
4975 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09004976 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09004977 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09004978 }
4979 `)
4980}
4981
Bill Peckhama41a6962021-01-11 10:58:54 -08004982func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004983 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08004984 apex {
4985 name: "myapex",
4986 key: "myapex.key",
4987 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004988 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08004989 }
4990
4991 apex_key {
4992 name: "myapex.key",
4993 public_key: "testkey.avbpubkey",
4994 private_key: "testkey.pem",
4995 }
4996
4997 java_import {
4998 name: "myjavaimport",
4999 apex_available: ["myapex"],
5000 jars: ["my.jar"],
5001 compile_dex: true,
5002 }
5003 `)
5004
5005 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5006 apexRule := module.Rule("apexRule")
5007 copyCmds := apexRule.Args["copy_commands"]
5008 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5009}
5010
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005011func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005012 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005013 apex {
5014 name: "myapex",
5015 key: "myapex.key",
5016 apps: [
5017 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005018 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005019 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005020 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005021 }
5022
5023 apex_key {
5024 name: "myapex.key",
5025 public_key: "testkey.avbpubkey",
5026 private_key: "testkey.pem",
5027 }
5028
5029 android_app {
5030 name: "AppFoo",
5031 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005032 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005033 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005034 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005035 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005036 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005037 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005038
5039 android_app {
5040 name: "AppFooPriv",
5041 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005042 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005043 system_modules: "none",
5044 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005045 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005046 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005047 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005048
5049 cc_library_shared {
5050 name: "libjni",
5051 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005052 shared_libs: ["libfoo"],
5053 stl: "none",
5054 system_shared_libs: [],
5055 apex_available: [ "myapex" ],
5056 sdk_version: "current",
5057 }
5058
5059 cc_library_shared {
5060 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005061 stl: "none",
5062 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005063 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005064 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005065 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005066 `)
5067
Sundong Ahnabb64432019-10-22 13:58:29 +09005068 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005069 apexRule := module.Rule("apexRule")
5070 copyCmds := apexRule.Args["copy_commands"]
5071
5072 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005073 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005074
Colin Crossaede88c2020-08-11 12:17:01 -07005075 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005076 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005077 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005078 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005079 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005080 // JNI libraries including transitive deps are
5081 for _, jni := range []string{"libjni", "libfoo"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005082 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005083 // ... embedded inside APK (jnilibs.zip)
5084 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5085 // ... and not directly inside the APEX
5086 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5087 }
Dario Frenicde2a032019-10-27 00:29:22 +01005088}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005089
Dario Frenicde2a032019-10-27 00:29:22 +01005090func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005091 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005092 apex {
5093 name: "myapex",
5094 key: "myapex.key",
5095 apps: [
5096 "AppFooPrebuilt",
5097 "AppFooPrivPrebuilt",
5098 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005099 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005100 }
5101
5102 apex_key {
5103 name: "myapex.key",
5104 public_key: "testkey.avbpubkey",
5105 private_key: "testkey.pem",
5106 }
5107
5108 android_app_import {
5109 name: "AppFooPrebuilt",
5110 apk: "PrebuiltAppFoo.apk",
5111 presigned: true,
5112 dex_preopt: {
5113 enabled: false,
5114 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005115 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005116 }
5117
5118 android_app_import {
5119 name: "AppFooPrivPrebuilt",
5120 apk: "PrebuiltAppFooPriv.apk",
5121 privileged: true,
5122 presigned: true,
5123 dex_preopt: {
5124 enabled: false,
5125 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005126 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005127 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005128 }
5129 `)
5130
Sundong Ahnabb64432019-10-22 13:58:29 +09005131 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005132 apexRule := module.Rule("apexRule")
5133 copyCmds := apexRule.Args["copy_commands"]
5134
5135 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005136 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5137}
5138
5139func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005140 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005141 apex {
5142 name: "myapex",
5143 key: "myapex.key",
5144 apps: [
5145 "AppFoo",
5146 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005147 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005148 }
5149
5150 apex_key {
5151 name: "myapex.key",
5152 public_key: "testkey.avbpubkey",
5153 private_key: "testkey.pem",
5154 }
5155
5156 android_app {
5157 name: "AppFoo",
5158 srcs: ["foo/bar/MyClass.java"],
5159 sdk_version: "none",
5160 system_modules: "none",
5161 apex_available: [ "myapex" ],
5162 }
5163
5164 android_app_import {
5165 name: "AppFoo",
5166 apk: "AppFooPrebuilt.apk",
5167 filename: "AppFooPrebuilt.apk",
5168 presigned: true,
5169 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005170 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005171 }
5172 `, withFiles(map[string][]byte{
5173 "AppFooPrebuilt.apk": nil,
5174 }))
5175
5176 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005177 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005178 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005179}
5180
Dario Freni6f3937c2019-12-20 22:58:03 +00005181func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005182 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005183 apex {
5184 name: "myapex",
5185 key: "myapex.key",
5186 apps: [
5187 "TesterHelpAppFoo",
5188 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005189 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005190 }
5191
5192 apex_key {
5193 name: "myapex.key",
5194 public_key: "testkey.avbpubkey",
5195 private_key: "testkey.pem",
5196 }
5197
5198 android_test_helper_app {
5199 name: "TesterHelpAppFoo",
5200 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005201 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005202 }
5203
5204 `)
5205
5206 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5207 apexRule := module.Rule("apexRule")
5208 copyCmds := apexRule.Args["copy_commands"]
5209
5210 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5211}
5212
Jooyung Han18020ea2019-11-13 10:50:48 +09005213func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5214 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005215 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005216 apex {
5217 name: "myapex",
5218 key: "myapex.key",
5219 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005220 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005221 }
5222
5223 apex_key {
5224 name: "myapex.key",
5225 public_key: "testkey.avbpubkey",
5226 private_key: "testkey.pem",
5227 }
5228
5229 apex {
5230 name: "otherapex",
5231 key: "myapex.key",
5232 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005233 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005234 }
5235
5236 cc_defaults {
5237 name: "libfoo-defaults",
5238 apex_available: ["otherapex"],
5239 }
5240
5241 cc_library {
5242 name: "libfoo",
5243 defaults: ["libfoo-defaults"],
5244 stl: "none",
5245 system_shared_libs: [],
5246 }`)
5247}
5248
Paul Duffine52e66f2020-03-30 17:54:29 +01005249func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005250 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005251 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005252 apex {
5253 name: "myapex",
5254 key: "myapex.key",
5255 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005256 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005257 }
5258
5259 apex_key {
5260 name: "myapex.key",
5261 public_key: "testkey.avbpubkey",
5262 private_key: "testkey.pem",
5263 }
5264
5265 apex {
5266 name: "otherapex",
5267 key: "otherapex.key",
5268 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005269 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005270 }
5271
5272 apex_key {
5273 name: "otherapex.key",
5274 public_key: "testkey.avbpubkey",
5275 private_key: "testkey.pem",
5276 }
5277
5278 cc_library {
5279 name: "libfoo",
5280 stl: "none",
5281 system_shared_libs: [],
5282 apex_available: ["otherapex"],
5283 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005284}
Jiyong Park127b40b2019-09-30 16:04:35 +09005285
Paul Duffine52e66f2020-03-30 17:54:29 +01005286func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005287 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005288 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005289.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005290.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005291.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005292.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005293.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005294.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005295 apex {
5296 name: "myapex",
5297 key: "myapex.key",
5298 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005299 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005300 }
5301
5302 apex_key {
5303 name: "myapex.key",
5304 public_key: "testkey.avbpubkey",
5305 private_key: "testkey.pem",
5306 }
5307
Jiyong Park127b40b2019-09-30 16:04:35 +09005308 cc_library {
5309 name: "libfoo",
5310 stl: "none",
5311 shared_libs: ["libbar"],
5312 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005313 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005314 }
5315
5316 cc_library {
5317 name: "libbar",
5318 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005319 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005320 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005321 apex_available: ["myapex"],
5322 }
5323
5324 cc_library {
5325 name: "libbaz",
5326 stl: "none",
5327 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005328 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005329}
Jiyong Park127b40b2019-09-30 16:04:35 +09005330
Paul Duffine52e66f2020-03-30 17:54:29 +01005331func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005332 testApexError(t, "\"otherapex\" is not a valid module name", `
5333 apex {
5334 name: "myapex",
5335 key: "myapex.key",
5336 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005337 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005338 }
5339
5340 apex_key {
5341 name: "myapex.key",
5342 public_key: "testkey.avbpubkey",
5343 private_key: "testkey.pem",
5344 }
5345
5346 cc_library {
5347 name: "libfoo",
5348 stl: "none",
5349 system_shared_libs: [],
5350 apex_available: ["otherapex"],
5351 }`)
5352
Paul Duffine52e66f2020-03-30 17:54:29 +01005353 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005354 apex {
5355 name: "myapex",
5356 key: "myapex.key",
5357 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005358 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005359 }
5360
5361 apex_key {
5362 name: "myapex.key",
5363 public_key: "testkey.avbpubkey",
5364 private_key: "testkey.pem",
5365 }
5366
5367 cc_library {
5368 name: "libfoo",
5369 stl: "none",
5370 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005371 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005372 apex_available: ["myapex"],
5373 }
5374
5375 cc_library {
5376 name: "libbar",
5377 stl: "none",
5378 system_shared_libs: [],
5379 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005380 }
5381
5382 cc_library {
5383 name: "libbaz",
5384 stl: "none",
5385 system_shared_libs: [],
5386 stubs: {
5387 versions: ["10", "20", "30"],
5388 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005389 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005390}
Jiyong Park127b40b2019-09-30 16:04:35 +09005391
Jiyong Park89e850a2020-04-07 16:37:39 +09005392func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005393 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005394 apex {
5395 name: "myapex",
5396 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005397 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005398 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005399 }
5400
5401 apex_key {
5402 name: "myapex.key",
5403 public_key: "testkey.avbpubkey",
5404 private_key: "testkey.pem",
5405 }
5406
5407 cc_library {
5408 name: "libfoo",
5409 stl: "none",
5410 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005411 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005412 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005413 }
5414
5415 cc_library {
5416 name: "libfoo2",
5417 stl: "none",
5418 system_shared_libs: [],
5419 shared_libs: ["libbaz"],
5420 apex_available: ["//apex_available:platform"],
5421 }
5422
5423 cc_library {
5424 name: "libbar",
5425 stl: "none",
5426 system_shared_libs: [],
5427 apex_available: ["myapex"],
5428 }
5429
5430 cc_library {
5431 name: "libbaz",
5432 stl: "none",
5433 system_shared_libs: [],
5434 apex_available: ["myapex"],
5435 stubs: {
5436 versions: ["1"],
5437 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005438 }`)
5439
Jiyong Park89e850a2020-04-07 16:37:39 +09005440 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5441 // because it depends on libbar which isn't available to platform
5442 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5443 if libfoo.NotAvailableForPlatform() != true {
5444 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5445 }
5446
5447 // libfoo2 however can be available to platform because it depends on libbaz which provides
5448 // stubs
5449 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5450 if libfoo2.NotAvailableForPlatform() == true {
5451 t.Errorf("%q should be available to platform", libfoo2.String())
5452 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005453}
Jiyong Parka90ca002019-10-07 15:47:24 +09005454
Paul Duffine52e66f2020-03-30 17:54:29 +01005455func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005456 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005457 apex {
5458 name: "myapex",
5459 key: "myapex.key",
5460 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005461 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005462 }
5463
5464 apex_key {
5465 name: "myapex.key",
5466 public_key: "testkey.avbpubkey",
5467 private_key: "testkey.pem",
5468 }
5469
5470 cc_library {
5471 name: "libfoo",
5472 stl: "none",
5473 system_shared_libs: [],
5474 apex_available: ["myapex"],
5475 static: {
5476 apex_available: ["//apex_available:platform"],
5477 },
5478 }`)
5479
Jiyong Park89e850a2020-04-07 16:37:39 +09005480 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5481 if libfooShared.NotAvailableForPlatform() != true {
5482 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5483 }
5484 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5485 if libfooStatic.NotAvailableForPlatform() != false {
5486 t.Errorf("%q should be available to platform", libfooStatic.String())
5487 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005488}
5489
Jiyong Park5d790c32019-11-15 18:40:32 +09005490func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005491 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005492 apex {
5493 name: "myapex",
5494 key: "myapex.key",
5495 apps: ["app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005496 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005497 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005498 }
5499
5500 override_apex {
5501 name: "override_myapex",
5502 base: "myapex",
5503 apps: ["override_app"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005504 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08005505 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005506 package_name: "test.overridden.package",
Jiyong Park5d790c32019-11-15 18:40:32 +09005507 }
5508
5509 apex_key {
5510 name: "myapex.key",
5511 public_key: "testkey.avbpubkey",
5512 private_key: "testkey.pem",
5513 }
5514
5515 android_app {
5516 name: "app",
5517 srcs: ["foo/bar/MyClass.java"],
5518 package_name: "foo",
5519 sdk_version: "none",
5520 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005521 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09005522 }
5523
5524 override_android_app {
5525 name: "override_app",
5526 base: "app",
5527 package_name: "bar",
5528 }
Jiyong Park20bacab2020-03-03 11:45:41 +09005529 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09005530
Jiyong Park317645e2019-12-05 13:20:58 +09005531 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
5532 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
5533 if originalVariant.GetOverriddenBy() != "" {
5534 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
5535 }
5536 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
5537 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
5538 }
5539
Jiyong Park5d790c32019-11-15 18:40:32 +09005540 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
5541 apexRule := module.Rule("apexRule")
5542 copyCmds := apexRule.Args["copy_commands"]
5543
5544 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005545 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005546
5547 apexBundle := module.Module().(*apexBundle)
5548 name := apexBundle.Name()
5549 if name != "override_myapex" {
5550 t.Errorf("name should be \"override_myapex\", but was %q", name)
5551 }
5552
Baligh Uddin004d7172020-02-19 21:29:28 -08005553 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
5554 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
5555 }
5556
Jiyong Park20bacab2020-03-03 11:45:41 +09005557 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07005558 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jiyong Park20bacab2020-03-03 11:45:41 +09005559
Colin Crossaa255532020-07-03 13:18:24 -07005560 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005561 var builder strings.Builder
5562 data.Custom(&builder, name, "TARGET_", "", data)
5563 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09005564 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005565 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
5566 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005567 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005568 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09005569 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08005570 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
5571 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09005572}
5573
Jooyung Han214bf372019-11-12 13:03:50 +09005574func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005575 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09005576 apex {
5577 name: "myapex",
5578 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005579 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09005580 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09005581 }
5582
5583 apex_key {
5584 name: "myapex.key",
5585 public_key: "testkey.avbpubkey",
5586 private_key: "testkey.pem",
5587 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005588
5589 cc_library {
5590 name: "mylib",
5591 srcs: ["mylib.cpp"],
5592 stl: "libc++",
5593 system_shared_libs: [],
5594 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09005595 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005596 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005597 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09005598
5599 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5600 args := module.Rule("apexRule").Args
5601 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00005602 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005603
5604 // The copies of the libraries in the apex should have one more dependency than
5605 // the ones outside the apex, namely the unwinder. Ideally we should check
5606 // the dependency names directly here but for some reason the names are blank in
5607 // this test.
5608 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07005609 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08005610 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
5611 if len(apexImplicits) != len(nonApexImplicits)+1 {
5612 t.Errorf("%q missing unwinder dep", lib)
5613 }
5614 }
Jooyung Han214bf372019-11-12 13:03:50 +09005615}
5616
Paul Duffine05480a2021-03-08 15:07:14 +00005617var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01005618 "api/current.txt": nil,
5619 "api/removed.txt": nil,
5620 "api/system-current.txt": nil,
5621 "api/system-removed.txt": nil,
5622 "api/test-current.txt": nil,
5623 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01005624
Anton Hanssondff2c782020-12-21 17:10:01 +00005625 "100/public/api/foo.txt": nil,
5626 "100/public/api/foo-removed.txt": nil,
5627 "100/system/api/foo.txt": nil,
5628 "100/system/api/foo-removed.txt": nil,
5629
Paul Duffineedc5d52020-06-12 17:46:39 +01005630 // For java_sdk_library_import
5631 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01005632}
5633
Jooyung Han58f26ab2019-12-18 15:34:32 +09005634func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005635 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09005636 apex {
5637 name: "myapex",
5638 key: "myapex.key",
5639 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005640 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09005641 }
5642
5643 apex_key {
5644 name: "myapex.key",
5645 public_key: "testkey.avbpubkey",
5646 private_key: "testkey.pem",
5647 }
5648
5649 java_sdk_library {
5650 name: "foo",
5651 srcs: ["a.java"],
5652 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005653 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09005654 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005655
5656 prebuilt_apis {
5657 name: "sdk",
5658 api_dirs: ["100"],
5659 }
Paul Duffin9b879592020-05-26 13:21:35 +01005660 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09005661
5662 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00005663 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09005664 "javalib/foo.jar",
5665 "etc/permissions/foo.xml",
5666 })
5667 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09005668 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
5669 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09005670}
5671
Paul Duffin9b879592020-05-26 13:21:35 +01005672func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005673 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005674 apex {
5675 name: "myapex",
5676 key: "myapex.key",
5677 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005678 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005679 }
5680
5681 apex_key {
5682 name: "myapex.key",
5683 public_key: "testkey.avbpubkey",
5684 private_key: "testkey.pem",
5685 }
5686
5687 java_sdk_library {
5688 name: "foo",
5689 srcs: ["a.java"],
5690 api_packages: ["foo"],
5691 apex_available: ["myapex"],
5692 sdk_version: "none",
5693 system_modules: "none",
5694 }
5695
5696 java_library {
5697 name: "bar",
5698 srcs: ["a.java"],
5699 libs: ["foo"],
5700 apex_available: ["myapex"],
5701 sdk_version: "none",
5702 system_modules: "none",
5703 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005704
5705 prebuilt_apis {
5706 name: "sdk",
5707 api_dirs: ["100"],
5708 }
Paul Duffin9b879592020-05-26 13:21:35 +01005709 `, withFiles(filesForSdkLibrary))
5710
5711 // java_sdk_library installs both impl jar and permission XML
5712 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5713 "javalib/bar.jar",
5714 "javalib/foo.jar",
5715 "etc/permissions/foo.xml",
5716 })
5717
5718 // The bar library should depend on the implementation jar.
5719 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5720 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5721 t.Errorf("expected %q, found %#q", expected, actual)
5722 }
5723}
5724
5725func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005726 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01005727 apex {
5728 name: "myapex",
5729 key: "myapex.key",
5730 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005731 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01005732 }
5733
5734 apex_key {
5735 name: "myapex.key",
5736 public_key: "testkey.avbpubkey",
5737 private_key: "testkey.pem",
5738 }
5739
5740 java_sdk_library {
5741 name: "foo",
5742 srcs: ["a.java"],
5743 api_packages: ["foo"],
5744 apex_available: ["myapex"],
5745 sdk_version: "none",
5746 system_modules: "none",
5747 }
5748
5749 java_library {
5750 name: "bar",
5751 srcs: ["a.java"],
5752 libs: ["foo"],
5753 sdk_version: "none",
5754 system_modules: "none",
5755 }
Anton Hanssondff2c782020-12-21 17:10:01 +00005756
5757 prebuilt_apis {
5758 name: "sdk",
5759 api_dirs: ["100"],
5760 }
Paul Duffin9b879592020-05-26 13:21:35 +01005761 `, withFiles(filesForSdkLibrary))
5762
5763 // java_sdk_library installs both impl jar and permission XML
5764 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5765 "javalib/foo.jar",
5766 "etc/permissions/foo.xml",
5767 })
5768
5769 // The bar library should depend on the stubs jar.
5770 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
5771 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5772 t.Errorf("expected %q, found %#q", expected, actual)
5773 }
5774}
5775
Paul Duffineedc5d52020-06-12 17:46:39 +01005776func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005777 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00005778 prebuilt_apis {
5779 name: "sdk",
5780 api_dirs: ["100"],
5781 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01005782 withFiles(map[string][]byte{
5783 "apex/a.java": nil,
5784 "apex/apex_manifest.json": nil,
5785 "apex/Android.bp": []byte(`
5786 package {
5787 default_visibility: ["//visibility:private"],
5788 }
5789
5790 apex {
5791 name: "myapex",
5792 key: "myapex.key",
5793 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005794 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005795 }
5796
5797 apex_key {
5798 name: "myapex.key",
5799 public_key: "testkey.avbpubkey",
5800 private_key: "testkey.pem",
5801 }
5802
5803 java_library {
5804 name: "bar",
5805 srcs: ["a.java"],
5806 libs: ["foo"],
5807 apex_available: ["myapex"],
5808 sdk_version: "none",
5809 system_modules: "none",
5810 }
5811`),
5812 "source/a.java": nil,
5813 "source/api/current.txt": nil,
5814 "source/api/removed.txt": nil,
5815 "source/Android.bp": []byte(`
5816 package {
5817 default_visibility: ["//visibility:private"],
5818 }
5819
5820 java_sdk_library {
5821 name: "foo",
5822 visibility: ["//apex"],
5823 srcs: ["a.java"],
5824 api_packages: ["foo"],
5825 apex_available: ["myapex"],
5826 sdk_version: "none",
5827 system_modules: "none",
5828 public: {
5829 enabled: true,
5830 },
5831 }
5832`),
5833 "prebuilt/a.jar": nil,
5834 "prebuilt/Android.bp": []byte(`
5835 package {
5836 default_visibility: ["//visibility:private"],
5837 }
5838
5839 java_sdk_library_import {
5840 name: "foo",
5841 visibility: ["//apex", "//source"],
5842 apex_available: ["myapex"],
5843 prefer: true,
5844 public: {
5845 jars: ["a.jar"],
5846 },
5847 }
5848`),
Anton Hanssondff2c782020-12-21 17:10:01 +00005849 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01005850 )
5851
5852 // java_sdk_library installs both impl jar and permission XML
5853 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5854 "javalib/bar.jar",
5855 "javalib/foo.jar",
5856 "etc/permissions/foo.xml",
5857 })
5858
5859 // The bar library should depend on the implementation jar.
5860 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
5861 if expected, actual := `^-classpath /[^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
5862 t.Errorf("expected %q, found %#q", expected, actual)
5863 }
5864}
5865
5866func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
5867 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
5868 apex {
5869 name: "myapex",
5870 key: "myapex.key",
5871 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005872 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01005873 }
5874
5875 apex_key {
5876 name: "myapex.key",
5877 public_key: "testkey.avbpubkey",
5878 private_key: "testkey.pem",
5879 }
5880
5881 java_sdk_library_import {
5882 name: "foo",
5883 apex_available: ["myapex"],
5884 prefer: true,
5885 public: {
5886 jars: ["a.jar"],
5887 },
5888 }
5889
5890 `, withFiles(filesForSdkLibrary))
5891}
5892
atrost6e126252020-01-27 17:01:16 +00005893func TestCompatConfig(t *testing.T) {
Paul Duffina369c7b2021-03-09 03:08:05 +00005894 result := apexFixtureFactory.
5895 Extend(java.PrepareForTestWithPlatformCompatConfig).
5896 RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00005897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00005900 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00005901 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005902 updatable: false,
atrost6e126252020-01-27 17:01:16 +00005903 }
5904
5905 apex_key {
5906 name: "myapex.key",
5907 public_key: "testkey.avbpubkey",
5908 private_key: "testkey.pem",
5909 }
5910
5911 platform_compat_config {
5912 name: "myjar-platform-compat-config",
5913 src: ":myjar",
5914 }
5915
5916 java_library {
5917 name: "myjar",
5918 srcs: ["foo/bar/MyClass.java"],
5919 sdk_version: "none",
5920 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00005921 apex_available: [ "myapex" ],
5922 }
Paul Duffin1b29e002021-03-16 15:06:54 +00005923
5924 // Make sure that a preferred prebuilt does not affect the apex contents.
5925 prebuilt_platform_compat_config {
5926 name: "myjar-platform-compat-config",
5927 metadata: "compat-config/metadata.xml",
5928 prefer: true,
5929 }
atrost6e126252020-01-27 17:01:16 +00005930 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00005931 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00005932 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
5933 "etc/compatconfig/myjar-platform-compat-config.xml",
5934 "javalib/myjar.jar",
5935 })
5936}
5937
Jiyong Park479321d2019-12-16 11:47:12 +09005938func TestRejectNonInstallableJavaLibrary(t *testing.T) {
5939 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
5940 apex {
5941 name: "myapex",
5942 key: "myapex.key",
5943 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005944 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09005945 }
5946
5947 apex_key {
5948 name: "myapex.key",
5949 public_key: "testkey.avbpubkey",
5950 private_key: "testkey.pem",
5951 }
5952
5953 java_library {
5954 name: "myjar",
5955 srcs: ["foo/bar/MyClass.java"],
5956 sdk_version: "none",
5957 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09005958 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005959 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09005960 }
5961 `)
5962}
5963
Jiyong Park7afd1072019-12-30 16:56:33 +09005964func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005965 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09005966 apex {
5967 name: "myapex",
5968 key: "myapex.key",
5969 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005970 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09005971 }
5972
5973 apex_key {
5974 name: "myapex.key",
5975 public_key: "testkey.avbpubkey",
5976 private_key: "testkey.pem",
5977 }
5978
5979 cc_library {
5980 name: "mylib",
5981 srcs: ["mylib.cpp"],
5982 system_shared_libs: [],
5983 stl: "none",
5984 required: ["a", "b"],
5985 host_required: ["c", "d"],
5986 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005987 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09005988 }
5989 `)
5990
5991 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005992 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09005993 name := apexBundle.BaseModuleName()
5994 prefix := "TARGET_"
5995 var builder strings.Builder
5996 data.Custom(&builder, name, prefix, "", data)
5997 androidMk := builder.String()
5998 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
5999 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6000 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6001}
6002
Jiyong Park7cd10e32020-01-14 09:22:18 +09006003func TestSymlinksFromApexToSystem(t *testing.T) {
6004 bp := `
6005 apex {
6006 name: "myapex",
6007 key: "myapex.key",
6008 native_shared_libs: ["mylib"],
6009 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006010 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006011 }
6012
Jiyong Park9d677202020-02-19 16:29:35 +09006013 apex {
6014 name: "myapex.updatable",
6015 key: "myapex.key",
6016 native_shared_libs: ["mylib"],
6017 java_libs: ["myjar"],
6018 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006019 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006020 }
6021
Jiyong Park7cd10e32020-01-14 09:22:18 +09006022 apex_key {
6023 name: "myapex.key",
6024 public_key: "testkey.avbpubkey",
6025 private_key: "testkey.pem",
6026 }
6027
6028 cc_library {
6029 name: "mylib",
6030 srcs: ["mylib.cpp"],
6031 shared_libs: ["myotherlib"],
6032 system_shared_libs: [],
6033 stl: "none",
6034 apex_available: [
6035 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006036 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006037 "//apex_available:platform",
6038 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006039 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006040 }
6041
6042 cc_library {
6043 name: "myotherlib",
6044 srcs: ["mylib.cpp"],
6045 system_shared_libs: [],
6046 stl: "none",
6047 apex_available: [
6048 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006049 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006050 "//apex_available:platform",
6051 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006052 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006053 }
6054
6055 java_library {
6056 name: "myjar",
6057 srcs: ["foo/bar/MyClass.java"],
6058 sdk_version: "none",
6059 system_modules: "none",
6060 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006061 apex_available: [
6062 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006063 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006064 "//apex_available:platform",
6065 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006066 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006067 }
6068
6069 java_library {
6070 name: "myotherjar",
6071 srcs: ["foo/bar/MyClass.java"],
6072 sdk_version: "none",
6073 system_modules: "none",
6074 apex_available: [
6075 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006076 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006077 "//apex_available:platform",
6078 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006079 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006080 }
6081 `
6082
6083 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6084 for _, f := range files {
6085 if f.path == file {
6086 if f.isLink {
6087 t.Errorf("%q is not a real file", file)
6088 }
6089 return
6090 }
6091 }
6092 t.Errorf("%q is not found", file)
6093 }
6094
6095 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6096 for _, f := range files {
6097 if f.path == file {
6098 if !f.isLink {
6099 t.Errorf("%q is not a symlink", file)
6100 }
6101 return
6102 }
6103 }
6104 t.Errorf("%q is not found", file)
6105 }
6106
Jiyong Park9d677202020-02-19 16:29:35 +09006107 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6108 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006109 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006110 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006111 ensureRealfileExists(t, files, "javalib/myjar.jar")
6112 ensureRealfileExists(t, files, "lib64/mylib.so")
6113 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6114
Jiyong Park9d677202020-02-19 16:29:35 +09006115 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6116 ensureRealfileExists(t, files, "javalib/myjar.jar")
6117 ensureRealfileExists(t, files, "lib64/mylib.so")
6118 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6119
6120 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006121 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006122 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006123 ensureRealfileExists(t, files, "javalib/myjar.jar")
6124 ensureRealfileExists(t, files, "lib64/mylib.so")
6125 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006126
6127 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6128 ensureRealfileExists(t, files, "javalib/myjar.jar")
6129 ensureRealfileExists(t, files, "lib64/mylib.so")
6130 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006131}
6132
Yo Chiange8128052020-07-23 20:09:18 +08006133func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006134 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006135 apex {
6136 name: "myapex",
6137 key: "myapex.key",
6138 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006139 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006140 }
6141
6142 apex_key {
6143 name: "myapex.key",
6144 public_key: "testkey.avbpubkey",
6145 private_key: "testkey.pem",
6146 }
6147
6148 cc_library_shared {
6149 name: "mylib",
6150 srcs: ["mylib.cpp"],
6151 shared_libs: ["myotherlib"],
6152 system_shared_libs: [],
6153 stl: "none",
6154 apex_available: [
6155 "myapex",
6156 "//apex_available:platform",
6157 ],
6158 }
6159
6160 cc_prebuilt_library_shared {
6161 name: "myotherlib",
6162 srcs: ["prebuilt.so"],
6163 system_shared_libs: [],
6164 stl: "none",
6165 apex_available: [
6166 "myapex",
6167 "//apex_available:platform",
6168 ],
6169 }
6170 `)
6171
6172 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006173 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006174 var builder strings.Builder
6175 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6176 androidMk := builder.String()
6177 // `myotherlib` is added to `myapex` as symlink
6178 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6179 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6180 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6181 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006182 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08006183}
6184
Jooyung Han643adc42020-02-27 13:50:06 +09006185func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006186 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006187 apex {
6188 name: "myapex",
6189 key: "myapex.key",
6190 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006191 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006192 }
6193
6194 apex_key {
6195 name: "myapex.key",
6196 public_key: "testkey.avbpubkey",
6197 private_key: "testkey.pem",
6198 }
6199
6200 cc_library {
6201 name: "mylib",
6202 srcs: ["mylib.cpp"],
6203 shared_libs: ["mylib2"],
6204 system_shared_libs: [],
6205 stl: "none",
6206 apex_available: [ "myapex" ],
6207 }
6208
6209 cc_library {
6210 name: "mylib2",
6211 srcs: ["mylib.cpp"],
6212 system_shared_libs: [],
6213 stl: "none",
6214 apex_available: [ "myapex" ],
6215 }
6216 `)
6217
6218 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6219 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6220 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6221 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6222 "lib64/mylib.so",
6223 "lib64/mylib2.so",
6224 })
6225}
6226
Jooyung Han49f67012020-04-17 13:43:10 +09006227func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006228 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006229 apex {
6230 name: "myapex",
6231 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006232 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006233 }
6234 apex_key {
6235 name: "myapex.key",
6236 public_key: "testkey.avbpubkey",
6237 private_key: "testkey.pem",
6238 }
6239 `, func(fs map[string][]byte, config android.Config) {
6240 delete(config.Targets, android.Android)
6241 config.AndroidCommonTarget = android.Target{}
6242 })
6243
6244 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6245 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6246 }
6247}
6248
Jiyong Parkbd159612020-02-28 15:22:21 +09006249func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006250 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006251 apex {
6252 name: "myapex",
6253 key: "myapex.key",
6254 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006255 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006256 }
6257
6258 apex_key {
6259 name: "myapex.key",
6260 public_key: "testkey.avbpubkey",
6261 private_key: "testkey.pem",
6262 }
6263
6264 android_app {
6265 name: "AppFoo",
6266 srcs: ["foo/bar/MyClass.java"],
6267 sdk_version: "none",
6268 system_modules: "none",
6269 apex_available: [ "myapex" ],
6270 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006271 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006272
Colin Crosscf371cc2020-11-13 11:48:42 -08006273 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006274 content := bundleConfigRule.Args["content"]
6275
6276 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006277 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 +09006278}
6279
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006280func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006281 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006282 apex {
6283 name: "myapex",
6284 key: "myapex.key",
6285 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006286 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006287 }
6288
6289 apex_key {
6290 name: "myapex.key",
6291 public_key: "testkey.avbpubkey",
6292 private_key: "testkey.pem",
6293 }
6294
6295 android_app_set {
6296 name: "AppSet",
6297 set: "AppSet.apks",
6298 }`)
6299 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006300 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006301 content := bundleConfigRule.Args["content"]
6302 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6303 s := mod.Rule("apexRule").Args["copy_commands"]
6304 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6305 if len(copyCmds) != 3 {
6306 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6307 }
6308 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6309 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6310 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6311}
6312
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006313func TestAppSetBundlePrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006314 ctx := testApex(t, "", func(fs map[string][]byte, config android.Config) {
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006315 bp := `
6316 apex_set {
6317 name: "myapex",
6318 filename: "foo_v2.apex",
6319 sanitized: {
6320 none: { set: "myapex.apks", },
6321 hwaddress: { set: "myapex.hwasan.apks", },
6322 },
6323 }`
6324 fs["Android.bp"] = []byte(bp)
6325
6326 config.TestProductVariables.SanitizeDevice = []string{"hwaddress"}
6327 })
6328
6329 m := ctx.ModuleForTests("myapex", "android_common")
6330 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6331
6332 actual := extractedApex.Inputs
6333 if len(actual) != 1 {
6334 t.Errorf("expected a single input")
6335 }
6336
6337 expected := "myapex.hwasan.apks"
6338 if actual[0].String() != expected {
6339 t.Errorf("expected %s, got %s", expected, actual[0].String())
6340 }
6341}
6342
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006343func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006344 t.Helper()
6345
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006346 bp := `
6347 java_library {
6348 name: "some-updatable-apex-lib",
6349 srcs: ["a.java"],
6350 sdk_version: "current",
6351 apex_available: [
6352 "some-updatable-apex",
6353 ],
6354 }
6355
6356 java_library {
6357 name: "some-non-updatable-apex-lib",
6358 srcs: ["a.java"],
6359 apex_available: [
6360 "some-non-updatable-apex",
6361 ],
6362 }
6363
6364 java_library {
6365 name: "some-platform-lib",
6366 srcs: ["a.java"],
6367 sdk_version: "current",
6368 installable: true,
6369 }
6370
6371 java_library {
6372 name: "some-art-lib",
6373 srcs: ["a.java"],
6374 sdk_version: "current",
6375 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006376 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006377 ],
6378 hostdex: true,
6379 }
6380
6381 apex {
6382 name: "some-updatable-apex",
6383 key: "some-updatable-apex.key",
6384 java_libs: ["some-updatable-apex-lib"],
6385 updatable: true,
6386 min_sdk_version: "current",
6387 }
6388
6389 apex {
6390 name: "some-non-updatable-apex",
6391 key: "some-non-updatable-apex.key",
6392 java_libs: ["some-non-updatable-apex-lib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006393 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006394 }
6395
6396 apex_key {
6397 name: "some-updatable-apex.key",
6398 }
6399
6400 apex_key {
6401 name: "some-non-updatable-apex.key",
6402 }
6403
6404 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006405 name: "com.android.art.debug",
6406 key: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006407 java_libs: ["some-art-lib"],
6408 updatable: true,
6409 min_sdk_version: "current",
6410 }
6411
6412 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006413 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006414 }
6415
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006416 filegroup {
6417 name: "some-updatable-apex-file_contexts",
6418 srcs: [
6419 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6420 ],
6421 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006422
6423 filegroup {
6424 name: "some-non-updatable-apex-file_contexts",
6425 srcs: [
6426 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6427 ],
6428 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006429 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006430
6431 testDexpreoptWithApexes(t, bp, errmsg, transformDexpreoptConfig)
6432}
6433
Paul Duffin064b70c2020-11-02 17:32:38 +00006434func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, transformDexpreoptConfig func(*dexpreopt.GlobalConfig)) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00006435 t.Helper()
6436
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006437 bp += cc.GatherRequiredDepsForTest(android.Android)
6438 bp += java.GatherRequiredDepsForTest()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006439
6440 fs := map[string][]byte{
6441 "a.java": nil,
6442 "a.jar": nil,
6443 "build/make/target/product/security": nil,
6444 "apex_manifest.json": nil,
6445 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006446 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00006447 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
6448 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
6449 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006450 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006451 }
6452 cc.GatherRequiredFilesForTest(fs)
6453
Paul Duffin39853512021-02-26 11:09:39 +00006454 for k, v := range filesForSdkLibrary {
6455 fs[k] = v
6456 }
Colin Crossae8600b2020-10-29 17:09:13 -07006457 config := android.TestArchConfig(buildDir, nil, bp, fs)
6458
6459 ctx := android.NewTestArchContext(config)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006460 ctx.RegisterModuleType("apex", BundleFactory)
6461 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
Paul Duffin064b70c2020-11-02 17:32:38 +00006462 ctx.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006463 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Paul Duffinc988c8e2020-04-29 18:27:14 +01006464 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Paul Duffin37856732021-02-26 14:24:15 +00006465 ctx.PreArchMutators(android.RegisterComponentsMutator)
Paul Duffin021f4e52020-07-30 16:04:17 +01006466 android.RegisterPrebuiltMutators(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006467 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006468 java.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinf38931c2021-02-05 16:58:28 +00006469 java.RegisterHiddenApiSingletonComponents(ctx)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006470 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6471 ctx.PreDepsMutators(RegisterPreDepsMutators)
6472 ctx.PostDepsMutators(RegisterPostDepsMutators)
6473
Colin Crossae8600b2020-10-29 17:09:13 -07006474 ctx.Register()
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006475
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006476 pathCtx := android.PathContextForTesting(config)
6477 dexpreoptConfig := dexpreopt.GlobalConfigForTests(pathCtx)
6478 transformDexpreoptConfig(dexpreoptConfig)
6479 dexpreopt.SetTestGlobalConfig(config, dexpreoptConfig)
6480
Paul Duffinf38931c2021-02-05 16:58:28 +00006481 // Make sure that any changes to these dexpreopt properties are mirrored in the corresponding
Paul Duffin4fd997b2021-02-03 20:06:33 +00006482 // product variables.
Paul Duffinf38931c2021-02-05 16:58:28 +00006483 config.TestProductVariables.BootJars = dexpreoptConfig.BootJars
6484 config.TestProductVariables.UpdatableBootJars = dexpreoptConfig.UpdatableBootJars
6485
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006486 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6487 android.FailIfErrored(t, errs)
6488
6489 _, errs = ctx.PrepareBuildActions(config)
6490 if errmsg == "" {
6491 android.FailIfErrored(t, errs)
6492 } else if len(errs) > 0 {
6493 android.FailIfNoMatchingErrors(t, errmsg, errs)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006494 } else {
6495 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6496 }
Paul Duffin064b70c2020-11-02 17:32:38 +00006497
6498 return ctx
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006499}
6500
Jooyung Han548640b2020-04-27 12:10:30 +09006501func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
6502 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6503 apex {
6504 name: "myapex",
6505 key: "myapex.key",
6506 updatable: true,
6507 }
6508
6509 apex_key {
6510 name: "myapex.key",
6511 public_key: "testkey.avbpubkey",
6512 private_key: "testkey.pem",
6513 }
6514 `)
6515}
6516
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006517func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
6518 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
6519 apex {
6520 name: "myapex",
6521 key: "myapex.key",
6522 }
6523
6524 apex_key {
6525 name: "myapex.key",
6526 public_key: "testkey.avbpubkey",
6527 private_key: "testkey.pem",
6528 }
6529 `)
6530}
6531
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006532func TestNoUpdatableJarsInBootImage(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006533 var err string
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006534 var transform func(*dexpreopt.GlobalConfig)
6535
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006536 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
6537 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006538 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006539 }
6540 testNoUpdatableJarsInBootImage(t, "", transform)
6541 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006542
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006543 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffind376f792021-01-26 11:59:35 +00006544 err = `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006545 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffind376f792021-01-26 11:59:35 +00006546 config.BootJars = android.CreateTestConfiguredJarList([]string{"com.android.art.debug:some-art-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006547 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006548 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006549 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006550
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006551 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 -07006552 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 +01006553 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006554 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006555 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006556 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006557 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006558
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006559 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 -07006560 err = `module "some-non-updatable-apex-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006561 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006562 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006563 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006564 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006565 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006566
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006567 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 -07006568 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 +01006569 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006570 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-updatable-apex:some-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006571 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006572 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006573 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006574
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006575 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
6576 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006577 config.BootJars = android.CreateTestConfiguredJarList([]string{"some-non-updatable-apex:some-non-updatable-apex-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006578 }
6579 testNoUpdatableJarsInBootImage(t, "", transform)
6580 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006581
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006582 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006583 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006584 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006585 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006586 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006587 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006588 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006589
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006590 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006591 err = "failed to find a dex jar path for module 'nonexistent'"
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006592 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006593 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:nonexistent"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006594 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006595 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006596 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006597
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006598 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Colin Crossaede88c2020-08-11 12:17:01 -07006599 err = `module "some-platform-lib" is not allowed in the ART boot image`
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006600 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006601 config.ArtApexJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006602 }
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006603 testNoUpdatableJarsInBootImage(t, err, transform)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006604 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006605
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006606 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
6607 transform = func(config *dexpreopt.GlobalConfig) {
Paul Duffine10dfa42020-10-23 21:23:44 +01006608 config.BootJars = android.CreateTestConfiguredJarList([]string{"platform:some-platform-lib"})
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006609 }
6610 testNoUpdatableJarsInBootImage(t, "", transform)
6611 })
Paul Duffin064b70c2020-11-02 17:32:38 +00006612
6613}
6614
6615func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
6616 transform := func(config *dexpreopt.GlobalConfig) {
6617 config.BootJars = android.CreateTestConfiguredJarList([]string{"myapex:libfoo"})
6618 }
6619 t.Run("prebuilt no source", func(t *testing.T) {
6620 testDexpreoptWithApexes(t, `
6621 prebuilt_apex {
6622 name: "myapex" ,
6623 arch: {
6624 arm64: {
6625 src: "myapex-arm64.apex",
6626 },
6627 arm: {
6628 src: "myapex-arm.apex",
6629 },
6630 },
6631 exported_java_libs: ["libfoo"],
6632 }
6633
6634 java_import {
6635 name: "libfoo",
6636 jars: ["libfoo.jar"],
6637 }
6638`, "", transform)
6639 })
6640
6641 t.Run("prebuilt no source", func(t *testing.T) {
6642 testDexpreoptWithApexes(t, `
6643 prebuilt_apex {
6644 name: "myapex" ,
6645 arch: {
6646 arm64: {
6647 src: "myapex-arm64.apex",
6648 },
6649 arm: {
6650 src: "myapex-arm.apex",
6651 },
6652 },
6653 exported_java_libs: ["libfoo"],
6654 }
6655
6656 java_import {
6657 name: "libfoo",
6658 jars: ["libfoo.jar"],
6659 }
6660`, "", transform)
6661 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006662}
6663
Andrei Onea115e7e72020-06-05 21:14:03 +01006664func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, apexBootJars []string, rules []android.Rule) {
6665 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01006666 bp += `
6667 apex_key {
6668 name: "myapex.key",
6669 public_key: "testkey.avbpubkey",
6670 private_key: "testkey.pem",
6671 }`
6672 fs := map[string][]byte{
6673 "lib1/src/A.java": nil,
6674 "lib2/src/B.java": nil,
6675 "system/sepolicy/apex/myapex-file_contexts": nil,
6676 }
6677
Colin Crossae8600b2020-10-29 17:09:13 -07006678 config := android.TestArchConfig(buildDir, nil, bp, fs)
6679 android.SetTestNeverallowRules(config, rules)
6680 updatableBootJars := make([]string, 0, len(apexBootJars))
6681 for _, apexBootJar := range apexBootJars {
6682 updatableBootJars = append(updatableBootJars, "myapex:"+apexBootJar)
6683 }
6684 config.TestProductVariables.UpdatableBootJars = android.CreateTestConfiguredJarList(updatableBootJars)
6685
6686 ctx := android.NewTestArchContext(config)
Andrei Onea115e7e72020-06-05 21:14:03 +01006687 ctx.RegisterModuleType("apex", BundleFactory)
6688 ctx.RegisterModuleType("apex_key", ApexKeyFactory)
6689 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
6690 cc.RegisterRequiredBuildComponentsForTest(ctx)
Paul Duffinc059c8c2021-01-20 17:13:52 +00006691 java.RegisterRequiredBuildComponentsForTest(ctx)
Andrei Onea115e7e72020-06-05 21:14:03 +01006692 ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators)
6693 ctx.PreDepsMutators(RegisterPreDepsMutators)
6694 ctx.PostDepsMutators(RegisterPostDepsMutators)
6695 ctx.PostDepsMutators(android.RegisterNeverallowMutator)
6696
Colin Crossae8600b2020-10-29 17:09:13 -07006697 ctx.Register()
Andrei Onea115e7e72020-06-05 21:14:03 +01006698
6699 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
6700 android.FailIfErrored(t, errs)
6701
6702 _, errs = ctx.PrepareBuildActions(config)
6703 if errmsg == "" {
6704 android.FailIfErrored(t, errs)
6705 } else if len(errs) > 0 {
6706 android.FailIfNoMatchingErrors(t, errmsg, errs)
6707 return
6708 } else {
6709 t.Fatalf("missing expected error %q (0 errors are returned)", errmsg)
6710 }
6711}
6712
6713func TestApexPermittedPackagesRules(t *testing.T) {
6714 testcases := []struct {
6715 name string
6716 expectedError string
6717 bp string
6718 bootJars []string
6719 modulesPackages map[string][]string
6720 }{
6721
6722 {
6723 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
6724 expectedError: "",
6725 bp: `
6726 java_library {
6727 name: "bcp_lib1",
6728 srcs: ["lib1/src/*.java"],
6729 permitted_packages: ["foo.bar"],
6730 apex_available: ["myapex"],
6731 sdk_version: "none",
6732 system_modules: "none",
6733 }
6734 java_library {
6735 name: "nonbcp_lib2",
6736 srcs: ["lib2/src/*.java"],
6737 apex_available: ["myapex"],
6738 permitted_packages: ["a.b"],
6739 sdk_version: "none",
6740 system_modules: "none",
6741 }
6742 apex {
6743 name: "myapex",
6744 key: "myapex.key",
6745 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006746 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006747 }`,
6748 bootJars: []string{"bcp_lib1"},
6749 modulesPackages: map[string][]string{
6750 "myapex": []string{
6751 "foo.bar",
6752 },
6753 },
6754 },
6755 {
6756 name: "Bootclasspath apex jar not satisfying allowed module packages.",
6757 expectedError: `module "bcp_lib2" .* which is restricted because jars that are part of the myapex module may only allow these packages: foo.bar. Please jarjar or move code around.`,
6758 bp: `
6759 java_library {
6760 name: "bcp_lib1",
6761 srcs: ["lib1/src/*.java"],
6762 apex_available: ["myapex"],
6763 permitted_packages: ["foo.bar"],
6764 sdk_version: "none",
6765 system_modules: "none",
6766 }
6767 java_library {
6768 name: "bcp_lib2",
6769 srcs: ["lib2/src/*.java"],
6770 apex_available: ["myapex"],
6771 permitted_packages: ["foo.bar", "bar.baz"],
6772 sdk_version: "none",
6773 system_modules: "none",
6774 }
6775 apex {
6776 name: "myapex",
6777 key: "myapex.key",
6778 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006779 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01006780 }
6781 `,
6782 bootJars: []string{"bcp_lib1", "bcp_lib2"},
6783 modulesPackages: map[string][]string{
6784 "myapex": []string{
6785 "foo.bar",
6786 },
6787 },
6788 },
6789 }
6790 for _, tc := range testcases {
6791 t.Run(tc.name, func(t *testing.T) {
6792 rules := createApexPermittedPackagesRules(tc.modulesPackages)
6793 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
6794 })
6795 }
6796}
6797
Jiyong Park62304bb2020-04-13 16:19:48 +09006798func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006799 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09006800 apex {
6801 name: "myapex",
6802 key: "myapex.key",
6803 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006804 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09006805 }
6806
6807 apex_key {
6808 name: "myapex.key",
6809 public_key: "testkey.avbpubkey",
6810 private_key: "testkey.pem",
6811 }
6812
6813 cc_library {
6814 name: "mylib",
6815 srcs: ["mylib.cpp"],
6816 system_shared_libs: [],
6817 stl: "none",
6818 stubs: {
6819 versions: ["1"],
6820 },
6821 apex_available: ["myapex"],
6822 }
6823
6824 cc_library {
6825 name: "myprivlib",
6826 srcs: ["mylib.cpp"],
6827 system_shared_libs: [],
6828 stl: "none",
6829 apex_available: ["myapex"],
6830 }
6831
6832
6833 cc_test {
6834 name: "mytest",
6835 gtest: false,
6836 srcs: ["mylib.cpp"],
6837 system_shared_libs: [],
6838 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09006839 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09006840 test_for: ["myapex"]
6841 }
Jiyong Park46a512f2020-12-04 18:02:13 +09006842
6843 cc_library {
6844 name: "mytestlib",
6845 srcs: ["mylib.cpp"],
6846 system_shared_libs: [],
6847 shared_libs: ["mylib", "myprivlib"],
6848 stl: "none",
6849 test_for: ["myapex"],
6850 }
6851
6852 cc_benchmark {
6853 name: "mybench",
6854 srcs: ["mylib.cpp"],
6855 system_shared_libs: [],
6856 shared_libs: ["mylib", "myprivlib"],
6857 stl: "none",
6858 test_for: ["myapex"],
6859 }
Jiyong Park62304bb2020-04-13 16:19:48 +09006860 `)
6861
6862 // the test 'mytest' is a test for the apex, therefore is linked to the
6863 // actual implementation of mylib instead of its stub.
6864 ldFlags := ctx.ModuleForTests("mytest", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6865 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6866 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park46a512f2020-12-04 18:02:13 +09006867
6868 // The same should be true for cc_library
6869 ldFlags = ctx.ModuleForTests("mytestlib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
6870 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6871 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
6872
6873 // ... and for cc_benchmark
6874 ldFlags = ctx.ModuleForTests("mybench", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
6875 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared/mylib.so")
6876 ensureNotContains(t, ldFlags, "mylib/android_arm64_armv8-a_shared_1/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09006877}
6878
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006879// TODO(jungjw): Move this to proptools
6880func intPtr(i int) *int {
6881 return &i
6882}
6883
6884func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006885 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006886 apex_set {
6887 name: "myapex",
6888 set: "myapex.apks",
6889 filename: "foo_v2.apex",
6890 overrides: ["foo"],
6891 }
6892 `, func(fs map[string][]byte, config android.Config) {
6893 config.TestProductVariables.Platform_sdk_version = intPtr(30)
Jaewoong Jung829b7132020-06-10 12:23:32 -07006894 config.Targets[android.Android] = []android.Target{
6895 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
6896 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
6897 }
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006898 })
6899
6900 m := ctx.ModuleForTests("myapex", "android_common")
6901
6902 // Check extract_apks tool parameters.
6903 extractedApex := m.Output(buildDir + "/.intermediates/myapex/android_common/foo_v2.apex")
6904 actual := extractedApex.Args["abis"]
6905 expected := "ARMEABI_V7A,ARM64_V8A"
6906 if actual != expected {
6907 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6908 }
6909 actual = extractedApex.Args["sdk-version"]
6910 expected = "30"
6911 if actual != expected {
6912 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
6913 }
6914
6915 a := m.Module().(*ApexSet)
6916 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07006917 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07006918 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
6919 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
6920 }
6921}
6922
Jiyong Park7d95a512020-05-10 15:16:24 +09006923func TestNoStaticLinkingToStubsLib(t *testing.T) {
6924 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
6925 apex {
6926 name: "myapex",
6927 key: "myapex.key",
6928 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006929 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09006930 }
6931
6932 apex_key {
6933 name: "myapex.key",
6934 public_key: "testkey.avbpubkey",
6935 private_key: "testkey.pem",
6936 }
6937
6938 cc_library {
6939 name: "mylib",
6940 srcs: ["mylib.cpp"],
6941 static_libs: ["otherlib"],
6942 system_shared_libs: [],
6943 stl: "none",
6944 apex_available: [ "myapex" ],
6945 }
6946
6947 cc_library {
6948 name: "otherlib",
6949 srcs: ["mylib.cpp"],
6950 system_shared_libs: [],
6951 stl: "none",
6952 stubs: {
6953 versions: ["1", "2", "3"],
6954 },
6955 apex_available: [ "myapex" ],
6956 }
6957 `)
6958}
6959
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006960func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006961 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006962 apex {
6963 name: "myapex",
6964 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006965 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09006966 }
6967
6968 apex_key {
6969 name: "myapex.key",
6970 public_key: "testkey.avbpubkey",
6971 private_key: "testkey.pem",
6972 }
6973
6974 prebuilt_apex {
6975 name: "myapex",
6976 prefer: true,
6977 arch: {
6978 arm64: {
6979 src: "myapex-arm64.apex",
6980 },
6981 arm: {
6982 src: "myapex-arm.apex",
6983 },
6984 },
6985 }
6986
6987 apex_set {
6988 name: "myapex_set",
6989 set: "myapex.apks",
6990 filename: "myapex_set.apex",
6991 overrides: ["myapex"],
6992 }
6993 `)
6994
6995 apexKeysText := ctx.SingletonForTests("apex_keys_text")
6996 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
6997 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 +09006998 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 +09006999}
7000
Jooyung Han938b5932020-06-20 12:47:47 +09007001func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007002 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007003 apex {
7004 name: "myapex",
7005 key: "myapex.key",
7006 apps: ["app"],
7007 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007008 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007009 }
7010
7011 apex_key {
7012 name: "myapex.key",
7013 public_key: "testkey.avbpubkey",
7014 private_key: "testkey.pem",
7015 }
7016
7017 android_app {
7018 name: "app",
7019 srcs: ["foo/bar/MyClass.java"],
7020 package_name: "foo",
7021 sdk_version: "none",
7022 system_modules: "none",
7023 apex_available: [ "myapex" ],
7024 }
7025 `, withFiles(map[string][]byte{
7026 "sub/Android.bp": []byte(`
7027 override_apex {
7028 name: "override_myapex",
7029 base: "myapex",
7030 apps: ["override_app"],
7031 allowed_files: ":allowed",
7032 }
7033 // Overridable "path" property should be referenced indirectly
7034 filegroup {
7035 name: "allowed",
7036 srcs: ["allowed.txt"],
7037 }
7038 override_android_app {
7039 name: "override_app",
7040 base: "app",
7041 package_name: "bar",
7042 }
7043 `),
7044 }))
7045
7046 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7047 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7048 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7049 }
7050
7051 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7052 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7053 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7054 }
7055}
7056
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007057func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007058 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007059 apex {
7060 name: "myapex",
7061 key: "myapex.key",
7062 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007063 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007064 }
7065
7066 apex_key {
7067 name: "myapex.key",
7068 public_key: "testkey.avbpubkey",
7069 private_key: "testkey.pem",
7070 }
7071
7072 cc_library {
7073 name: "mylib",
7074 srcs: ["mylib.cpp"],
7075 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007076 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007077 },
7078 apex_available: ["myapex"],
7079 }
7080
7081 cc_prebuilt_library_shared {
7082 name: "mylib",
7083 prefer: false,
7084 srcs: ["prebuilt.so"],
7085 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007086 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007087 },
7088 apex_available: ["myapex"],
7089 }
7090 `)
7091}
7092
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007093func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007094 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007095 apex {
7096 name: "myapex",
7097 key: "myapex.key",
7098 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007099 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007100 }
7101 apex_key {
7102 name: "myapex.key",
7103 public_key: "testkey.avbpubkey",
7104 private_key: "testkey.pem",
7105 }
7106 `, func(fs map[string][]byte, config android.Config) {
7107 config.TestProductVariables.CompressedApex = proptools.BoolPtr(true)
7108 })
7109
7110 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7111 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7112
7113 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7114 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7115
7116 // Make sure output of bundle is .capex
7117 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7118 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7119
7120 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007121 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007122 var builder strings.Builder
7123 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7124 androidMk := builder.String()
7125 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7126}
7127
Martin Stjernholm2856c662020-12-02 15:03:42 +00007128func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007129 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007130 apex {
7131 name: "myapex",
7132 key: "myapex.key",
7133 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007134 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007135 }
7136
7137 apex_key {
7138 name: "myapex.key",
7139 public_key: "testkey.avbpubkey",
7140 private_key: "testkey.pem",
7141 }
7142
7143 cc_library {
7144 name: "mylib",
7145 srcs: ["mylib.cpp"],
7146 apex_available: ["myapex"],
7147 shared_libs: ["otherlib"],
7148 system_shared_libs: [],
7149 }
7150
7151 cc_library {
7152 name: "otherlib",
7153 srcs: ["mylib.cpp"],
7154 stubs: {
7155 versions: ["current"],
7156 },
7157 }
7158
7159 cc_prebuilt_library_shared {
7160 name: "otherlib",
7161 prefer: true,
7162 srcs: ["prebuilt.so"],
7163 stubs: {
7164 versions: ["current"],
7165 },
7166 }
7167 `)
7168
7169 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007170 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007171 var builder strings.Builder
7172 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7173 androidMk := builder.String()
7174
7175 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7176 // a thing there.
7177 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7178}
7179
Jiyong Parke3867542020-12-03 17:28:25 +09007180func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007181 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007182 apex {
7183 name: "myapex",
7184 key: "myapex.key",
7185 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007186 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007187 }
7188
7189 apex_key {
7190 name: "myapex.key",
7191 public_key: "testkey.avbpubkey",
7192 private_key: "testkey.pem",
7193 }
7194
7195 cc_library {
7196 name: "mylib",
7197 srcs: ["mylib.cpp"],
7198 system_shared_libs: [],
7199 stl: "none",
7200 apex_available: ["myapex"],
7201 shared_libs: ["mylib2"],
7202 target: {
7203 apex: {
7204 exclude_shared_libs: ["mylib2"],
7205 },
7206 },
7207 }
7208
7209 cc_library {
7210 name: "mylib2",
7211 srcs: ["mylib.cpp"],
7212 system_shared_libs: [],
7213 stl: "none",
7214 }
7215 `)
7216
7217 // Check if mylib is linked to mylib2 for the non-apex target
7218 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7219 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7220
7221 // Make sure that the link doesn't occur for the apex target
7222 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7223 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7224
7225 // It shouldn't appear in the copy cmd as well.
7226 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7227 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7228}
7229
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007230func TestPrebuiltStubLibDep(t *testing.T) {
7231 bpBase := `
7232 apex {
7233 name: "myapex",
7234 key: "myapex.key",
7235 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007236 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007237 }
7238 apex_key {
7239 name: "myapex.key",
7240 public_key: "testkey.avbpubkey",
7241 private_key: "testkey.pem",
7242 }
7243 cc_library {
7244 name: "mylib",
7245 srcs: ["mylib.cpp"],
7246 apex_available: ["myapex"],
7247 shared_libs: ["stublib"],
7248 system_shared_libs: [],
7249 }
7250 apex {
7251 name: "otherapex",
7252 enabled: %s,
7253 key: "myapex.key",
7254 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007255 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007256 }
7257 `
7258
7259 stublibSourceBp := `
7260 cc_library {
7261 name: "stublib",
7262 srcs: ["mylib.cpp"],
7263 apex_available: ["otherapex"],
7264 system_shared_libs: [],
7265 stl: "none",
7266 stubs: {
7267 versions: ["1"],
7268 },
7269 }
7270 `
7271
7272 stublibPrebuiltBp := `
7273 cc_prebuilt_library_shared {
7274 name: "stublib",
7275 srcs: ["prebuilt.so"],
7276 apex_available: ["otherapex"],
7277 stubs: {
7278 versions: ["1"],
7279 },
7280 %s
7281 }
7282 `
7283
7284 tests := []struct {
7285 name string
7286 stublibBp string
7287 usePrebuilt bool
7288 modNames []string // Modules to collect AndroidMkEntries for
7289 otherApexEnabled []string
7290 }{
7291 {
7292 name: "only_source",
7293 stublibBp: stublibSourceBp,
7294 usePrebuilt: false,
7295 modNames: []string{"stublib"},
7296 otherApexEnabled: []string{"true", "false"},
7297 },
7298 {
7299 name: "source_preferred",
7300 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
7301 usePrebuilt: false,
7302 modNames: []string{"stublib", "prebuilt_stublib"},
7303 otherApexEnabled: []string{"true", "false"},
7304 },
7305 {
7306 name: "prebuilt_preferred",
7307 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
7308 usePrebuilt: true,
7309 modNames: []string{"stublib", "prebuilt_stublib"},
7310 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7311 },
7312 {
7313 name: "only_prebuilt",
7314 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
7315 usePrebuilt: true,
7316 modNames: []string{"stublib"},
7317 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
7318 },
7319 }
7320
7321 for _, test := range tests {
7322 t.Run(test.name, func(t *testing.T) {
7323 for _, otherApexEnabled := range test.otherApexEnabled {
7324 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007325 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007326
7327 type modAndMkEntries struct {
7328 mod *cc.Module
7329 mkEntries android.AndroidMkEntries
7330 }
7331 entries := []*modAndMkEntries{}
7332
7333 // Gather shared lib modules that are installable
7334 for _, modName := range test.modNames {
7335 for _, variant := range ctx.ModuleVariantsForTests(modName) {
7336 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
7337 continue
7338 }
7339 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08007340 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007341 continue
7342 }
Colin Crossaa255532020-07-03 13:18:24 -07007343 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007344 if ent.Disabled {
7345 continue
7346 }
7347 entries = append(entries, &modAndMkEntries{
7348 mod: mod,
7349 mkEntries: ent,
7350 })
7351 }
7352 }
7353 }
7354
7355 var entry *modAndMkEntries = nil
7356 for _, ent := range entries {
7357 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
7358 if entry != nil {
7359 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
7360 } else {
7361 entry = ent
7362 }
7363 }
7364 }
7365
7366 if entry == nil {
7367 t.Errorf("AndroidMk entry for \"stublib\" missing")
7368 } else {
7369 isPrebuilt := entry.mod.Prebuilt() != nil
7370 if isPrebuilt != test.usePrebuilt {
7371 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
7372 }
7373 if !entry.mod.IsStubs() {
7374 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
7375 }
7376 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
7377 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
7378 }
Jiyong Park892a98f2020-12-14 09:20:00 +09007379 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
7380 expected := "-D__STUBLIB_API__=1"
7381 if !android.InList(expected, cflags) {
7382 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
7383 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007384 }
7385 })
7386 }
7387 })
7388 }
7389}
7390
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07007391func TestMain(m *testing.M) {
7392 run := func() int {
7393 setUp()
7394 defer tearDown()
7395
7396 return m.Run()
7397 }
7398
7399 os.Exit(run())
7400}