blob: d07c48de5c95f8d71612497d668b9a516aa43517 [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 "os"
Jooyung Han39edb6c2019-11-06 16:53:07 +090020 "path"
Paul Duffin37856732021-02-26 14:24:15 +000021 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070022 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010023 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
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
Jooyung Hand3639552019-08-09 12:57:43 +090041// names returns name list from white space separated string
42func names(s string) (ns []string) {
43 for _, n := range strings.Split(s, " ") {
44 if len(n) > 0 {
45 ns = append(ns, n)
46 }
47 }
48 return
49}
50
Paul Duffin40b62572021-03-20 11:39:01 +000051func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090052 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010053 android.GroupFixturePreparers(
54 prepareForApexTest,
55 android.GroupFixturePreparers(preparers...),
56 ).
Paul Duffine05480a2021-03-08 15:07:14 +000057 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000058 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090059}
60
Paul Duffin40b62572021-03-20 11:39:01 +000061func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090062 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010063
64 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000065 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010066 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000067 }
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 result := android.GroupFixturePreparers(
70 prepareForApexTest,
71 android.GroupFixturePreparers(preparers...),
72 optionalBpPreparer,
73 ).RunTest(t)
74
Paul Duffine05480a2021-03-08 15:07:14 +000075 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090076}
77
Paul Duffin810f33d2021-03-09 14:12:32 +000078func withFiles(files android.MockFS) android.FixturePreparer {
79 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090080}
81
Paul Duffin810f33d2021-03-09 14:12:32 +000082func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
83 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090084 for k, v := range targets {
85 config.Targets[k] = v
86 }
Paul Duffin810f33d2021-03-09 14:12:32 +000087 })
Jooyung Han344d5432019-08-23 11:17:39 +090088}
89
Jooyung Han35155c42020-02-06 17:33:20 +090090// withNativeBridgeTargets sets configuration with targets including:
91// - X86_64 (primary)
92// - X86 (secondary)
93// - Arm64 on X86_64 (native bridge)
94// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000095var withNativeBridgeEnabled = android.FixtureModifyConfig(
96 func(config android.Config) {
97 config.Targets[android.Android] = []android.Target{
98 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
99 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
103 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
106 }
107 },
108)
109
110func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
111 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
112 variables.ManifestPackageNameOverrides = specs
113 })
Jooyung Han35155c42020-02-06 17:33:20 +0900114}
115
Paul Duffin810f33d2021-03-09 14:12:32 +0000116var withBinder32bit = android.FixtureModifyProductVariables(
117 func(variables android.FixtureProductVariables) {
118 variables.Binder32bit = proptools.BoolPtr(true)
119 },
120)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900121
Paul Duffin810f33d2021-03-09 14:12:32 +0000122var withUnbundledBuild = android.FixtureModifyProductVariables(
123 func(variables android.FixtureProductVariables) {
124 variables.Unbundled_build = proptools.BoolPtr(true)
125 },
126)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900127
Paul Duffin284165a2021-03-29 01:50:31 +0100128// Legacy preparer used for running tests within the apex package.
129//
130// This includes everything that was needed to run any test in the apex package prior to the
131// introduction of the test fixtures. Tests that are being converted to use fixtures directly
132// rather than through the testApex...() methods should avoid using this and instead use the
133// various preparers directly, using android.GroupFixturePreparers(...) to group them when
134// necessary.
135//
136// deprecated
137var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000138 // General preparers in alphabetical order as test infrastructure will enforce correct
139 // registration order.
140 android.PrepareForTestWithAndroidBuildComponents,
141 bpf.PrepareForTestWithBpf,
142 cc.PrepareForTestWithCcBuildComponents,
143 java.PrepareForTestWithJavaDefaultModules,
144 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
145 rust.PrepareForTestWithRustDefaultModules,
146 sh.PrepareForTestWithShBuildComponents,
147
148 PrepareForTestWithApexBuildComponents,
149
150 // Additional apex test specific preparers.
151 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
152 filegroup {
153 name: "myapex-file_contexts",
154 srcs: [
155 "apex/myapex-file_contexts",
156 ],
157 }
158 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000159 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000160 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000161 "a.java": nil,
162 "PrebuiltAppFoo.apk": nil,
163 "PrebuiltAppFooPriv.apk": nil,
164 "apex_manifest.json": nil,
165 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000166 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
167 "system/sepolicy/apex/myapex2-file_contexts": nil,
168 "system/sepolicy/apex/otherapex-file_contexts": nil,
169 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
170 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
171 "mylib.cpp": nil,
172 "mytest.cpp": nil,
173 "mytest1.cpp": nil,
174 "mytest2.cpp": nil,
175 "mytest3.cpp": nil,
176 "myprebuilt": nil,
177 "my_include": nil,
178 "foo/bar/MyClass.java": nil,
179 "prebuilt.jar": nil,
180 "prebuilt.so": nil,
181 "vendor/foo/devkeys/test.x509.pem": nil,
182 "vendor/foo/devkeys/test.pk8": nil,
183 "testkey.x509.pem": nil,
184 "testkey.pk8": nil,
185 "testkey.override.x509.pem": nil,
186 "testkey.override.pk8": nil,
187 "vendor/foo/devkeys/testkey.avbpubkey": nil,
188 "vendor/foo/devkeys/testkey.pem": nil,
189 "NOTICE": nil,
190 "custom_notice": nil,
191 "custom_notice_for_static_lib": nil,
192 "testkey2.avbpubkey": nil,
193 "testkey2.pem": nil,
194 "myapex-arm64.apex": nil,
195 "myapex-arm.apex": nil,
196 "myapex.apks": nil,
197 "frameworks/base/api/current.txt": nil,
198 "framework/aidl/a.aidl": nil,
199 "build/make/core/proguard.flags": nil,
200 "build/make/core/proguard_basic_keeps.flags": nil,
201 "dummy.txt": nil,
202 "baz": nil,
203 "bar/baz": nil,
204 "testdata/baz": nil,
205 "AppSet.apks": nil,
206 "foo.rs": nil,
207 "libfoo.jar": nil,
208 "libbar.jar": nil,
209 },
210 ),
211
212 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
213 variables.DeviceVndkVersion = proptools.StringPtr("current")
214 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
215 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
216 variables.Platform_sdk_codename = proptools.StringPtr("Q")
217 variables.Platform_sdk_final = proptools.BoolPtr(false)
218 variables.Platform_version_active_codenames = []string{"Q"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900219 variables.Platform_vndk_version = proptools.StringPtr("29")
Paul Duffin37aad602021-03-08 09:47:16 +0000220 }),
221)
222
Paul Duffin52bfaa42021-03-23 23:40:12 +0000223var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
224 "system/sepolicy/apex/myapex-file_contexts": nil,
225})
226
Jooyung Han643adc42020-02-27 13:50:06 +0900227// ensure that 'result' equals 'expected'
228func ensureEquals(t *testing.T, result string, expected string) {
229 t.Helper()
230 if result != expected {
231 t.Errorf("%q != %q", expected, result)
232 }
233}
234
Jiyong Park25fc6a92018-11-18 18:02:45 +0900235// ensure that 'result' contains 'expected'
236func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900237 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900238 if !strings.Contains(result, expected) {
239 t.Errorf("%q is not found in %q", expected, result)
240 }
241}
242
Liz Kammer5bd365f2020-05-27 15:15:11 -0700243// ensure that 'result' contains 'expected' exactly one time
244func ensureContainsOnce(t *testing.T, result string, expected string) {
245 t.Helper()
246 count := strings.Count(result, expected)
247 if count != 1 {
248 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
249 }
250}
251
Jiyong Park25fc6a92018-11-18 18:02:45 +0900252// ensures that 'result' does not contain 'notExpected'
253func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900254 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900255 if strings.Contains(result, notExpected) {
256 t.Errorf("%q is found in %q", notExpected, result)
257 }
258}
259
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700260func ensureMatches(t *testing.T, result string, expectedRex string) {
261 ok, err := regexp.MatchString(expectedRex, result)
262 if err != nil {
263 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
264 return
265 }
266 if !ok {
267 t.Errorf("%s does not match regular expession %s", result, expectedRex)
268 }
269}
270
Jiyong Park25fc6a92018-11-18 18:02:45 +0900271func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900272 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900273 if !android.InList(expected, result) {
274 t.Errorf("%q is not found in %v", expected, result)
275 }
276}
277
278func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900279 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280 if android.InList(notExpected, result) {
281 t.Errorf("%q is found in %v", notExpected, result)
282 }
283}
284
Jooyung Hane1633032019-08-01 17:41:43 +0900285func ensureListEmpty(t *testing.T, result []string) {
286 t.Helper()
287 if len(result) > 0 {
288 t.Errorf("%q is expected to be empty", result)
289 }
290}
291
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000292func ensureListNotEmpty(t *testing.T, result []string) {
293 t.Helper()
294 if len(result) == 0 {
295 t.Errorf("%q is expected to be not empty", result)
296 }
297}
298
Jiyong Park25fc6a92018-11-18 18:02:45 +0900299// Minimal test
300func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800301 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900302 apex_defaults {
303 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900304 manifest: ":myapex.manifest",
305 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900306 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900307 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900308 native_shared_libs: [
309 "mylib",
310 "libfoo.ffi",
311 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900312 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800313 multilib: {
314 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900315 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800316 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900317 },
Jiyong Park77acec62020-06-01 21:39:15 +0900318 java_libs: [
319 "myjar",
320 "myjar_dex",
321 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000322 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900323 }
324
Jiyong Park30ca9372019-02-07 16:27:23 +0900325 apex {
326 name: "myapex",
327 defaults: ["myapex-defaults"],
328 }
329
Jiyong Park25fc6a92018-11-18 18:02:45 +0900330 apex_key {
331 name: "myapex.key",
332 public_key: "testkey.avbpubkey",
333 private_key: "testkey.pem",
334 }
335
Jiyong Park809bb722019-02-13 21:33:49 +0900336 filegroup {
337 name: "myapex.manifest",
338 srcs: ["apex_manifest.json"],
339 }
340
341 filegroup {
342 name: "myapex.androidmanifest",
343 srcs: ["AndroidManifest.xml"],
344 }
345
Jiyong Park25fc6a92018-11-18 18:02:45 +0900346 cc_library {
347 name: "mylib",
348 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900349 shared_libs: [
350 "mylib2",
351 "libbar.ffi",
352 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900353 system_shared_libs: [],
354 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000355 // TODO: remove //apex_available:platform
356 apex_available: [
357 "//apex_available:platform",
358 "myapex",
359 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900360 }
361
Alex Light3d673592019-01-18 14:37:31 -0800362 cc_binary {
363 name: "foo",
364 srcs: ["mylib.cpp"],
365 compile_multilib: "both",
366 multilib: {
367 lib32: {
368 suffix: "32",
369 },
370 lib64: {
371 suffix: "64",
372 },
373 },
374 symlinks: ["foo_link_"],
375 symlink_preferred_arch: true,
376 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800377 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700378 apex_available: [ "myapex", "com.android.gki.*" ],
379 }
380
Jiyong Park99644e92020-11-17 22:21:02 +0900381 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000382 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900383 srcs: ["foo.rs"],
384 rlibs: ["libfoo.rlib.rust"],
385 dylibs: ["libfoo.dylib.rust"],
386 apex_available: ["myapex"],
387 }
388
389 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000390 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900391 srcs: ["foo.rs"],
392 crate_name: "foo",
393 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900394 shared_libs: ["libfoo.shared_from_rust"],
395 }
396
397 cc_library_shared {
398 name: "libfoo.shared_from_rust",
399 srcs: ["mylib.cpp"],
400 system_shared_libs: [],
401 stl: "none",
402 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900403 }
404
405 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000406 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900407 srcs: ["foo.rs"],
408 crate_name: "foo",
409 apex_available: ["myapex"],
410 }
411
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900412 rust_ffi_shared {
413 name: "libfoo.ffi",
414 srcs: ["foo.rs"],
415 crate_name: "foo",
416 apex_available: ["myapex"],
417 }
418
419 rust_ffi_shared {
420 name: "libbar.ffi",
421 srcs: ["foo.rs"],
422 crate_name: "bar",
423 apex_available: ["myapex"],
424 }
425
Yifan Hongd22a84a2020-07-28 17:37:46 -0700426 apex {
427 name: "com.android.gki.fake",
428 binaries: ["foo"],
429 key: "myapex.key",
430 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000431 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800432 }
433
Paul Duffindddd5462020-04-07 15:25:44 +0100434 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900435 name: "mylib2",
436 srcs: ["mylib.cpp"],
437 system_shared_libs: [],
438 stl: "none",
Jiyong Park52818fc2019-03-18 12:01:38 +0900439 notice: "custom_notice",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900440 static_libs: ["libstatic"],
441 // TODO: remove //apex_available:platform
442 apex_available: [
443 "//apex_available:platform",
444 "myapex",
445 ],
446 }
447
Paul Duffindddd5462020-04-07 15:25:44 +0100448 cc_prebuilt_library_shared {
449 name: "mylib2",
450 srcs: ["prebuilt.so"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Jiyong Park9918e1a2020-03-17 19:16:40 +0900458 cc_library_static {
459 name: "libstatic",
460 srcs: ["mylib.cpp"],
461 system_shared_libs: [],
462 stl: "none",
463 notice: "custom_notice_for_static_lib",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000464 // TODO: remove //apex_available:platform
465 apex_available: [
466 "//apex_available:platform",
467 "myapex",
468 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900469 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900470
471 java_library {
472 name: "myjar",
473 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900474 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900475 sdk_version: "none",
476 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900478 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000479 // TODO: remove //apex_available:platform
480 apex_available: [
481 "//apex_available:platform",
482 "myapex",
483 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900484 }
485
Jiyong Park77acec62020-06-01 21:39:15 +0900486 dex_import {
487 name: "myjar_dex",
488 jars: ["prebuilt.jar"],
489 apex_available: [
490 "//apex_available:platform",
491 "myapex",
492 ],
493 }
494
Jiyong Park7f7766d2019-07-25 22:02:35 +0900495 java_library {
496 name: "myotherjar",
497 srcs: ["foo/bar/MyClass.java"],
498 sdk_version: "none",
499 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900500 // TODO: remove //apex_available:platform
501 apex_available: [
502 "//apex_available:platform",
503 "myapex",
504 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900505 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900506
507 java_library {
508 name: "mysharedjar",
509 srcs: ["foo/bar/MyClass.java"],
510 sdk_version: "none",
511 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900512 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900513 `)
514
Paul Duffina71a67a2021-03-29 00:42:57 +0100515 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900516
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900517 // Make sure that Android.mk is created
518 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700519 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 var builder strings.Builder
521 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
522
523 androidMk := builder.String()
524 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
525 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
526
Jiyong Park42cca6c2019-04-01 11:15:50 +0900527 optFlags := apexRule.Args["opt_flags"]
528 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700529 // Ensure that the NOTICE output is being packaged as an asset.
Paul Duffin37ba3442021-03-29 00:21:08 +0100530 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900531
Jiyong Park25fc6a92018-11-18 18:02:45 +0900532 copyCmds := apexRule.Args["copy_commands"]
533
534 // Ensure that main rule creates an output
535 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
536
537 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
540 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900543
544 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700545 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
546 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800553 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
554 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900555 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900556 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
559 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900560 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.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"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800624 bpfs: ["bpf", "netd_test"],
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
Ken Chenfad7f9d2021-11-10 22:02:57 +0800677 bpf {
678 name: "netd_test",
679 srcs: ["netd_test.c"],
680 sub_dir: "netd",
681 }
682
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 `)
Jooyung Hana57af4a2020-01-23 05:36:59 +0000684 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 "etc/myetc",
686 "javalib/myjar.jar",
687 "lib64/mylib.so",
688 "app/AppFoo/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900689 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800690 "etc/bpf/bpf.o",
691 "etc/bpf/bpf2.o",
Ken Chenfad7f9d2021-11-10 22:02:57 +0800692 "etc/bpf/netd/netd_test.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900693 })
694}
695
Jooyung Han01a3ee22019-11-02 02:52:25 +0900696func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800697 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 apex {
699 name: "myapex",
700 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000701 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900702 }
703
704 apex_key {
705 name: "myapex.key",
706 public_key: "testkey.avbpubkey",
707 private_key: "testkey.pem",
708 }
709 `)
710
711 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han214bf372019-11-12 13:03:50 +0900712 args := module.Rule("apexRule").Args
713 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
714 t.Error("manifest should be apex_manifest.pb, but " + manifest)
715 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900716}
717
Liz Kammer4854a7d2021-05-27 14:28:27 -0400718func TestApexManifestMinSdkVersion(t *testing.T) {
719 ctx := testApex(t, `
720 apex_defaults {
721 name: "my_defaults",
722 key: "myapex.key",
723 product_specific: true,
724 file_contexts: ":my-file-contexts",
725 updatable: false,
726 }
727 apex {
728 name: "myapex_30",
729 min_sdk_version: "30",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_current",
735 min_sdk_version: "current",
736 defaults: ["my_defaults"],
737 }
738
739 apex {
740 name: "myapex_none",
741 defaults: ["my_defaults"],
742 }
743
744 apex_key {
745 name: "myapex.key",
746 public_key: "testkey.avbpubkey",
747 private_key: "testkey.pem",
748 }
749
750 filegroup {
751 name: "my-file-contexts",
752 srcs: ["product_specific_file_contexts"],
753 }
754 `, withFiles(map[string][]byte{
755 "product_specific_file_contexts": nil,
756 }), android.FixtureModifyProductVariables(
757 func(variables android.FixtureProductVariables) {
758 variables.Unbundled_build = proptools.BoolPtr(true)
759 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
760 }), android.FixtureMergeEnv(map[string]string{
761 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
762 }))
763
764 testCases := []struct {
765 module string
766 minSdkVersion string
767 }{
768 {
769 module: "myapex_30",
770 minSdkVersion: "30",
771 },
772 {
773 module: "myapex_current",
774 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
775 },
776 {
777 module: "myapex_none",
778 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
779 },
780 }
781 for _, tc := range testCases {
782 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
783 args := module.Rule("apexRule").Args
784 optFlags := args["opt_flags"]
785 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
786 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
787 }
788 }
789}
790
Alex Light5098a612018-11-29 17:12:15 -0800791func TestBasicZipApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800792 ctx := testApex(t, `
Alex Light5098a612018-11-29 17:12:15 -0800793 apex {
794 name: "myapex",
795 key: "myapex.key",
796 payload_type: "zip",
797 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000798 updatable: false,
Alex Light5098a612018-11-29 17:12:15 -0800799 }
800
801 apex_key {
802 name: "myapex.key",
803 public_key: "testkey.avbpubkey",
804 private_key: "testkey.pem",
805 }
806
807 cc_library {
808 name: "mylib",
809 srcs: ["mylib.cpp"],
810 shared_libs: ["mylib2"],
811 system_shared_libs: [],
812 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000813 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800814 }
815
816 cc_library {
817 name: "mylib2",
818 srcs: ["mylib.cpp"],
819 system_shared_libs: [],
820 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000821 apex_available: [ "myapex" ],
Alex Light5098a612018-11-29 17:12:15 -0800822 }
823 `)
824
Sundong Ahnabb64432019-10-22 13:58:29 +0900825 zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
Alex Light5098a612018-11-29 17:12:15 -0800826 copyCmds := zipApexRule.Args["copy_commands"]
827
828 // Ensure that main rule creates an output
829 ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
830
831 // Ensure that APEX variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700832 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800833
834 // Ensure that APEX variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700835 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light5098a612018-11-29 17:12:15 -0800836
837 // Ensure that both direct and indirect deps are copied into apex
838 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
839 ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900840}
841
842func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800843 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900844 apex {
845 name: "myapex",
846 key: "myapex.key",
847 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900848 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000849 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900850 }
851
852 apex_key {
853 name: "myapex.key",
854 public_key: "testkey.avbpubkey",
855 private_key: "testkey.pem",
856 }
857
858 cc_library {
859 name: "mylib",
860 srcs: ["mylib.cpp"],
861 shared_libs: ["mylib2", "mylib3"],
862 system_shared_libs: [],
863 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000864 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865 }
866
867 cc_library {
868 name: "mylib2",
869 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900870 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900871 system_shared_libs: [],
872 stl: "none",
873 stubs: {
874 versions: ["1", "2", "3"],
875 },
876 }
877
878 cc_library {
879 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900880 srcs: ["mylib.cpp"],
881 shared_libs: ["mylib4"],
882 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900883 stl: "none",
884 stubs: {
885 versions: ["10", "11", "12"],
886 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000887 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900888 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900889
890 cc_library {
891 name: "mylib4",
892 srcs: ["mylib.cpp"],
893 system_shared_libs: [],
894 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000895 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900896 }
Jiyong Park105dc322021-06-11 17:22:09 +0900897
898 rust_binary {
899 name: "foo.rust",
900 srcs: ["foo.rs"],
901 shared_libs: ["libfoo.shared_from_rust"],
902 prefer_rlib: true,
903 apex_available: ["myapex"],
904 }
905
906 cc_library_shared {
907 name: "libfoo.shared_from_rust",
908 srcs: ["mylib.cpp"],
909 system_shared_libs: [],
910 stl: "none",
911 stubs: {
912 versions: ["10", "11", "12"],
913 },
914 }
915
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 `)
917
Sundong Ahnabb64432019-10-22 13:58:29 +0900918 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 copyCmds := apexRule.Args["copy_commands"]
920
921 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800922 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923
924 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800925 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926
927 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800928 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929
Colin Crossaede88c2020-08-11 12:17:01 -0700930 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931
932 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900933 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900934 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900935 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936
937 // 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 -0700938 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700940 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900941
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700942 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
943 // is replaced by sharing of "cFlags" in cc/builder.go.
944 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
945 // module variable representing "cflags". So it was not detected by ensureNotContains.
946 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
947 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
948 // including the original cflags's "-include mylib.h".
949 //
Jiyong Park64379952018-12-13 18:37:29 +0900950 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700951 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
952 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900953
954 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -0700955 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"])
Jooyung Han671f1ce2019-12-17 12:47:13 +0900956
Jooyung Hana57af4a2020-01-23 05:36:59 +0000957 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900958 "lib64/mylib.so",
959 "lib64/mylib3.so",
960 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900961 "bin/foo.rust",
962 "lib64/libc++.so", // by the implicit dependency from foo.rust
963 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900964 })
Jiyong Park105dc322021-06-11 17:22:09 +0900965
966 // Ensure that stub dependency from a rust module is not included
967 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
968 // The rust module is linked to the stub cc library
969 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
970 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
971 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900972}
973
Jiyong Park1bc84122021-06-22 20:23:05 +0900974func TestApexCanUsePrivateApis(t *testing.T) {
975 ctx := testApex(t, `
976 apex {
977 name: "myapex",
978 key: "myapex.key",
979 native_shared_libs: ["mylib"],
980 binaries: ["foo.rust"],
981 updatable: false,
982 platform_apis: true,
983 }
984
985 apex_key {
986 name: "myapex.key",
987 public_key: "testkey.avbpubkey",
988 private_key: "testkey.pem",
989 }
990
991 cc_library {
992 name: "mylib",
993 srcs: ["mylib.cpp"],
994 shared_libs: ["mylib2"],
995 system_shared_libs: [],
996 stl: "none",
997 apex_available: [ "myapex" ],
998 }
999
1000 cc_library {
1001 name: "mylib2",
1002 srcs: ["mylib.cpp"],
1003 cflags: ["-include mylib.h"],
1004 system_shared_libs: [],
1005 stl: "none",
1006 stubs: {
1007 versions: ["1", "2", "3"],
1008 },
1009 }
1010
1011 rust_binary {
1012 name: "foo.rust",
1013 srcs: ["foo.rs"],
1014 shared_libs: ["libfoo.shared_from_rust"],
1015 prefer_rlib: true,
1016 apex_available: ["myapex"],
1017 }
1018
1019 cc_library_shared {
1020 name: "libfoo.shared_from_rust",
1021 srcs: ["mylib.cpp"],
1022 system_shared_libs: [],
1023 stl: "none",
1024 stubs: {
1025 versions: ["10", "11", "12"],
1026 },
1027 }
1028 `)
1029
1030 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1031 copyCmds := apexRule.Args["copy_commands"]
1032
1033 // Ensure that indirect stubs dep is not included
1034 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1035 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1036
1037 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1038 // of the platform_apis: true)
1039 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_private").Rule("ld").Args["libFlags"]
1040 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1041 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1042 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_private").Rule("rustc").Args["linkFlags"]
1043 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1044 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1045}
1046
Colin Cross7812fd32020-09-25 12:35:10 -07001047func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1048 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001049 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001050 apex {
1051 name: "myapex",
1052 key: "myapex.key",
1053 native_shared_libs: ["mylib", "mylib3"],
1054 min_sdk_version: "29",
1055 }
1056
1057 apex_key {
1058 name: "myapex.key",
1059 public_key: "testkey.avbpubkey",
1060 private_key: "testkey.pem",
1061 }
1062
1063 cc_library {
1064 name: "mylib",
1065 srcs: ["mylib.cpp"],
1066 shared_libs: ["mylib2", "mylib3"],
1067 system_shared_libs: [],
1068 stl: "none",
1069 apex_available: [ "myapex" ],
1070 min_sdk_version: "28",
1071 }
1072
1073 cc_library {
1074 name: "mylib2",
1075 srcs: ["mylib.cpp"],
1076 cflags: ["-include mylib.h"],
1077 system_shared_libs: [],
1078 stl: "none",
1079 stubs: {
1080 versions: ["28", "29", "30", "current"],
1081 },
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib3",
1087 srcs: ["mylib.cpp"],
1088 shared_libs: ["mylib4"],
1089 system_shared_libs: [],
1090 stl: "none",
1091 stubs: {
1092 versions: ["28", "29", "30", "current"],
1093 },
1094 apex_available: [ "myapex" ],
1095 min_sdk_version: "28",
1096 }
1097
1098 cc_library {
1099 name: "mylib4",
1100 srcs: ["mylib.cpp"],
1101 system_shared_libs: [],
1102 stl: "none",
1103 apex_available: [ "myapex" ],
1104 min_sdk_version: "28",
1105 }
1106 `)
1107
1108 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
1109 copyCmds := apexRule.Args["copy_commands"]
1110
1111 // Ensure that direct non-stubs dep is always included
1112 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1113
1114 // Ensure that indirect stubs dep is not included
1115 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1116
1117 // Ensure that direct stubs dep is included
1118 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1119
1120 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1121
Jiyong Park55549df2021-02-26 23:57:23 +09001122 // Ensure that mylib is linking with the latest version of stub for mylib2
1123 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001124 // ... and not linking to the non-stub (impl) variant of mylib2
1125 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1126
1127 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1128 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1129 // .. and not linking to the stubs variant of mylib3
1130 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1131
1132 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001133 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001134 ensureNotContains(t, mylib2Cflags, "-include ")
1135
1136 // Ensure that genstub is invoked with --apex
Colin Crossa717db72020-10-23 14:53:06 -07001137 ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"])
Colin Cross7812fd32020-09-25 12:35:10 -07001138
1139 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1140 "lib64/mylib.so",
1141 "lib64/mylib3.so",
1142 "lib64/mylib4.so",
1143 })
1144}
1145
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001146func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1147 t.Parallel()
1148 // myapex (Z)
1149 // mylib -----------------.
1150 // |
1151 // otherapex (29) |
1152 // libstub's versions: 29 Z current
1153 // |
1154 // <platform> |
1155 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001156 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001157 apex {
1158 name: "myapex",
1159 key: "myapex.key",
1160 native_shared_libs: ["mylib"],
1161 min_sdk_version: "Z", // non-final
1162 }
1163
1164 cc_library {
1165 name: "mylib",
1166 srcs: ["mylib.cpp"],
1167 shared_libs: ["libstub"],
1168 apex_available: ["myapex"],
1169 min_sdk_version: "Z",
1170 }
1171
1172 apex_key {
1173 name: "myapex.key",
1174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 apex {
1179 name: "otherapex",
1180 key: "myapex.key",
1181 native_shared_libs: ["libstub"],
1182 min_sdk_version: "29",
1183 }
1184
1185 cc_library {
1186 name: "libstub",
1187 srcs: ["mylib.cpp"],
1188 stubs: {
1189 versions: ["29", "Z", "current"],
1190 },
1191 apex_available: ["otherapex"],
1192 min_sdk_version: "29",
1193 }
1194
1195 // platform module depending on libstub from otherapex should use the latest stub("current")
1196 cc_library {
1197 name: "libplatform",
1198 srcs: ["mylib.cpp"],
1199 shared_libs: ["libstub"],
1200 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001201 `,
1202 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1203 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1204 variables.Platform_sdk_final = proptools.BoolPtr(false)
1205 variables.Platform_version_active_codenames = []string{"Z"}
1206 }),
1207 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001208
Jiyong Park55549df2021-02-26 23:57:23 +09001209 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001210 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001211 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001212 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001213 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001214
1215 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1216 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1217 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1218 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1219 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1220}
1221
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001223 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001224 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001225 name: "myapex2",
1226 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001227 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001228 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 }
1230
1231 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001232 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001233 public_key: "testkey.avbpubkey",
1234 private_key: "testkey.pem",
1235 }
1236
1237 cc_library {
1238 name: "mylib",
1239 srcs: ["mylib.cpp"],
1240 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001241 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001242 system_shared_libs: [],
1243 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001244 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001245 }
1246
1247 cc_library {
1248 name: "libfoo",
1249 srcs: ["mylib.cpp"],
1250 shared_libs: ["libbar"],
1251 system_shared_libs: [],
1252 stl: "none",
1253 stubs: {
1254 versions: ["10", "20", "30"],
1255 },
1256 }
1257
1258 cc_library {
1259 name: "libbar",
1260 srcs: ["mylib.cpp"],
1261 system_shared_libs: [],
1262 stl: "none",
1263 }
1264
Jiyong Park678c8812020-02-07 17:25:49 +09001265 cc_library_static {
1266 name: "libbaz",
1267 srcs: ["mylib.cpp"],
1268 system_shared_libs: [],
1269 stl: "none",
1270 apex_available: [ "myapex2" ],
1271 }
1272
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001273 `)
1274
Jiyong Park83dc74b2020-01-14 18:38:44 +09001275 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001276 copyCmds := apexRule.Args["copy_commands"]
1277
1278 // Ensure that direct non-stubs dep is always included
1279 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1280
1281 // Ensure that indirect stubs dep is not included
1282 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1283
1284 // Ensure that dependency of stubs is not included
1285 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1286
Colin Crossaede88c2020-08-11 12:17:01 -07001287 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001288
1289 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001290 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001292 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001293
Jiyong Park3ff16992019-12-27 14:11:47 +09001294 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295
1296 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1297 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001298
Artur Satayeva8bd1132020-04-27 18:07:06 +01001299 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001300 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001301
Artur Satayeva8bd1132020-04-27 18:07:06 +01001302 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001303 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001304}
1305
Jooyung Hand3639552019-08-09 12:57:43 +09001306func TestApexWithRuntimeLibsDependency(t *testing.T) {
1307 /*
1308 myapex
1309 |
1310 v (runtime_libs)
1311 mylib ------+------> libfoo [provides stub]
1312 |
1313 `------> libbar
1314 */
Colin Cross1c460562021-02-16 17:55:47 -08001315 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001316 apex {
1317 name: "myapex",
1318 key: "myapex.key",
1319 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001320 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001321 }
1322
1323 apex_key {
1324 name: "myapex.key",
1325 public_key: "testkey.avbpubkey",
1326 private_key: "testkey.pem",
1327 }
1328
1329 cc_library {
1330 name: "mylib",
1331 srcs: ["mylib.cpp"],
1332 runtime_libs: ["libfoo", "libbar"],
1333 system_shared_libs: [],
1334 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001335 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001336 }
1337
1338 cc_library {
1339 name: "libfoo",
1340 srcs: ["mylib.cpp"],
1341 system_shared_libs: [],
1342 stl: "none",
1343 stubs: {
1344 versions: ["10", "20", "30"],
1345 },
1346 }
1347
1348 cc_library {
1349 name: "libbar",
1350 srcs: ["mylib.cpp"],
1351 system_shared_libs: [],
1352 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001353 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001354 }
1355
1356 `)
1357
Sundong Ahnabb64432019-10-22 13:58:29 +09001358 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001359 copyCmds := apexRule.Args["copy_commands"]
1360
1361 // Ensure that direct non-stubs dep is always included
1362 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1363
1364 // Ensure that indirect stubs dep is not included
1365 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1366
1367 // Ensure that runtime_libs dep in included
1368 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
1369
Sundong Ahnabb64432019-10-22 13:58:29 +09001370 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001371 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1372 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001373
1374}
1375
Paul Duffina02cae32021-03-09 01:44:06 +00001376var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1377 cc.PrepareForTestWithCcBuildComponents,
1378 PrepareForTestWithApexBuildComponents,
1379 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001380 apex {
1381 name: "com.android.runtime",
1382 key: "com.android.runtime.key",
1383 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001384 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001385 }
1386
1387 apex_key {
1388 name: "com.android.runtime.key",
1389 public_key: "testkey.avbpubkey",
1390 private_key: "testkey.pem",
1391 }
Paul Duffina02cae32021-03-09 01:44:06 +00001392 `),
1393 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1394)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001395
Paul Duffina02cae32021-03-09 01:44:06 +00001396func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001397 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001398 cc_library {
1399 name: "libc",
1400 no_libcrt: true,
1401 nocrt: true,
1402 stl: "none",
1403 system_shared_libs: [],
1404 stubs: { versions: ["1"] },
1405 apex_available: ["com.android.runtime"],
1406
1407 sanitize: {
1408 hwaddress: true,
1409 }
1410 }
1411
1412 cc_prebuilt_library_shared {
1413 name: "libclang_rt.hwasan-aarch64-android",
1414 no_libcrt: true,
1415 nocrt: true,
1416 stl: "none",
1417 system_shared_libs: [],
1418 srcs: [""],
1419 stubs: { versions: ["1"] },
1420
1421 sanitize: {
1422 never: true,
1423 },
Paul Duffina02cae32021-03-09 01:44:06 +00001424 } `)
1425 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001426
1427 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1428 "lib64/bionic/libc.so",
1429 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1430 })
1431
1432 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1433
1434 installed := hwasan.Description("install libclang_rt.hwasan")
1435 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1436
1437 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1438 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1439 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1440}
1441
1442func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001443 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001444 prepareForTestOfRuntimeApexWithHwasan,
1445 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1446 variables.SanitizeDevice = []string{"hwaddress"}
1447 }),
1448 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001449 cc_library {
1450 name: "libc",
1451 no_libcrt: true,
1452 nocrt: true,
1453 stl: "none",
1454 system_shared_libs: [],
1455 stubs: { versions: ["1"] },
1456 apex_available: ["com.android.runtime"],
1457 }
1458
1459 cc_prebuilt_library_shared {
1460 name: "libclang_rt.hwasan-aarch64-android",
1461 no_libcrt: true,
1462 nocrt: true,
1463 stl: "none",
1464 system_shared_libs: [],
1465 srcs: [""],
1466 stubs: { versions: ["1"] },
1467
1468 sanitize: {
1469 never: true,
1470 },
1471 }
Paul Duffina02cae32021-03-09 01:44:06 +00001472 `)
1473 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001474
1475 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
1476 "lib64/bionic/libc.so",
1477 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1478 })
1479
1480 hwasan := ctx.ModuleForTests("libclang_rt.hwasan-aarch64-android", "android_arm64_armv8-a_shared")
1481
1482 installed := hwasan.Description("install libclang_rt.hwasan")
1483 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1484
1485 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1486 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1487 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1488}
1489
Jooyung Han61b66e92020-03-21 14:21:46 +00001490func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1491 testcases := []struct {
1492 name string
1493 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001494 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001495 shouldLink string
1496 shouldNotLink []string
1497 }{
1498 {
Jiyong Park55549df2021-02-26 23:57:23 +09001499 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001500 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001501 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001502 shouldLink: "current",
1503 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001504 },
1505 {
Jiyong Park55549df2021-02-26 23:57:23 +09001506 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001507 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001508 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001509 shouldLink: "current",
1510 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001511 },
1512 }
1513 for _, tc := range testcases {
1514 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001515 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001516 apex {
1517 name: "myapex",
1518 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001519 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001520 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001521 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001522 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001523
Jooyung Han61b66e92020-03-21 14:21:46 +00001524 apex_key {
1525 name: "myapex.key",
1526 public_key: "testkey.avbpubkey",
1527 private_key: "testkey.pem",
1528 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001529
Jooyung Han61b66e92020-03-21 14:21:46 +00001530 cc_library {
1531 name: "mylib",
1532 srcs: ["mylib.cpp"],
1533 vendor_available: true,
1534 shared_libs: ["libbar"],
1535 system_shared_libs: [],
1536 stl: "none",
1537 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001538 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001539 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001540
Jooyung Han61b66e92020-03-21 14:21:46 +00001541 cc_library {
1542 name: "libbar",
1543 srcs: ["mylib.cpp"],
1544 system_shared_libs: [],
1545 stl: "none",
1546 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001547 llndk: {
1548 symbol_file: "libbar.map.txt",
1549 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001550 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001551 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001552 withUnbundledBuild,
1553 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001554
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 // Ensure that LLNDK dep is not included
1556 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
1557 "lib64/mylib.so",
1558 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001559
Jooyung Han61b66e92020-03-21 14:21:46 +00001560 // Ensure that LLNDK dep is required
1561 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
1562 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1563 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Steven Moreland2c4000c2021-04-27 02:08:49 +00001565 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1566 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001567 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001568 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001570
Steven Moreland2c4000c2021-04-27 02:08:49 +00001571 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001572 ver := tc.shouldLink
1573 if tc.shouldLink == "current" {
1574 ver = strconv.Itoa(android.FutureApiLevelInt)
1575 }
1576 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001577 })
1578 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001579}
1580
Jiyong Park25fc6a92018-11-18 18:02:45 +09001581func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001582 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001583 apex {
1584 name: "myapex",
1585 key: "myapex.key",
1586 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001587 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001588 }
1589
1590 apex_key {
1591 name: "myapex.key",
1592 public_key: "testkey.avbpubkey",
1593 private_key: "testkey.pem",
1594 }
1595
1596 cc_library {
1597 name: "mylib",
1598 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001599 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001600 shared_libs: ["libdl#27"],
1601 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001602 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001603 }
1604
1605 cc_library_shared {
1606 name: "mylib_shared",
1607 srcs: ["mylib.cpp"],
1608 shared_libs: ["libdl#27"],
1609 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001610 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001611 }
1612
1613 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001614 name: "libBootstrap",
1615 srcs: ["mylib.cpp"],
1616 stl: "none",
1617 bootstrap: true,
1618 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001619 `)
1620
Sundong Ahnabb64432019-10-22 13:58:29 +09001621 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 copyCmds := apexRule.Args["copy_commands"]
1623
1624 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001625 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001626 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1627 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001628
1629 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001630 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001631
Colin Crossaede88c2020-08-11 12:17:01 -07001632 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1633 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1634 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635
1636 // For dependency to libc
1637 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001638 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001640 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001641 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001642 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1643 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001644
1645 // For dependency to libm
1646 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001647 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001648 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001649 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 // ... and is not compiling with the stub
1651 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1652 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1653
1654 // For dependency to libdl
1655 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001656 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001657 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001658 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1659 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001660 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001661 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001662 // ... Cflags from stub is correctly exported to mylib
1663 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1664 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001665
1666 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001667 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1668 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1669 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1670 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001671}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001672
Jooyung Han749dc692020-04-15 11:03:39 +09001673func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001674 // there are three links between liba --> libz.
1675 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001676 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001677 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001678 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001679 apex {
1680 name: "myapex",
1681 key: "myapex.key",
1682 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001683 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001684 }
1685
1686 apex {
1687 name: "otherapex",
1688 key: "myapex.key",
1689 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001690 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001691 }
1692
1693 apex_key {
1694 name: "myapex.key",
1695 public_key: "testkey.avbpubkey",
1696 private_key: "testkey.pem",
1697 }
1698
1699 cc_library {
1700 name: "libx",
1701 shared_libs: ["liba"],
1702 system_shared_libs: [],
1703 stl: "none",
1704 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001705 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001706 }
1707
1708 cc_library {
1709 name: "liby",
1710 shared_libs: ["liba"],
1711 system_shared_libs: [],
1712 stl: "none",
1713 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001714 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001715 }
1716
1717 cc_library {
1718 name: "liba",
1719 shared_libs: ["libz"],
1720 system_shared_libs: [],
1721 stl: "none",
1722 apex_available: [
1723 "//apex_available:anyapex",
1724 "//apex_available:platform",
1725 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001726 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001727 }
1728
1729 cc_library {
1730 name: "libz",
1731 system_shared_libs: [],
1732 stl: "none",
1733 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001734 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001735 },
1736 }
Jooyung Han749dc692020-04-15 11:03:39 +09001737 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001738
1739 expectLink := func(from, from_variant, to, to_variant string) {
1740 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1741 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1742 }
1743 expectNoLink := func(from, from_variant, to, to_variant string) {
1744 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1745 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1746 }
1747 // platform liba is linked to non-stub version
1748 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001749 // liba in myapex is linked to current
1750 expectLink("liba", "shared_apex29", "libz", "shared_current")
1751 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001752 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001753 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 // liba in otherapex is linked to current
1755 expectLink("liba", "shared_apex30", "libz", "shared_current")
1756 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001757 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1758 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001759}
1760
Jooyung Hanaed150d2020-04-02 01:41:41 +09001761func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001762 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001763 apex {
1764 name: "myapex",
1765 key: "myapex.key",
1766 native_shared_libs: ["libx"],
1767 min_sdk_version: "R",
1768 }
1769
1770 apex_key {
1771 name: "myapex.key",
1772 public_key: "testkey.avbpubkey",
1773 private_key: "testkey.pem",
1774 }
1775
1776 cc_library {
1777 name: "libx",
1778 shared_libs: ["libz"],
1779 system_shared_libs: [],
1780 stl: "none",
1781 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001782 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001783 }
1784
1785 cc_library {
1786 name: "libz",
1787 system_shared_libs: [],
1788 stl: "none",
1789 stubs: {
1790 versions: ["29", "R"],
1791 },
1792 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001793 `,
1794 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1795 variables.Platform_version_active_codenames = []string{"R"}
1796 }),
1797 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001798
1799 expectLink := func(from, from_variant, to, to_variant string) {
1800 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1801 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1802 }
1803 expectNoLink := func(from, from_variant, to, to_variant string) {
1804 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1805 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1806 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001807 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1808 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001809 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1810 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001811}
1812
Jooyung Han4c4da062021-06-23 10:23:16 +09001813func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1814 testApex(t, `
1815 apex {
1816 name: "myapex",
1817 key: "myapex.key",
1818 java_libs: ["libx"],
1819 min_sdk_version: "S",
1820 }
1821
1822 apex_key {
1823 name: "myapex.key",
1824 public_key: "testkey.avbpubkey",
1825 private_key: "testkey.pem",
1826 }
1827
1828 java_library {
1829 name: "libx",
1830 srcs: ["a.java"],
1831 apex_available: [ "myapex" ],
1832 sdk_version: "current",
1833 min_sdk_version: "S", // should be okay
1834 }
1835 `,
1836 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1837 variables.Platform_version_active_codenames = []string{"S"}
1838 variables.Platform_sdk_codename = proptools.StringPtr("S")
1839 }),
1840 )
1841}
1842
Jooyung Han749dc692020-04-15 11:03:39 +09001843func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001844 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001845 apex {
1846 name: "myapex",
1847 key: "myapex.key",
1848 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001849 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001850 }
1851
1852 apex_key {
1853 name: "myapex.key",
1854 public_key: "testkey.avbpubkey",
1855 private_key: "testkey.pem",
1856 }
1857
1858 cc_library {
1859 name: "libx",
1860 shared_libs: ["libz"],
1861 system_shared_libs: [],
1862 stl: "none",
1863 apex_available: [ "myapex" ],
1864 }
1865
1866 cc_library {
1867 name: "libz",
1868 system_shared_libs: [],
1869 stl: "none",
1870 stubs: {
1871 versions: ["1", "2"],
1872 },
1873 }
1874 `)
1875
1876 expectLink := func(from, from_variant, to, to_variant string) {
1877 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1878 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1879 }
1880 expectNoLink := func(from, from_variant, to, to_variant string) {
1881 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1882 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1883 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001884 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001885 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001886 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001887 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001888}
1889
Jiyong Park5df7bd32021-08-25 16:18:46 +09001890func TestApexMinSdkVersion_crtobjectInVendorApex(t *testing.T) {
1891 ctx := testApex(t, `
1892 apex {
1893 name: "myapex",
1894 key: "myapex.key",
1895 native_shared_libs: ["mylib"],
1896 updatable: false,
1897 vendor: true,
1898 min_sdk_version: "29",
1899 }
1900
1901 apex_key {
1902 name: "myapex.key",
1903 public_key: "testkey.avbpubkey",
1904 private_key: "testkey.pem",
1905 }
1906
1907 cc_library {
1908 name: "mylib",
1909 vendor_available: true,
1910 system_shared_libs: [],
1911 stl: "none",
1912 apex_available: [ "myapex" ],
1913 min_sdk_version: "29",
1914 }
1915 `)
1916
1917 vendorVariant := "android_vendor.29_arm64_armv8-a"
1918
1919 // First check that the correct variant of crtbegin_so is used.
1920 ldRule := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29").Rule("ld")
1921 crtBegin := names(ldRule.Args["crtBegin"])
1922 ensureListContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
1923
1924 // Ensure that the crtbegin_so used by the APEX is targeting 29
1925 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1926 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1927}
1928
Jooyung Han03b51852020-02-26 22:45:42 +09001929func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001930 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001931 apex {
1932 name: "myapex",
1933 key: "myapex.key",
1934 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001935 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001936 }
1937
1938 apex_key {
1939 name: "myapex.key",
1940 public_key: "testkey.avbpubkey",
1941 private_key: "testkey.pem",
1942 }
1943
1944 cc_library {
1945 name: "libx",
1946 system_shared_libs: [],
1947 stl: "none",
1948 apex_available: [ "myapex" ],
1949 stubs: {
1950 versions: ["1", "2"],
1951 },
1952 }
1953
1954 cc_library {
1955 name: "libz",
1956 shared_libs: ["libx"],
1957 system_shared_libs: [],
1958 stl: "none",
1959 }
1960 `)
1961
1962 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001963 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001964 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1966 }
1967 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07001968 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09001969 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1970 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1971 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001972 expectLink("libz", "shared", "libx", "shared_current")
1973 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09001974 expectNoLink("libz", "shared", "libz", "shared_1")
1975 expectNoLink("libz", "shared", "libz", "shared")
1976}
1977
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
1979 func(variables android.FixtureProductVariables) {
1980 variables.SanitizeDevice = []string{"hwaddress"}
1981 },
1982)
1983
Jooyung Han75568392020-03-20 04:29:24 +09001984func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001985 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001986 apex {
1987 name: "myapex",
1988 key: "myapex.key",
1989 native_shared_libs: ["libx"],
1990 min_sdk_version: "29",
1991 }
1992
1993 apex_key {
1994 name: "myapex.key",
1995 public_key: "testkey.avbpubkey",
1996 private_key: "testkey.pem",
1997 }
1998
1999 cc_library {
2000 name: "libx",
2001 shared_libs: ["libbar"],
2002 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002003 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002004 }
2005
2006 cc_library {
2007 name: "libbar",
2008 stubs: {
2009 versions: ["29", "30"],
2010 },
2011 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002012 `,
2013 prepareForTestWithSantitizeHwaddress,
2014 )
Jooyung Han03b51852020-02-26 22:45:42 +09002015 expectLink := func(from, from_variant, to, to_variant string) {
2016 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2017 libFlags := ld.Args["libFlags"]
2018 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2019 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002020 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002021}
2022
Jooyung Han75568392020-03-20 04:29:24 +09002023func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002024 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002025 apex {
2026 name: "myapex",
2027 key: "myapex.key",
2028 native_shared_libs: ["libx"],
2029 min_sdk_version: "29",
2030 }
2031
2032 apex_key {
2033 name: "myapex.key",
2034 public_key: "testkey.avbpubkey",
2035 private_key: "testkey.pem",
2036 }
2037
2038 cc_library {
2039 name: "libx",
2040 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002041 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002042 }
Jooyung Han75568392020-03-20 04:29:24 +09002043 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002044
2045 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002046 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002047 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002048 // note that platform variant is not.
2049 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002050 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002051}
2052
Jooyung Han749dc692020-04-15 11:03:39 +09002053func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2054 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002055 apex {
2056 name: "myapex",
2057 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002058 native_shared_libs: ["mylib"],
2059 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002060 }
2061
2062 apex_key {
2063 name: "myapex.key",
2064 public_key: "testkey.avbpubkey",
2065 private_key: "testkey.pem",
2066 }
Jooyung Han749dc692020-04-15 11:03:39 +09002067
2068 cc_library {
2069 name: "mylib",
2070 srcs: ["mylib.cpp"],
2071 system_shared_libs: [],
2072 stl: "none",
2073 apex_available: [
2074 "myapex",
2075 ],
2076 min_sdk_version: "30",
2077 }
2078 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002079
2080 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["libfoo.ffi"],
2085 min_sdk_version: "29",
2086 }
2087
2088 apex_key {
2089 name: "myapex.key",
2090 public_key: "testkey.avbpubkey",
2091 private_key: "testkey.pem",
2092 }
2093
2094 rust_ffi_shared {
2095 name: "libfoo.ffi",
2096 srcs: ["foo.rs"],
2097 crate_name: "foo",
2098 apex_available: [
2099 "myapex",
2100 ],
2101 min_sdk_version: "30",
2102 }
2103 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002104
2105 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2106 apex {
2107 name: "myapex",
2108 key: "myapex.key",
2109 java_libs: ["libfoo"],
2110 min_sdk_version: "29",
2111 }
2112
2113 apex_key {
2114 name: "myapex.key",
2115 public_key: "testkey.avbpubkey",
2116 private_key: "testkey.pem",
2117 }
2118
2119 java_import {
2120 name: "libfoo",
2121 jars: ["libfoo.jar"],
2122 apex_available: [
2123 "myapex",
2124 ],
2125 min_sdk_version: "30",
2126 }
2127 `)
Jooyung Han749dc692020-04-15 11:03:39 +09002128}
2129
2130func TestApexMinSdkVersion_Okay(t *testing.T) {
2131 testApex(t, `
2132 apex {
2133 name: "myapex",
2134 key: "myapex.key",
2135 native_shared_libs: ["libfoo"],
2136 java_libs: ["libbar"],
2137 min_sdk_version: "29",
2138 }
2139
2140 apex_key {
2141 name: "myapex.key",
2142 public_key: "testkey.avbpubkey",
2143 private_key: "testkey.pem",
2144 }
2145
2146 cc_library {
2147 name: "libfoo",
2148 srcs: ["mylib.cpp"],
2149 shared_libs: ["libfoo_dep"],
2150 apex_available: ["myapex"],
2151 min_sdk_version: "29",
2152 }
2153
2154 cc_library {
2155 name: "libfoo_dep",
2156 srcs: ["mylib.cpp"],
2157 apex_available: ["myapex"],
2158 min_sdk_version: "29",
2159 }
2160
2161 java_library {
2162 name: "libbar",
2163 sdk_version: "current",
2164 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002165 static_libs: [
2166 "libbar_dep",
2167 "libbar_import_dep",
2168 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002169 apex_available: ["myapex"],
2170 min_sdk_version: "29",
2171 }
2172
2173 java_library {
2174 name: "libbar_dep",
2175 sdk_version: "current",
2176 srcs: ["a.java"],
2177 apex_available: ["myapex"],
2178 min_sdk_version: "29",
2179 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002180
2181 java_import {
2182 name: "libbar_import_dep",
2183 jars: ["libbar.jar"],
2184 apex_available: ["myapex"],
2185 min_sdk_version: "29",
2186 }
Jooyung Han03b51852020-02-26 22:45:42 +09002187 `)
2188}
2189
Artur Satayev8cf899a2020-04-15 17:29:42 +01002190func TestJavaStableSdkVersion(t *testing.T) {
2191 testCases := []struct {
2192 name string
2193 expectedError string
2194 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002195 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002196 }{
2197 {
2198 name: "Non-updatable apex with non-stable dep",
2199 bp: `
2200 apex {
2201 name: "myapex",
2202 java_libs: ["myjar"],
2203 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002204 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002205 }
2206 apex_key {
2207 name: "myapex.key",
2208 public_key: "testkey.avbpubkey",
2209 private_key: "testkey.pem",
2210 }
2211 java_library {
2212 name: "myjar",
2213 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002214 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002215 apex_available: ["myapex"],
2216 }
2217 `,
2218 },
2219 {
2220 name: "Updatable apex with stable dep",
2221 bp: `
2222 apex {
2223 name: "myapex",
2224 java_libs: ["myjar"],
2225 key: "myapex.key",
2226 updatable: true,
2227 min_sdk_version: "29",
2228 }
2229 apex_key {
2230 name: "myapex.key",
2231 public_key: "testkey.avbpubkey",
2232 private_key: "testkey.pem",
2233 }
2234 java_library {
2235 name: "myjar",
2236 srcs: ["foo/bar/MyClass.java"],
2237 sdk_version: "current",
2238 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002239 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002240 }
2241 `,
2242 },
2243 {
2244 name: "Updatable apex with non-stable dep",
2245 expectedError: "cannot depend on \"myjar\"",
2246 bp: `
2247 apex {
2248 name: "myapex",
2249 java_libs: ["myjar"],
2250 key: "myapex.key",
2251 updatable: true,
2252 }
2253 apex_key {
2254 name: "myapex.key",
2255 public_key: "testkey.avbpubkey",
2256 private_key: "testkey.pem",
2257 }
2258 java_library {
2259 name: "myjar",
2260 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002261 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002262 apex_available: ["myapex"],
2263 }
2264 `,
2265 },
2266 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002267 name: "Updatable apex with non-stable legacy core platform dep",
2268 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2269 bp: `
2270 apex {
2271 name: "myapex",
2272 java_libs: ["myjar-uses-legacy"],
2273 key: "myapex.key",
2274 updatable: true,
2275 }
2276 apex_key {
2277 name: "myapex.key",
2278 public_key: "testkey.avbpubkey",
2279 private_key: "testkey.pem",
2280 }
2281 java_library {
2282 name: "myjar-uses-legacy",
2283 srcs: ["foo/bar/MyClass.java"],
2284 sdk_version: "core_platform",
2285 apex_available: ["myapex"],
2286 }
2287 `,
2288 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2289 },
2290 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002291 name: "Updatable apex with non-stable transitive dep",
2292 // This is not actually detecting that the transitive dependency is unstable, rather it is
2293 // detecting that the transitive dependency is building against a wider API surface than the
2294 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002295 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002296 bp: `
2297 apex {
2298 name: "myapex",
2299 java_libs: ["myjar"],
2300 key: "myapex.key",
2301 updatable: true,
2302 }
2303 apex_key {
2304 name: "myapex.key",
2305 public_key: "testkey.avbpubkey",
2306 private_key: "testkey.pem",
2307 }
2308 java_library {
2309 name: "myjar",
2310 srcs: ["foo/bar/MyClass.java"],
2311 sdk_version: "current",
2312 apex_available: ["myapex"],
2313 static_libs: ["transitive-jar"],
2314 }
2315 java_library {
2316 name: "transitive-jar",
2317 srcs: ["foo/bar/MyClass.java"],
2318 sdk_version: "core_platform",
2319 apex_available: ["myapex"],
2320 }
2321 `,
2322 },
2323 }
2324
2325 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002326 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2327 continue
2328 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002329 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002330 errorHandler := android.FixtureExpectsNoErrors
2331 if test.expectedError != "" {
2332 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002333 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002334 android.GroupFixturePreparers(
2335 java.PrepareForTestWithJavaDefaultModules,
2336 PrepareForTestWithApexBuildComponents,
2337 prepareForTestWithMyapex,
2338 android.OptionalFixturePreparer(test.preparer),
2339 ).
2340 ExtendWithErrorHandler(errorHandler).
2341 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002342 })
2343 }
2344}
2345
Jooyung Han749dc692020-04-15 11:03:39 +09002346func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2347 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2348 apex {
2349 name: "myapex",
2350 key: "myapex.key",
2351 native_shared_libs: ["mylib"],
2352 min_sdk_version: "29",
2353 }
2354
2355 apex_key {
2356 name: "myapex.key",
2357 public_key: "testkey.avbpubkey",
2358 private_key: "testkey.pem",
2359 }
2360
2361 cc_library {
2362 name: "mylib",
2363 srcs: ["mylib.cpp"],
2364 shared_libs: ["mylib2"],
2365 system_shared_libs: [],
2366 stl: "none",
2367 apex_available: [
2368 "myapex",
2369 ],
2370 min_sdk_version: "29",
2371 }
2372
2373 // indirect part of the apex
2374 cc_library {
2375 name: "mylib2",
2376 srcs: ["mylib.cpp"],
2377 system_shared_libs: [],
2378 stl: "none",
2379 apex_available: [
2380 "myapex",
2381 ],
2382 min_sdk_version: "30",
2383 }
2384 `)
2385}
2386
2387func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2388 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2389 apex {
2390 name: "myapex",
2391 key: "myapex.key",
2392 apps: ["AppFoo"],
2393 min_sdk_version: "29",
2394 }
2395
2396 apex_key {
2397 name: "myapex.key",
2398 public_key: "testkey.avbpubkey",
2399 private_key: "testkey.pem",
2400 }
2401
2402 android_app {
2403 name: "AppFoo",
2404 srcs: ["foo/bar/MyClass.java"],
2405 sdk_version: "current",
2406 min_sdk_version: "29",
2407 system_modules: "none",
2408 stl: "none",
2409 static_libs: ["bar"],
2410 apex_available: [ "myapex" ],
2411 }
2412
2413 java_library {
2414 name: "bar",
2415 sdk_version: "current",
2416 srcs: ["a.java"],
2417 apex_available: [ "myapex" ],
2418 }
2419 `)
2420}
2421
2422func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002423 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002424 apex {
2425 name: "myapex",
2426 key: "myapex.key",
2427 native_shared_libs: ["mylib"],
2428 min_sdk_version: "29",
2429 }
2430
2431 apex_key {
2432 name: "myapex.key",
2433 public_key: "testkey.avbpubkey",
2434 private_key: "testkey.pem",
2435 }
2436
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002437 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002438 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2439 cc_library {
2440 name: "mylib",
2441 srcs: ["mylib.cpp"],
2442 shared_libs: ["mylib2"],
2443 system_shared_libs: [],
2444 stl: "none",
2445 apex_available: ["myapex", "otherapex"],
2446 min_sdk_version: "29",
2447 }
2448
2449 cc_library {
2450 name: "mylib2",
2451 srcs: ["mylib.cpp"],
2452 system_shared_libs: [],
2453 stl: "none",
2454 apex_available: ["otherapex"],
2455 stubs: { versions: ["29", "30"] },
2456 min_sdk_version: "30",
2457 }
2458
2459 apex {
2460 name: "otherapex",
2461 key: "myapex.key",
2462 native_shared_libs: ["mylib", "mylib2"],
2463 min_sdk_version: "30",
2464 }
2465 `)
2466 expectLink := func(from, from_variant, to, to_variant string) {
2467 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2468 libFlags := ld.Args["libFlags"]
2469 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2470 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002471 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002472 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002473}
2474
Jooyung Haned124c32021-01-26 11:43:46 +09002475func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002476 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2477 func(variables android.FixtureProductVariables) {
2478 variables.Platform_sdk_codename = proptools.StringPtr("S")
2479 variables.Platform_version_active_codenames = []string{"S"}
2480 },
2481 )
Jooyung Haned124c32021-01-26 11:43:46 +09002482 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2483 apex {
2484 name: "myapex",
2485 key: "myapex.key",
2486 native_shared_libs: ["libfoo"],
2487 min_sdk_version: "S",
2488 }
2489 apex_key {
2490 name: "myapex.key",
2491 public_key: "testkey.avbpubkey",
2492 private_key: "testkey.pem",
2493 }
2494 cc_library {
2495 name: "libfoo",
2496 shared_libs: ["libbar"],
2497 apex_available: ["myapex"],
2498 min_sdk_version: "29",
2499 }
2500 cc_library {
2501 name: "libbar",
2502 apex_available: ["myapex"],
2503 }
2504 `, withSAsActiveCodeNames)
2505}
2506
2507func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002508 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2509 variables.Platform_sdk_codename = proptools.StringPtr("S")
2510 variables.Platform_version_active_codenames = []string{"S", "T"}
2511 })
Colin Cross1c460562021-02-16 17:55:47 -08002512 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002513 apex {
2514 name: "myapex",
2515 key: "myapex.key",
2516 native_shared_libs: ["libfoo"],
2517 min_sdk_version: "S",
2518 }
2519 apex_key {
2520 name: "myapex.key",
2521 public_key: "testkey.avbpubkey",
2522 private_key: "testkey.pem",
2523 }
2524 cc_library {
2525 name: "libfoo",
2526 shared_libs: ["libbar"],
2527 apex_available: ["myapex"],
2528 min_sdk_version: "S",
2529 }
2530 cc_library {
2531 name: "libbar",
2532 stubs: {
2533 symbol_file: "libbar.map.txt",
2534 versions: ["30", "S", "T"],
2535 },
2536 }
2537 `, withSAsActiveCodeNames)
2538
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002539 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002540 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2541 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002542 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002543}
2544
Jiyong Park7c2ee712018-12-07 00:42:25 +09002545func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002546 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002547 apex {
2548 name: "myapex",
2549 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002550 native_shared_libs: ["mylib"],
2551 binaries: ["mybin"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002552 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002553 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002554 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 prebuilt_etc {
2564 name: "myetc",
2565 src: "myprebuilt",
2566 sub_dir: "foo/bar",
2567 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002568
2569 cc_library {
2570 name: "mylib",
2571 srcs: ["mylib.cpp"],
2572 relative_install_path: "foo/bar",
2573 system_shared_libs: [],
2574 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002575 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002576 }
2577
2578 cc_binary {
2579 name: "mybin",
2580 srcs: ["mylib.cpp"],
2581 relative_install_path: "foo/bar",
2582 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002583 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002584 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002585 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002586 `)
2587
Sundong Ahnabb64432019-10-22 13:58:29 +09002588 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002589 dirs := strings.Split(generateFsRule.Args["exec_paths"], " ")
2590
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002591 // Ensure that the subdirectories are all listed
Jiyong Park7c2ee712018-12-07 00:42:25 +09002592 ensureListContains(t, dirs, "etc")
2593 ensureListContains(t, dirs, "etc/foo")
2594 ensureListContains(t, dirs, "etc/foo/bar")
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002595 ensureListContains(t, dirs, "lib64")
2596 ensureListContains(t, dirs, "lib64/foo")
2597 ensureListContains(t, dirs, "lib64/foo/bar")
2598 ensureListContains(t, dirs, "lib")
2599 ensureListContains(t, dirs, "lib/foo")
2600 ensureListContains(t, dirs, "lib/foo/bar")
2601
Jiyong Parkbd13e442019-03-15 18:10:35 +09002602 ensureListContains(t, dirs, "bin")
2603 ensureListContains(t, dirs, "bin/foo")
2604 ensureListContains(t, dirs, "bin/foo/bar")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002605}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002606
Jooyung Han35155c42020-02-06 17:33:20 +09002607func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002608 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002609 apex {
2610 name: "myapex",
2611 key: "myapex.key",
2612 multilib: {
2613 both: {
2614 native_shared_libs: ["mylib"],
2615 binaries: ["mybin"],
2616 },
2617 },
2618 compile_multilib: "both",
2619 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002620 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002621 }
2622
2623 apex_key {
2624 name: "myapex.key",
2625 public_key: "testkey.avbpubkey",
2626 private_key: "testkey.pem",
2627 }
2628
2629 cc_library {
2630 name: "mylib",
2631 relative_install_path: "foo/bar",
2632 system_shared_libs: [],
2633 stl: "none",
2634 apex_available: [ "myapex" ],
2635 native_bridge_supported: true,
2636 }
2637
2638 cc_binary {
2639 name: "mybin",
2640 relative_install_path: "foo/bar",
2641 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002642 stl: "none",
2643 apex_available: [ "myapex" ],
2644 native_bridge_supported: true,
2645 compile_multilib: "both", // default is "first" for binary
2646 multilib: {
2647 lib64: {
2648 suffix: "64",
2649 },
2650 },
2651 }
2652 `, withNativeBridgeEnabled)
2653 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2654 "bin/foo/bar/mybin",
2655 "bin/foo/bar/mybin64",
2656 "bin/arm/foo/bar/mybin",
2657 "bin/arm64/foo/bar/mybin64",
2658 "lib/foo/bar/mylib.so",
2659 "lib/arm/foo/bar/mylib.so",
2660 "lib64/foo/bar/mylib.so",
2661 "lib64/arm64/foo/bar/mylib.so",
2662 })
2663}
2664
Jooyung Han85d61762020-06-24 23:50:26 +09002665func TestVendorApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002666 ctx := testApex(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002667 apex {
2668 name: "myapex",
2669 key: "myapex.key",
2670 binaries: ["mybin"],
2671 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002672 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002673 }
2674 apex_key {
2675 name: "myapex.key",
2676 public_key: "testkey.avbpubkey",
2677 private_key: "testkey.pem",
2678 }
2679 cc_binary {
2680 name: "mybin",
2681 vendor: true,
2682 shared_libs: ["libfoo"],
2683 }
2684 cc_library {
2685 name: "libfoo",
2686 proprietary: true,
2687 }
2688 `)
2689
2690 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2691 "bin/mybin",
2692 "lib64/libfoo.so",
2693 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2694 "lib64/libc++.so",
2695 })
2696
2697 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002698 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002699 name := apexBundle.BaseModuleName()
2700 prefix := "TARGET_"
2701 var builder strings.Builder
2702 data.Custom(&builder, name, prefix, "", data)
Paul Duffin37ba3442021-03-29 00:21:08 +01002703 androidMk := android.StringRelativeToTop(ctx.Config(), builder.String())
2704 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002705 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002706
2707 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2708 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2709 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002710}
2711
Jooyung Handf78e212020-07-22 15:54:47 +09002712func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002713 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002714 apex {
2715 name: "myapex",
2716 key: "myapex.key",
2717 binaries: ["mybin"],
2718 vendor: true,
2719 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002720 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002721 }
2722 apex_key {
2723 name: "myapex.key",
2724 public_key: "testkey.avbpubkey",
2725 private_key: "testkey.pem",
2726 }
2727 cc_binary {
2728 name: "mybin",
2729 vendor: true,
2730 shared_libs: ["libvndk", "libvendor"],
2731 }
2732 cc_library {
2733 name: "libvndk",
2734 vndk: {
2735 enabled: true,
2736 },
2737 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002738 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002739 }
2740 cc_library {
2741 name: "libvendor",
2742 vendor: true,
2743 }
2744 `)
2745
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002746 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002747
Paul Duffina71a67a2021-03-29 00:42:57 +01002748 ldRule := ctx.ModuleForTests("mybin", vendorVariant+"_apex10000").Rule("ld")
Jooyung Handf78e212020-07-22 15:54:47 +09002749 libs := names(ldRule.Args["libFlags"])
2750 // VNDK libs(libvndk/libc++) as they are
Paul Duffin37ba3442021-03-29 00:21:08 +01002751 ensureListContains(t, libs, "out/soong/.intermediates/libvndk/"+vendorVariant+"_shared/libvndk.so")
2752 ensureListContains(t, libs, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"libc++/"+vendorVariant+"_shared/libc++.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002753 // non-stable Vendor libs as APEX variants
Paul Duffin37ba3442021-03-29 00:21:08 +01002754 ensureListContains(t, libs, "out/soong/.intermediates/libvendor/"+vendorVariant+"_shared_apex10000/libvendor.so")
Jooyung Handf78e212020-07-22 15:54:47 +09002755
2756 // VNDK libs are not included when use_vndk_as_stable: true
2757 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2758 "bin/mybin",
2759 "lib64/libvendor.so",
2760 })
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002761
2762 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
2763 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2764 ensureListContains(t, requireNativeLibs, ":vndk")
Jooyung Handf78e212020-07-22 15:54:47 +09002765}
2766
Justin Yun13decfb2021-03-08 19:25:55 +09002767func TestProductVariant(t *testing.T) {
2768 ctx := testApex(t, `
2769 apex {
2770 name: "myapex",
2771 key: "myapex.key",
2772 updatable: false,
2773 product_specific: true,
2774 binaries: ["foo"],
2775 }
2776
2777 apex_key {
2778 name: "myapex.key",
2779 public_key: "testkey.avbpubkey",
2780 private_key: "testkey.pem",
2781 }
2782
2783 cc_binary {
2784 name: "foo",
2785 product_available: true,
2786 apex_available: ["myapex"],
2787 srcs: ["foo.cpp"],
2788 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002789 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2790 variables.ProductVndkVersion = proptools.StringPtr("current")
2791 }),
2792 )
Justin Yun13decfb2021-03-08 19:25:55 +09002793
2794 cflags := strings.Fields(
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002795 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09002796 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
2797 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
2798 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
2799 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
2800}
2801
Jooyung Han8e5685d2020-09-21 11:02:57 +09002802func TestApex_withPrebuiltFirmware(t *testing.T) {
2803 testCases := []struct {
2804 name string
2805 additionalProp string
2806 }{
2807 {"system apex with prebuilt_firmware", ""},
2808 {"vendor apex with prebuilt_firmware", "vendor: true,"},
2809 }
2810 for _, tc := range testCases {
2811 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002812 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09002813 apex {
2814 name: "myapex",
2815 key: "myapex.key",
2816 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002817 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09002818 `+tc.additionalProp+`
2819 }
2820 apex_key {
2821 name: "myapex.key",
2822 public_key: "testkey.avbpubkey",
2823 private_key: "testkey.pem",
2824 }
2825 prebuilt_firmware {
2826 name: "myfirmware",
2827 src: "myfirmware.bin",
2828 filename_from_src: true,
2829 `+tc.additionalProp+`
2830 }
2831 `)
2832 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
2833 "etc/firmware/myfirmware.bin",
2834 })
2835 })
2836 }
Jooyung Han0703fd82020-08-26 22:11:53 +09002837}
2838
Jooyung Hanefb184e2020-06-25 17:14:25 +09002839func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002840 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09002841 apex {
2842 name: "myapex",
2843 key: "myapex.key",
2844 vendor: true,
2845 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002846 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09002847 }
2848
2849 apex_key {
2850 name: "myapex.key",
2851 public_key: "testkey.avbpubkey",
2852 private_key: "testkey.pem",
2853 }
2854
2855 cc_library {
2856 name: "mylib",
2857 vendor_available: true,
2858 }
2859 `)
2860
2861 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002862 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09002863 name := apexBundle.BaseModuleName()
2864 prefix := "TARGET_"
2865 var builder strings.Builder
2866 data.Custom(&builder, name, prefix, "", data)
2867 androidMk := builder.String()
2868 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += libc.vendor libm.vendor libdl.vendor\n")
2869}
2870
Jooyung Han2ed99d02020-06-24 23:26:26 +09002871func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002872 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09002873 apex {
2874 name: "myapex",
2875 key: "myapex.key",
2876 vintf_fragments: ["fragment.xml"],
2877 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002878 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09002879 }
2880 apex_key {
2881 name: "myapex.key",
2882 public_key: "testkey.avbpubkey",
2883 private_key: "testkey.pem",
2884 }
2885 cc_binary {
2886 name: "mybin",
2887 }
2888 `)
2889
2890 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07002891 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09002892 name := apexBundle.BaseModuleName()
2893 prefix := "TARGET_"
2894 var builder strings.Builder
2895 data.Custom(&builder, name, prefix, "", data)
2896 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04002897 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04002898 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09002899}
2900
Jiyong Park16e91a02018-12-20 18:18:08 +09002901func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002902 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09002903 apex {
2904 name: "myapex",
2905 key: "myapex.key",
2906 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002907 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09002908 }
2909
2910 apex_key {
2911 name: "myapex.key",
2912 public_key: "testkey.avbpubkey",
2913 private_key: "testkey.pem",
2914 }
2915
2916 cc_library {
2917 name: "mylib",
2918 srcs: ["mylib.cpp"],
2919 system_shared_libs: [],
2920 stl: "none",
2921 stubs: {
2922 versions: ["1", "2", "3"],
2923 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002924 apex_available: [
2925 "//apex_available:platform",
2926 "myapex",
2927 ],
Jiyong Park16e91a02018-12-20 18:18:08 +09002928 }
2929
2930 cc_binary {
2931 name: "not_in_apex",
2932 srcs: ["mylib.cpp"],
2933 static_libs: ["mylib"],
2934 static_executable: true,
2935 system_shared_libs: [],
2936 stl: "none",
2937 }
Jiyong Park16e91a02018-12-20 18:18:08 +09002938 `)
2939
Colin Cross7113d202019-11-20 16:39:12 -08002940 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09002941
2942 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08002943 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09002944}
Jiyong Park9335a262018-12-24 11:31:58 +09002945
2946func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002947 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09002948 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002949 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09002950 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002951 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09002952 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09002953 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002954 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09002955 }
2956
2957 cc_library {
2958 name: "mylib",
2959 srcs: ["mylib.cpp"],
2960 system_shared_libs: [],
2961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002962 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09002963 }
2964
2965 apex_key {
2966 name: "myapex.key",
2967 public_key: "testkey.avbpubkey",
2968 private_key: "testkey.pem",
2969 }
2970
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002971 android_app_certificate {
2972 name: "myapex.certificate",
2973 certificate: "testkey",
2974 }
2975
2976 android_app_certificate {
2977 name: "myapex.certificate.override",
2978 certificate: "testkey.override",
2979 }
2980
Jiyong Park9335a262018-12-24 11:31:58 +09002981 `)
2982
2983 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09002984 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09002985
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002986 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
2987 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002988 "vendor/foo/devkeys/testkey.avbpubkey")
2989 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08002990 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
2991 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09002992 "vendor/foo/devkeys/testkey.pem")
2993 }
2994
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002995 // check the APK certs. It should be overridden to myapex.certificate.override
Sundong Ahnabb64432019-10-22 13:58:29 +09002996 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002997 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09002998 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09002999 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003000 }
3001}
Jiyong Park58e364a2019-01-19 19:24:06 +09003002
Jooyung Hanf121a652019-12-17 14:30:11 +09003003func TestCertificate(t *testing.T) {
3004 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003005 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003006 apex {
3007 name: "myapex",
3008 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003009 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003010 }
3011 apex_key {
3012 name: "myapex.key",
3013 public_key: "testkey.avbpubkey",
3014 private_key: "testkey.pem",
3015 }`)
3016 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3017 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3018 if actual := rule.Args["certificates"]; actual != expected {
3019 t.Errorf("certificates should be %q, not %q", expected, actual)
3020 }
3021 })
3022 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003023 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003024 apex {
3025 name: "myapex_keytest",
3026 key: "myapex.key",
3027 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003028 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003029 }
3030 apex_key {
3031 name: "myapex.key",
3032 public_key: "testkey.avbpubkey",
3033 private_key: "testkey.pem",
3034 }
3035 android_app_certificate {
3036 name: "myapex.certificate.override",
3037 certificate: "testkey.override",
3038 }`)
3039 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3040 expected := "testkey.override.x509.pem testkey.override.pk8"
3041 if actual := rule.Args["certificates"]; actual != expected {
3042 t.Errorf("certificates should be %q, not %q", expected, actual)
3043 }
3044 })
3045 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003046 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003047 apex {
3048 name: "myapex",
3049 key: "myapex.key",
3050 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003051 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003052 }
3053 apex_key {
3054 name: "myapex.key",
3055 public_key: "testkey.avbpubkey",
3056 private_key: "testkey.pem",
3057 }
3058 android_app_certificate {
3059 name: "myapex.certificate",
3060 certificate: "testkey",
3061 }`)
3062 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3063 expected := "testkey.x509.pem testkey.pk8"
3064 if actual := rule.Args["certificates"]; actual != expected {
3065 t.Errorf("certificates should be %q, not %q", expected, actual)
3066 }
3067 })
3068 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003069 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003070 apex {
3071 name: "myapex_keytest",
3072 key: "myapex.key",
3073 file_contexts: ":myapex-file_contexts",
3074 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003075 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003076 }
3077 apex_key {
3078 name: "myapex.key",
3079 public_key: "testkey.avbpubkey",
3080 private_key: "testkey.pem",
3081 }
3082 android_app_certificate {
3083 name: "myapex.certificate.override",
3084 certificate: "testkey.override",
3085 }`)
3086 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3087 expected := "testkey.override.x509.pem testkey.override.pk8"
3088 if actual := rule.Args["certificates"]; actual != expected {
3089 t.Errorf("certificates should be %q, not %q", expected, actual)
3090 }
3091 })
3092 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003093 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003094 apex {
3095 name: "myapex",
3096 key: "myapex.key",
3097 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003098 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003099 }
3100 apex_key {
3101 name: "myapex.key",
3102 public_key: "testkey.avbpubkey",
3103 private_key: "testkey.pem",
3104 }`)
3105 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
3106 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3107 if actual := rule.Args["certificates"]; actual != expected {
3108 t.Errorf("certificates should be %q, not %q", expected, actual)
3109 }
3110 })
3111 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003112 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003113 apex {
3114 name: "myapex_keytest",
3115 key: "myapex.key",
3116 file_contexts: ":myapex-file_contexts",
3117 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003118 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003119 }
3120 apex_key {
3121 name: "myapex.key",
3122 public_key: "testkey.avbpubkey",
3123 private_key: "testkey.pem",
3124 }
3125 android_app_certificate {
3126 name: "myapex.certificate.override",
3127 certificate: "testkey.override",
3128 }`)
3129 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
3130 expected := "testkey.override.x509.pem testkey.override.pk8"
3131 if actual := rule.Args["certificates"]; actual != expected {
3132 t.Errorf("certificates should be %q, not %q", expected, actual)
3133 }
3134 })
3135}
3136
Jiyong Park58e364a2019-01-19 19:24:06 +09003137func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003138 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003139 apex {
3140 name: "myapex",
3141 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003142 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003143 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003144 }
3145
3146 apex {
3147 name: "otherapex",
3148 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003149 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003150 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003151 }
3152
3153 apex_key {
3154 name: "myapex.key",
3155 public_key: "testkey.avbpubkey",
3156 private_key: "testkey.pem",
3157 }
3158
3159 cc_library {
3160 name: "mylib",
3161 srcs: ["mylib.cpp"],
3162 system_shared_libs: [],
3163 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003164 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003165 "myapex",
3166 "otherapex",
3167 ],
Jooyung Han24282772020-03-21 23:20:55 +09003168 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003169 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003170 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003171 cc_library {
3172 name: "mylib2",
3173 srcs: ["mylib.cpp"],
3174 system_shared_libs: [],
3175 stl: "none",
3176 apex_available: [
3177 "myapex",
3178 "otherapex",
3179 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003180 static_libs: ["mylib3"],
3181 recovery_available: true,
3182 min_sdk_version: "29",
3183 }
3184 cc_library {
3185 name: "mylib3",
3186 srcs: ["mylib.cpp"],
3187 system_shared_libs: [],
3188 stl: "none",
3189 apex_available: [
3190 "myapex",
3191 "otherapex",
3192 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003193 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003194 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003195 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003196 `)
3197
Jooyung Hanc87a0592020-03-02 17:44:33 +09003198 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003199 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003200 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003201 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003202
Jooyung Hanccce2f22020-03-07 03:45:53 +09003203 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003204 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003205 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003206 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=10000")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003207
Jooyung Hanccce2f22020-03-07 03:45:53 +09003208 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX_SDK__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003209 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003210 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003211 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__=29")
Jiyong Park58e364a2019-01-19 19:24:06 +09003212
Colin Crossaede88c2020-08-11 12:17:01 -07003213 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3214 // each variant defines additional macros to distinguish which apex variant it is built for
3215
3216 // non-APEX variant does not have __ANDROID_APEX__ defined
3217 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3218 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3219
Dan Albertb19953d2020-11-17 15:29:36 -08003220 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003221 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3222 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003223 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Colin Crossaede88c2020-08-11 12:17:01 -07003224
Jooyung Hanc87a0592020-03-02 17:44:33 +09003225 // non-APEX variant does not have __ANDROID_APEX__ defined
3226 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3227 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3228
Dan Albertb19953d2020-11-17 15:29:36 -08003229 // recovery variant does not set __ANDROID_APEX_MIN_SDK_VERSION__
Colin Crossaede88c2020-08-11 12:17:01 -07003230 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003231 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Dan Albertb19953d2020-11-17 15:29:36 -08003232 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX_MIN_SDK_VERSION__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003233}
Jiyong Park7e636d02019-01-28 16:16:54 +09003234
3235func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003236 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003237 apex {
3238 name: "myapex",
3239 key: "myapex.key",
3240 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003241 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003242 }
3243
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249
3250 cc_library_headers {
3251 name: "mylib_headers",
3252 export_include_dirs: ["my_include"],
3253 system_shared_libs: [],
3254 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003255 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003256 }
3257
3258 cc_library {
3259 name: "mylib",
3260 srcs: ["mylib.cpp"],
3261 system_shared_libs: [],
3262 stl: "none",
3263 header_libs: ["mylib_headers"],
3264 export_header_lib_headers: ["mylib_headers"],
3265 stubs: {
3266 versions: ["1", "2", "3"],
3267 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003268 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003269 }
3270
3271 cc_library {
3272 name: "otherlib",
3273 srcs: ["mylib.cpp"],
3274 system_shared_libs: [],
3275 stl: "none",
3276 shared_libs: ["mylib"],
3277 }
3278 `)
3279
Colin Cross7113d202019-11-20 16:39:12 -08003280 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003281
3282 // Ensure that the include path of the header lib is exported to 'otherlib'
3283 ensureContains(t, cFlags, "-Imy_include")
3284}
Alex Light9670d332019-01-29 18:07:33 -08003285
Jiyong Park7cd10e32020-01-14 09:22:18 +09003286type fileInApex struct {
3287 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003288 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003289 isLink bool
3290}
3291
Jooyung Hana57af4a2020-01-23 05:36:59 +00003292func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003293 t.Helper()
Jooyung Hana57af4a2020-01-23 05:36:59 +00003294 apexRule := ctx.ModuleForTests(moduleName, variant).Rule("apexRule")
Jooyung Han31c470b2019-10-18 16:26:59 +09003295 copyCmds := apexRule.Args["copy_commands"]
3296 imageApexDir := "/image.apex/"
Jiyong Park7cd10e32020-01-14 09:22:18 +09003297 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003298 for _, cmd := range strings.Split(copyCmds, "&&") {
3299 cmd = strings.TrimSpace(cmd)
3300 if cmd == "" {
3301 continue
3302 }
3303 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003304 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003305 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003306 switch terms[0] {
3307 case "mkdir":
3308 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003309 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003310 t.Fatal("copyCmds contains invalid cp command", cmd)
3311 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003312 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003313 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003314 isLink = false
3315 case "ln":
3316 if len(terms) != 3 && len(terms) != 4 {
3317 // ln LINK TARGET or ln -s LINK TARGET
3318 t.Fatal("copyCmds contains invalid ln command", cmd)
3319 }
3320 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003321 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003322 isLink = true
3323 default:
3324 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3325 }
3326 if dst != "" {
Jooyung Han31c470b2019-10-18 16:26:59 +09003327 index := strings.Index(dst, imageApexDir)
3328 if index == -1 {
3329 t.Fatal("copyCmds should copy a file to image.apex/", cmd)
3330 }
3331 dstFile := dst[index+len(imageApexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003332 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003333 }
3334 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003335 return ret
3336}
3337
Jooyung Hana57af4a2020-01-23 05:36:59 +00003338func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3339 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003340 var failed bool
3341 var surplus []string
3342 filesMatched := make(map[string]bool)
Jooyung Hana57af4a2020-01-23 05:36:59 +00003343 for _, file := range getFiles(t, ctx, moduleName, variant) {
Jooyung Hane6436d72020-02-27 13:31:56 +09003344 mactchFound := false
Jiyong Park7cd10e32020-01-14 09:22:18 +09003345 for _, expected := range files {
3346 if matched, _ := path.Match(expected, file.path); matched {
3347 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003348 mactchFound = true
3349 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003350 }
3351 }
Jooyung Hane6436d72020-02-27 13:31:56 +09003352 if !mactchFound {
3353 surplus = append(surplus, file.path)
3354 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003355 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003356
Jooyung Han31c470b2019-10-18 16:26:59 +09003357 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003358 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003359 t.Log("surplus files", surplus)
3360 failed = true
3361 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003362
3363 if len(files) > len(filesMatched) {
3364 var missing []string
3365 for _, expected := range files {
3366 if !filesMatched[expected] {
3367 missing = append(missing, expected)
3368 }
3369 }
3370 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003371 t.Log("missing files", missing)
3372 failed = true
3373 }
3374 if failed {
3375 t.Fail()
3376 }
3377}
3378
Jooyung Han344d5432019-08-23 11:17:39 +09003379func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003380 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003381 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003382 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003383 "etc/llndk.libraries.29.txt",
3384 "etc/vndkcore.libraries.29.txt",
3385 "etc/vndksp.libraries.29.txt",
3386 "etc/vndkprivate.libraries.29.txt",
3387 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003388 }
3389 testCases := []struct {
3390 vndkVersion string
3391 expectedFiles []string
3392 }{
3393 {
3394 vndkVersion: "current",
3395 expectedFiles: append(commonFiles,
3396 "lib/libvndk.so",
3397 "lib/libvndksp.so",
3398 "lib64/libvndk.so",
3399 "lib64/libvndksp.so"),
3400 },
3401 {
3402 vndkVersion: "",
3403 expectedFiles: append(commonFiles,
3404 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3405 "lib/libvndksp.so",
3406 "lib64/libvndksp.so"),
3407 },
3408 }
3409 for _, tc := range testCases {
3410 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3411 ctx := testApex(t, `
3412 apex_vndk {
3413 name: "com.android.vndk.current",
3414 key: "com.android.vndk.current.key",
3415 updatable: false,
3416 }
3417
3418 apex_key {
3419 name: "com.android.vndk.current.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423
3424 cc_library {
3425 name: "libvndk",
3426 srcs: ["mylib.cpp"],
3427 vendor_available: true,
3428 product_available: true,
3429 vndk: {
3430 enabled: true,
3431 },
3432 system_shared_libs: [],
3433 stl: "none",
3434 apex_available: [ "com.android.vndk.current" ],
3435 }
3436
3437 cc_library {
3438 name: "libvndksp",
3439 srcs: ["mylib.cpp"],
3440 vendor_available: true,
3441 product_available: true,
3442 vndk: {
3443 enabled: true,
3444 support_system_process: true,
3445 },
3446 system_shared_libs: [],
3447 stl: "none",
3448 apex_available: [ "com.android.vndk.current" ],
3449 }
3450
3451 // VNDK-Ext should not cause any problems
3452
3453 cc_library {
3454 name: "libvndk.ext",
3455 srcs: ["mylib2.cpp"],
3456 vendor: true,
3457 vndk: {
3458 enabled: true,
3459 extends: "libvndk",
3460 },
3461 system_shared_libs: [],
3462 stl: "none",
3463 }
3464
3465 cc_library {
3466 name: "libvndksp.ext",
3467 srcs: ["mylib2.cpp"],
3468 vendor: true,
3469 vndk: {
3470 enabled: true,
3471 support_system_process: true,
3472 extends: "libvndksp",
3473 },
3474 system_shared_libs: [],
3475 stl: "none",
3476 }
3477 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3478 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
3479 }))
3480 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
3481 })
3482 }
Jooyung Han344d5432019-08-23 11:17:39 +09003483}
3484
3485func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003486 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003487 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003488 name: "com.android.vndk.current",
3489 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003490 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003491 }
3492
3493 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003494 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003495 public_key: "testkey.avbpubkey",
3496 private_key: "testkey.pem",
3497 }
3498
3499 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003500 name: "libvndk",
3501 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003502 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003503 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003504 vndk: {
3505 enabled: true,
3506 },
3507 system_shared_libs: [],
3508 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003509 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003510 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003511
3512 cc_prebuilt_library_shared {
3513 name: "libvndk.arm",
3514 srcs: ["libvndk.arm.so"],
3515 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003516 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003517 vndk: {
3518 enabled: true,
3519 },
3520 enabled: false,
3521 arch: {
3522 arm: {
3523 enabled: true,
3524 },
3525 },
3526 system_shared_libs: [],
3527 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003528 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003529 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003530 `+vndkLibrariesTxtFiles("current"),
3531 withFiles(map[string][]byte{
3532 "libvndk.so": nil,
3533 "libvndk.arm.so": nil,
3534 }))
Colin Cross2807f002021-03-02 10:15:29 -08003535 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003536 "lib/libvndk.so",
3537 "lib/libvndk.arm.so",
3538 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003539 "lib/libc++.so",
3540 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003541 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003542 })
Jooyung Han344d5432019-08-23 11:17:39 +09003543}
3544
Jooyung Han39edb6c2019-11-06 16:53:07 +09003545func vndkLibrariesTxtFiles(vers ...string) (result string) {
3546 for _, v := range vers {
3547 if v == "current" {
Justin Yun8a2600c2020-12-07 12:44:03 +09003548 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003549 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003550 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003551 name: "` + txt + `.libraries.txt",
3552 }
3553 `
3554 }
3555 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003556 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003557 result += `
3558 prebuilt_etc {
3559 name: "` + txt + `.libraries.` + v + `.txt",
3560 src: "dummy.txt",
3561 }
3562 `
3563 }
3564 }
3565 }
3566 return
3567}
3568
Jooyung Han344d5432019-08-23 11:17:39 +09003569func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003570 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003571 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003572 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003573 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003574 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003575 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003576 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003577 }
3578
3579 apex_key {
3580 name: "myapex.key",
3581 public_key: "testkey.avbpubkey",
3582 private_key: "testkey.pem",
3583 }
3584
Jooyung Han31c470b2019-10-18 16:26:59 +09003585 vndk_prebuilt_shared {
3586 name: "libvndk27",
3587 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003588 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003589 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003590 vndk: {
3591 enabled: true,
3592 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003593 target_arch: "arm64",
3594 arch: {
3595 arm: {
3596 srcs: ["libvndk27_arm.so"],
3597 },
3598 arm64: {
3599 srcs: ["libvndk27_arm64.so"],
3600 },
3601 },
Colin Cross2807f002021-03-02 10:15:29 -08003602 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003603 }
3604
3605 vndk_prebuilt_shared {
3606 name: "libvndk27",
3607 version: "27",
3608 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003609 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003610 vndk: {
3611 enabled: true,
3612 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003613 target_arch: "x86_64",
3614 arch: {
3615 x86: {
3616 srcs: ["libvndk27_x86.so"],
3617 },
3618 x86_64: {
3619 srcs: ["libvndk27_x86_64.so"],
3620 },
3621 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003622 }
3623 `+vndkLibrariesTxtFiles("27"),
3624 withFiles(map[string][]byte{
3625 "libvndk27_arm.so": nil,
3626 "libvndk27_arm64.so": nil,
3627 "libvndk27_x86.so": nil,
3628 "libvndk27_x86_64.so": nil,
3629 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003630
Colin Cross2807f002021-03-02 10:15:29 -08003631 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003632 "lib/libvndk27_arm.so",
3633 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003634 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003635 })
Jooyung Han344d5432019-08-23 11:17:39 +09003636}
3637
Jooyung Han90eee022019-10-01 20:02:42 +09003638func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003639 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003640 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003641 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003642 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003643 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003644 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003645 }
3646 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003647 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003648 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003649 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003650 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003651 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003652 }
3653 apex_key {
3654 name: "myapex.key",
3655 public_key: "testkey.avbpubkey",
3656 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003657 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09003658
3659 assertApexName := func(expected, moduleName string) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003660 bundle := ctx.ModuleForTests(moduleName, "android_common_image").Module().(*apexBundle)
Jooyung Han90eee022019-10-01 20:02:42 +09003661 actual := proptools.String(bundle.properties.Apex_name)
3662 if !reflect.DeepEqual(actual, expected) {
3663 t.Errorf("Got '%v', expected '%v'", actual, expected)
3664 }
3665 }
3666
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003667 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08003668 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003669}
3670
Jooyung Han344d5432019-08-23 11:17:39 +09003671func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003672 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003673 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003674 name: "com.android.vndk.current",
3675 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003676 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003677 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003678 }
3679
3680 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003681 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003682 public_key: "testkey.avbpubkey",
3683 private_key: "testkey.pem",
3684 }
3685
3686 cc_library {
3687 name: "libvndk",
3688 srcs: ["mylib.cpp"],
3689 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003690 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003691 native_bridge_supported: true,
3692 host_supported: true,
3693 vndk: {
3694 enabled: true,
3695 },
3696 system_shared_libs: [],
3697 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003698 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003699 }
Colin Cross2807f002021-03-02 10:15:29 -08003700 `+vndkLibrariesTxtFiles("current"),
3701 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09003702
Colin Cross2807f002021-03-02 10:15:29 -08003703 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003704 "lib/libvndk.so",
3705 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003706 "lib/libc++.so",
3707 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003708 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003709 })
Jooyung Han344d5432019-08-23 11:17:39 +09003710}
3711
3712func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08003713 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003714 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003715 name: "com.android.vndk.current",
3716 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003717 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003718 native_bridge_supported: true,
3719 }
3720
3721 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003722 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003723 public_key: "testkey.avbpubkey",
3724 private_key: "testkey.pem",
3725 }
3726
3727 cc_library {
3728 name: "libvndk",
3729 srcs: ["mylib.cpp"],
3730 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003731 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003732 native_bridge_supported: true,
3733 host_supported: true,
3734 vndk: {
3735 enabled: true,
3736 },
3737 system_shared_libs: [],
3738 stl: "none",
3739 }
3740 `)
3741}
3742
Jooyung Han31c470b2019-10-18 16:26:59 +09003743func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003744 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003745 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003746 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003747 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003748 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003749 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003750 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003751 }
3752
3753 apex_key {
3754 name: "myapex.key",
3755 public_key: "testkey.avbpubkey",
3756 private_key: "testkey.pem",
3757 }
3758
3759 vndk_prebuilt_shared {
3760 name: "libvndk27",
3761 version: "27",
3762 target_arch: "arm",
3763 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003764 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003765 vndk: {
3766 enabled: true,
3767 },
3768 arch: {
3769 arm: {
3770 srcs: ["libvndk27.so"],
3771 }
3772 },
3773 }
3774
3775 vndk_prebuilt_shared {
3776 name: "libvndk27",
3777 version: "27",
3778 target_arch: "arm",
3779 binder32bit: true,
3780 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003781 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003782 vndk: {
3783 enabled: true,
3784 },
3785 arch: {
3786 arm: {
3787 srcs: ["libvndk27binder32.so"],
3788 }
3789 },
Colin Cross2807f002021-03-02 10:15:29 -08003790 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003791 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003792 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003793 withFiles(map[string][]byte{
3794 "libvndk27.so": nil,
3795 "libvndk27binder32.so": nil,
3796 }),
3797 withBinder32bit,
3798 withTargets(map[android.OsType][]android.Target{
3799 android.Android: []android.Target{
Jooyung Han35155c42020-02-06 17:33:20 +09003800 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3801 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 },
3803 }),
3804 )
3805
Colin Cross2807f002021-03-02 10:15:29 -08003806 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003808 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003809 })
3810}
3811
Jooyung Han45a96772020-06-15 14:59:42 +09003812func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003813 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09003814 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003815 name: "com.android.vndk.current",
3816 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003817 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003818 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09003819 }
3820
3821 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003822 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09003823 public_key: "testkey.avbpubkey",
3824 private_key: "testkey.pem",
3825 }
3826
3827 cc_library {
3828 name: "libz",
3829 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003830 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09003831 vndk: {
3832 enabled: true,
3833 },
3834 stubs: {
3835 symbol_file: "libz.map.txt",
3836 versions: ["30"],
3837 }
3838 }
3839 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
3840 "libz.map.txt": nil,
3841 }))
3842
Colin Cross2807f002021-03-02 10:15:29 -08003843 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09003844 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
3845 ensureListEmpty(t, provideNativeLibs)
3846}
3847
Jooyung Hane1633032019-08-01 17:41:43 +09003848func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003849 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003850 apex {
3851 name: "myapex_nodep",
3852 key: "myapex.key",
3853 native_shared_libs: ["lib_nodep"],
3854 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003855 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003856 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003857 }
3858
3859 apex {
3860 name: "myapex_dep",
3861 key: "myapex.key",
3862 native_shared_libs: ["lib_dep"],
3863 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003864 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003865 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003866 }
3867
3868 apex {
3869 name: "myapex_provider",
3870 key: "myapex.key",
3871 native_shared_libs: ["libfoo"],
3872 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003873 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003874 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003875 }
3876
3877 apex {
3878 name: "myapex_selfcontained",
3879 key: "myapex.key",
3880 native_shared_libs: ["lib_dep", "libfoo"],
3881 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003882 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003883 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003884 }
3885
3886 apex_key {
3887 name: "myapex.key",
3888 public_key: "testkey.avbpubkey",
3889 private_key: "testkey.pem",
3890 }
3891
3892 cc_library {
3893 name: "lib_nodep",
3894 srcs: ["mylib.cpp"],
3895 system_shared_libs: [],
3896 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003897 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003898 }
3899
3900 cc_library {
3901 name: "lib_dep",
3902 srcs: ["mylib.cpp"],
3903 shared_libs: ["libfoo"],
3904 system_shared_libs: [],
3905 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003906 apex_available: [
3907 "myapex_dep",
3908 "myapex_provider",
3909 "myapex_selfcontained",
3910 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003911 }
3912
3913 cc_library {
3914 name: "libfoo",
3915 srcs: ["mytest.cpp"],
3916 stubs: {
3917 versions: ["1"],
3918 },
3919 system_shared_libs: [],
3920 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003921 apex_available: [
3922 "myapex_provider",
3923 "myapex_selfcontained",
3924 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003925 }
3926 `)
3927
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003928 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09003929 var provideNativeLibs, requireNativeLibs []string
3930
Sundong Ahnabb64432019-10-22 13:58:29 +09003931 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003932 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3933 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003934 ensureListEmpty(t, provideNativeLibs)
3935 ensureListEmpty(t, requireNativeLibs)
3936
Sundong Ahnabb64432019-10-22 13:58:29 +09003937 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003938 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3939 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003940 ensureListEmpty(t, provideNativeLibs)
3941 ensureListContains(t, requireNativeLibs, "libfoo.so")
3942
Sundong Ahnabb64432019-10-22 13:58:29 +09003943 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003944 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3945 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003946 ensureListContains(t, provideNativeLibs, "libfoo.so")
3947 ensureListEmpty(t, requireNativeLibs)
3948
Sundong Ahnabb64432019-10-22 13:58:29 +09003949 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003950 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
3951 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09003952 ensureListContains(t, provideNativeLibs, "libfoo.so")
3953 ensureListEmpty(t, requireNativeLibs)
3954}
3955
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003956func TestApexName(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003957 ctx := testApex(t, `
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003958 apex {
3959 name: "myapex",
3960 key: "myapex.key",
3961 apex_name: "com.android.myapex",
Jiyong Parkdb334862020-02-05 17:19:28 +09003962 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003963 updatable: false,
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003964 }
3965
3966 apex_key {
3967 name: "myapex.key",
3968 public_key: "testkey.avbpubkey",
3969 private_key: "testkey.pem",
3970 }
Jiyong Parkdb334862020-02-05 17:19:28 +09003971
3972 cc_library {
3973 name: "mylib",
3974 srcs: ["mylib.cpp"],
3975 system_shared_libs: [],
3976 stl: "none",
3977 apex_available: [
3978 "//apex_available:platform",
3979 "myapex",
3980 ],
3981 }
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003982 `)
3983
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003984 module := ctx.ModuleForTests("myapex", "android_common_com.android.myapex_image")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003985 apexManifestRule := module.Rule("apexManifestRule")
3986 ensureContains(t, apexManifestRule.Args["opt"], "-v name com.android.myapex")
3987 apexRule := module.Rule("apexRule")
3988 ensureContains(t, apexRule.Args["opt_flags"], "--do_not_check_keyname")
Jiyong Parkdb334862020-02-05 17:19:28 +09003989
Martin Stjernholmbfffae72021-06-24 14:37:13 +01003990 apexBundle := module.Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003991 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Parkdb334862020-02-05 17:19:28 +09003992 name := apexBundle.BaseModuleName()
3993 prefix := "TARGET_"
3994 var builder strings.Builder
3995 data.Custom(&builder, name, prefix, "", data)
3996 androidMk := builder.String()
3997 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
3998 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09003999}
4000
Alex Light0851b882019-02-07 13:20:53 -08004001func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004002 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004003 apex {
4004 name: "myapex",
4005 key: "myapex.key",
4006 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004007 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004008 }
4009
4010 apex_key {
4011 name: "myapex.key",
4012 public_key: "testkey.avbpubkey",
4013 private_key: "testkey.pem",
4014 }
4015
4016 cc_library {
4017 name: "mylib_common",
4018 srcs: ["mylib.cpp"],
4019 system_shared_libs: [],
4020 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004021 apex_available: [
4022 "//apex_available:platform",
4023 "myapex",
4024 ],
Alex Light0851b882019-02-07 13:20:53 -08004025 }
4026 `)
4027
Sundong Ahnabb64432019-10-22 13:58:29 +09004028 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004029 apexRule := module.Rule("apexRule")
4030 copyCmds := apexRule.Args["copy_commands"]
4031
4032 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4033 t.Log("Apex was a test apex!")
4034 t.Fail()
4035 }
4036 // Ensure that main rule creates an output
4037 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4038
4039 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004040 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004041
4042 // Ensure that both direct and indirect deps are copied into apex
4043 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4044
Colin Cross7113d202019-11-20 16:39:12 -08004045 // Ensure that the platform variant ends with _shared
4046 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004047
Colin Cross56a83212020-09-15 18:30:11 -07004048 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004049 t.Log("Found mylib_common not in any apex!")
4050 t.Fail()
4051 }
4052}
4053
4054func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004055 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004056 apex_test {
4057 name: "myapex",
4058 key: "myapex.key",
4059 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004060 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004061 }
4062
4063 apex_key {
4064 name: "myapex.key",
4065 public_key: "testkey.avbpubkey",
4066 private_key: "testkey.pem",
4067 }
4068
4069 cc_library {
4070 name: "mylib_common_test",
4071 srcs: ["mylib.cpp"],
4072 system_shared_libs: [],
4073 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004074 // TODO: remove //apex_available:platform
4075 apex_available: [
4076 "//apex_available:platform",
4077 "myapex",
4078 ],
Alex Light0851b882019-02-07 13:20:53 -08004079 }
4080 `)
4081
Sundong Ahnabb64432019-10-22 13:58:29 +09004082 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Alex Light0851b882019-02-07 13:20:53 -08004083 apexRule := module.Rule("apexRule")
4084 copyCmds := apexRule.Args["copy_commands"]
4085
4086 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4087 t.Log("Apex was not a test apex!")
4088 t.Fail()
4089 }
4090 // Ensure that main rule creates an output
4091 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4092
4093 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004094 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004095
4096 // Ensure that both direct and indirect deps are copied into apex
4097 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4098
Colin Cross7113d202019-11-20 16:39:12 -08004099 // Ensure that the platform variant ends with _shared
4100 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004101}
4102
Alex Light9670d332019-01-29 18:07:33 -08004103func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004104 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004105 apex {
4106 name: "myapex",
4107 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004108 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004109 multilib: {
4110 first: {
4111 native_shared_libs: ["mylib_common"],
4112 }
4113 },
4114 target: {
4115 android: {
4116 multilib: {
4117 first: {
4118 native_shared_libs: ["mylib"],
4119 }
4120 }
4121 },
4122 host: {
4123 multilib: {
4124 first: {
4125 native_shared_libs: ["mylib2"],
4126 }
4127 }
4128 }
4129 }
4130 }
4131
4132 apex_key {
4133 name: "myapex.key",
4134 public_key: "testkey.avbpubkey",
4135 private_key: "testkey.pem",
4136 }
4137
4138 cc_library {
4139 name: "mylib",
4140 srcs: ["mylib.cpp"],
4141 system_shared_libs: [],
4142 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004143 // TODO: remove //apex_available:platform
4144 apex_available: [
4145 "//apex_available:platform",
4146 "myapex",
4147 ],
Alex Light9670d332019-01-29 18:07:33 -08004148 }
4149
4150 cc_library {
4151 name: "mylib_common",
4152 srcs: ["mylib.cpp"],
4153 system_shared_libs: [],
4154 stl: "none",
4155 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004156 // TODO: remove //apex_available:platform
4157 apex_available: [
4158 "//apex_available:platform",
4159 "myapex",
4160 ],
Alex Light9670d332019-01-29 18:07:33 -08004161 }
4162
4163 cc_library {
4164 name: "mylib2",
4165 srcs: ["mylib.cpp"],
4166 system_shared_libs: [],
4167 stl: "none",
4168 compile_multilib: "first",
4169 }
4170 `)
4171
Sundong Ahnabb64432019-10-22 13:58:29 +09004172 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004173 copyCmds := apexRule.Args["copy_commands"]
4174
4175 // Ensure that main rule creates an output
4176 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4177
4178 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004179 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4180 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4181 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004182
4183 // Ensure that both direct and indirect deps are copied into apex
4184 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4185 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4186 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4187
Colin Cross7113d202019-11-20 16:39:12 -08004188 // Ensure that the platform variant ends with _shared
4189 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4190 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4191 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004192}
Jiyong Park04480cf2019-02-06 00:16:29 +09004193
Jiyong Park59140302020-12-14 18:44:04 +09004194func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004195 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004196 apex {
4197 name: "myapex",
4198 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004199 updatable: false,
Jiyong Park59140302020-12-14 18:44:04 +09004200 arch: {
4201 arm64: {
4202 native_shared_libs: ["mylib.arm64"],
4203 },
4204 x86_64: {
4205 native_shared_libs: ["mylib.x64"],
4206 },
4207 }
4208 }
4209
4210 apex_key {
4211 name: "myapex.key",
4212 public_key: "testkey.avbpubkey",
4213 private_key: "testkey.pem",
4214 }
4215
4216 cc_library {
4217 name: "mylib.arm64",
4218 srcs: ["mylib.cpp"],
4219 system_shared_libs: [],
4220 stl: "none",
4221 // TODO: remove //apex_available:platform
4222 apex_available: [
4223 "//apex_available:platform",
4224 "myapex",
4225 ],
4226 }
4227
4228 cc_library {
4229 name: "mylib.x64",
4230 srcs: ["mylib.cpp"],
4231 system_shared_libs: [],
4232 stl: "none",
4233 // TODO: remove //apex_available:platform
4234 apex_available: [
4235 "//apex_available:platform",
4236 "myapex",
4237 ],
4238 }
4239 `)
4240
4241 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
4242 copyCmds := apexRule.Args["copy_commands"]
4243
4244 // Ensure that apex variant is created for the direct dep
4245 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
4246 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4247
4248 // Ensure that both direct and indirect deps are copied into apex
4249 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4250 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4251}
4252
Jiyong Park04480cf2019-02-06 00:16:29 +09004253func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004254 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004255 apex {
4256 name: "myapex",
4257 key: "myapex.key",
4258 binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004259 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004260 }
4261
4262 apex_key {
4263 name: "myapex.key",
4264 public_key: "testkey.avbpubkey",
4265 private_key: "testkey.pem",
4266 }
4267
4268 sh_binary {
4269 name: "myscript",
4270 src: "mylib.cpp",
4271 filename: "myscript.sh",
4272 sub_dir: "script",
4273 }
4274 `)
4275
Sundong Ahnabb64432019-10-22 13:58:29 +09004276 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004277 copyCmds := apexRule.Args["copy_commands"]
4278
4279 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4280}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004281
Jooyung Han91df2082019-11-20 01:49:42 +09004282func TestApexInVariousPartition(t *testing.T) {
4283 testcases := []struct {
4284 propName, parition, flattenedPartition string
4285 }{
4286 {"", "system", "system_ext"},
4287 {"product_specific: true", "product", "product"},
4288 {"soc_specific: true", "vendor", "vendor"},
4289 {"proprietary: true", "vendor", "vendor"},
4290 {"vendor: true", "vendor", "vendor"},
4291 {"system_ext_specific: true", "system_ext", "system_ext"},
4292 }
4293 for _, tc := range testcases {
4294 t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004295 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004296 apex {
4297 name: "myapex",
4298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004299 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004300 `+tc.propName+`
4301 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004302
Jooyung Han91df2082019-11-20 01:49:42 +09004303 apex_key {
4304 name: "myapex.key",
4305 public_key: "testkey.avbpubkey",
4306 private_key: "testkey.pem",
4307 }
4308 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004309
Jooyung Han91df2082019-11-20 01:49:42 +09004310 apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004311 expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
4312 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004313 if actual != expected {
4314 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4315 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004316
Jooyung Han91df2082019-11-20 01:49:42 +09004317 flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Paul Duffin37ba3442021-03-29 00:21:08 +01004318 expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
4319 actual = flattened.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004320 if actual != expected {
4321 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4322 }
4323 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004324 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004325}
Jiyong Park67882562019-03-21 01:11:21 +09004326
Jooyung Han580eb4f2020-06-24 19:33:06 +09004327func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004328 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004329 apex {
4330 name: "myapex",
4331 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004332 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004333 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004334
Jooyung Han580eb4f2020-06-24 19:33:06 +09004335 apex_key {
4336 name: "myapex.key",
4337 public_key: "testkey.avbpubkey",
4338 private_key: "testkey.pem",
4339 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004340 `)
4341 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004342 rule := module.Output("file_contexts")
4343 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4344}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004345
Jooyung Han580eb4f2020-06-24 19:33:06 +09004346func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004347 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004348 apex {
4349 name: "myapex",
4350 key: "myapex.key",
4351 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004352 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004353 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004354
Jooyung Han580eb4f2020-06-24 19:33:06 +09004355 apex_key {
4356 name: "myapex.key",
4357 public_key: "testkey.avbpubkey",
4358 private_key: "testkey.pem",
4359 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004360 `, withFiles(map[string][]byte{
4361 "my_own_file_contexts": nil,
4362 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004363}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004364
Jooyung Han580eb4f2020-06-24 19:33:06 +09004365func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004366 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004367 apex {
4368 name: "myapex",
4369 key: "myapex.key",
4370 product_specific: true,
4371 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004372 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004373 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004374
Jooyung Han580eb4f2020-06-24 19:33:06 +09004375 apex_key {
4376 name: "myapex.key",
4377 public_key: "testkey.avbpubkey",
4378 private_key: "testkey.pem",
4379 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004380 `)
4381
Colin Cross1c460562021-02-16 17:55:47 -08004382 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004383 apex {
4384 name: "myapex",
4385 key: "myapex.key",
4386 product_specific: true,
4387 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004388 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004389 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004390
Jooyung Han580eb4f2020-06-24 19:33:06 +09004391 apex_key {
4392 name: "myapex.key",
4393 public_key: "testkey.avbpubkey",
4394 private_key: "testkey.pem",
4395 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004396 `, withFiles(map[string][]byte{
4397 "product_specific_file_contexts": nil,
4398 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004399 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4400 rule := module.Output("file_contexts")
4401 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4402}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403
Jooyung Han580eb4f2020-06-24 19:33:06 +09004404func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004405 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004406 apex {
4407 name: "myapex",
4408 key: "myapex.key",
4409 product_specific: true,
4410 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004411 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004412 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004413
Jooyung Han580eb4f2020-06-24 19:33:06 +09004414 apex_key {
4415 name: "myapex.key",
4416 public_key: "testkey.avbpubkey",
4417 private_key: "testkey.pem",
4418 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004419
Jooyung Han580eb4f2020-06-24 19:33:06 +09004420 filegroup {
4421 name: "my-file-contexts",
4422 srcs: ["product_specific_file_contexts"],
4423 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004424 `, withFiles(map[string][]byte{
4425 "product_specific_file_contexts": nil,
4426 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004427 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
4428 rule := module.Output("file_contexts")
4429 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004430}
4431
Jiyong Park67882562019-03-21 01:11:21 +09004432func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004433 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004434 apex_key {
4435 name: "myapex.key",
4436 public_key: ":my.avbpubkey",
4437 private_key: ":my.pem",
4438 product_specific: true,
4439 }
4440
4441 filegroup {
4442 name: "my.avbpubkey",
4443 srcs: ["testkey2.avbpubkey"],
4444 }
4445
4446 filegroup {
4447 name: "my.pem",
4448 srcs: ["testkey2.pem"],
4449 }
4450 `)
4451
4452 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4453 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004454 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004455 if actual_pubkey != expected_pubkey {
4456 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4457 }
4458 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004459 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004460 if actual_privkey != expected_privkey {
4461 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4462 }
4463}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004464
4465func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004466 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004467 prebuilt_apex {
4468 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004469 arch: {
4470 arm64: {
4471 src: "myapex-arm64.apex",
4472 },
4473 arm: {
4474 src: "myapex-arm.apex",
4475 },
4476 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004477 }
4478 `)
4479
Paul Duffin6717d882021-06-15 19:09:41 +01004480 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004481
Jiyong Parkc95714e2019-03-29 14:23:10 +09004482 expectedInput := "myapex-arm64.apex"
4483 if prebuilt.inputApex.String() != expectedInput {
4484 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4485 }
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004486}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004487
Paul Duffinc0609c62021-03-01 17:27:16 +00004488func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004489 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004490 prebuilt_apex {
4491 name: "myapex",
4492 }
4493 `)
4494}
4495
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004496func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004497 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004498 prebuilt_apex {
4499 name: "myapex",
4500 src: "myapex-arm.apex",
4501 filename: "notmyapex.apex",
4502 }
4503 `)
4504
Paul Duffin6717d882021-06-15 19:09:41 +01004505 p := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004506
4507 expected := "notmyapex.apex"
4508 if p.installFilename != expected {
4509 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4510 }
4511}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004512
Samiul Islam7c02e262021-09-08 17:48:28 +01004513func TestApexSetFilenameOverride(t *testing.T) {
4514 testApex(t, `
4515 apex_set {
4516 name: "com.company.android.myapex",
4517 apex_name: "com.android.myapex",
4518 set: "company-myapex.apks",
4519 filename: "com.company.android.myapex.apex"
4520 }
4521 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4522
4523 testApex(t, `
4524 apex_set {
4525 name: "com.company.android.myapex",
4526 apex_name: "com.android.myapex",
4527 set: "company-myapex.apks",
4528 filename: "com.company.android.myapex.capex"
4529 }
4530 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4531
4532 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4533 apex_set {
4534 name: "com.company.android.myapex",
4535 apex_name: "com.android.myapex",
4536 set: "company-myapex.apks",
4537 filename: "some-random-suffix"
4538 }
4539 `)
4540}
4541
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004542func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004543 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004544 prebuilt_apex {
4545 name: "myapex.prebuilt",
4546 src: "myapex-arm.apex",
4547 overrides: [
4548 "myapex",
4549 ],
4550 }
4551 `)
4552
Paul Duffin6717d882021-06-15 19:09:41 +01004553 p := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt").Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004554
4555 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004556 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004557 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004558 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004559 }
4560}
4561
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004562func TestPrebuiltApexName(t *testing.T) {
4563 testApex(t, `
4564 prebuilt_apex {
4565 name: "com.company.android.myapex",
4566 apex_name: "com.android.myapex",
4567 src: "company-myapex-arm.apex",
4568 }
4569 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4570
4571 testApex(t, `
4572 apex_set {
4573 name: "com.company.android.myapex",
4574 apex_name: "com.android.myapex",
4575 set: "company-myapex.apks",
4576 }
4577 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4578}
4579
4580func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4581 _ = android.GroupFixturePreparers(
4582 java.PrepareForTestWithJavaDefaultModules,
4583 PrepareForTestWithApexBuildComponents,
4584 android.FixtureWithRootAndroidBp(`
4585 platform_bootclasspath {
4586 name: "platform-bootclasspath",
4587 fragments: [
4588 {
4589 apex: "com.android.art",
4590 module: "art-bootclasspath-fragment",
4591 },
4592 ],
4593 }
4594
4595 prebuilt_apex {
4596 name: "com.company.android.art",
4597 apex_name: "com.android.art",
4598 src: "com.company.android.art-arm.apex",
4599 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4600 }
4601
4602 prebuilt_bootclasspath_fragment {
4603 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004604 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004605 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004606 hidden_api: {
4607 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4608 metadata: "my-bootclasspath-fragment/metadata.csv",
4609 index: "my-bootclasspath-fragment/index.csv",
4610 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4611 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4612 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004613 }
4614
4615 java_import {
4616 name: "core-oj",
4617 jars: ["prebuilt.jar"],
4618 }
4619 `),
4620 ).RunTest(t)
4621}
4622
Paul Duffin092153d2021-01-26 11:42:39 +00004623// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4624// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004625func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004626 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004627
Paul Duffin89886cb2021-02-05 16:44:03 +00004628 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004629 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004630 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004631 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004632 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004633 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004634 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
4635 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
4636 android.NormalizePathForTesting(dexJarBuildPath))
4637 }
4638
4639 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004640 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004641 // Make sure the import has been given the correct path to the dex jar.
4642 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4643 dexJarBuildPath := p.DexJarInstallPath()
4644 stem := android.RemoveOptionalPrebuiltPrefix(name)
4645 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4646 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4647 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004648 }
4649
Paul Duffin39853512021-02-26 11:09:39 +00004650 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004651 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004652 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004653 android.AssertArrayString(t, "Check if there is no source variant",
4654 []string{"android_common"},
4655 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004656 }
4657
4658 t.Run("prebuilt only", func(t *testing.T) {
4659 bp := `
4660 prebuilt_apex {
4661 name: "myapex",
4662 arch: {
4663 arm64: {
4664 src: "myapex-arm64.apex",
4665 },
4666 arm: {
4667 src: "myapex-arm.apex",
4668 },
4669 },
Paul Duffin39853512021-02-26 11:09:39 +00004670 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004671 }
4672
4673 java_import {
4674 name: "libfoo",
4675 jars: ["libfoo.jar"],
4676 }
Paul Duffin39853512021-02-26 11:09:39 +00004677
4678 java_sdk_library_import {
4679 name: "libbar",
4680 public: {
4681 jars: ["libbar.jar"],
4682 },
4683 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004684 `
4685
4686 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4687 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4688
Martin Stjernholm44825602021-09-17 01:44:12 +01004689 deapexerName := deapexerModuleName("myapex")
4690 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
4691
Paul Duffinf6932af2021-02-26 18:21:56 +00004692 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004693 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004694 rule := deapexer.Rule("deapexer")
4695 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4696 t.Errorf("expected: %q, found: %q", expected, actual)
4697 }
4698
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004699 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004700 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004701 rule = prebuiltApex.Rule("android/soong/android.Cp")
4702 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4703 t.Errorf("expected: %q, found: %q", expected, actual)
4704 }
4705
Paul Duffin89886cb2021-02-05 16:44:03 +00004706 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004707 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004708
4709 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004710 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004711 })
4712
4713 t.Run("prebuilt with source preferred", func(t *testing.T) {
4714
4715 bp := `
4716 prebuilt_apex {
4717 name: "myapex",
4718 arch: {
4719 arm64: {
4720 src: "myapex-arm64.apex",
4721 },
4722 arm: {
4723 src: "myapex-arm.apex",
4724 },
4725 },
Paul Duffin39853512021-02-26 11:09:39 +00004726 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004727 }
4728
4729 java_import {
4730 name: "libfoo",
4731 jars: ["libfoo.jar"],
4732 }
4733
4734 java_library {
4735 name: "libfoo",
4736 }
Paul Duffin39853512021-02-26 11:09:39 +00004737
4738 java_sdk_library_import {
4739 name: "libbar",
4740 public: {
4741 jars: ["libbar.jar"],
4742 },
4743 }
4744
4745 java_sdk_library {
4746 name: "libbar",
4747 srcs: ["foo/bar/MyClass.java"],
4748 unsafe_ignore_missing_latest_api: true,
4749 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004750 `
4751
4752 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4753 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4754
Paul Duffin89886cb2021-02-05 16:44:03 +00004755 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004756 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004757 ensureNoSourceVariant(t, ctx, "libfoo")
4758
4759 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004760 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004761 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004762 })
4763
4764 t.Run("prebuilt preferred with source", func(t *testing.T) {
4765 bp := `
4766 prebuilt_apex {
4767 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00004768 arch: {
4769 arm64: {
4770 src: "myapex-arm64.apex",
4771 },
4772 arm: {
4773 src: "myapex-arm.apex",
4774 },
4775 },
Paul Duffin39853512021-02-26 11:09:39 +00004776 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004777 }
4778
4779 java_import {
4780 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00004781 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00004782 jars: ["libfoo.jar"],
4783 }
4784
4785 java_library {
4786 name: "libfoo",
4787 }
Paul Duffin39853512021-02-26 11:09:39 +00004788
4789 java_sdk_library_import {
4790 name: "libbar",
4791 prefer: true,
4792 public: {
4793 jars: ["libbar.jar"],
4794 },
4795 }
4796
4797 java_sdk_library {
4798 name: "libbar",
4799 srcs: ["foo/bar/MyClass.java"],
4800 unsafe_ignore_missing_latest_api: true,
4801 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004802 `
4803
4804 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4805 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4806
Paul Duffin89886cb2021-02-05 16:44:03 +00004807 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004808 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004809 ensureNoSourceVariant(t, ctx, "libfoo")
4810
4811 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004812 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00004813 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004814 })
4815}
4816
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004817func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01004818 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004819 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004820 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4821 // is disabled.
4822 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
4823 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004824
Paul Duffin37856732021-02-26 14:24:15 +00004825 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
4826 t.Helper()
Paul Duffin7ebebfd2021-04-27 19:36:57 +01004827 s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004828 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00004829 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004830 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00004831 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004832 foundLibfooJar = true
4833 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01004834 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004835 }
4836 }
4837 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02004838 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004839 }
4840 }
4841
Paul Duffin40a3f652021-07-19 13:11:24 +01004842 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00004843 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01004844 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01004845 var rule android.TestingBuildParams
4846
4847 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
4848 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00004849 }
4850
Paul Duffin40a3f652021-07-19 13:11:24 +01004851 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
4852 t.Helper()
4853 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
4854 var rule android.TestingBuildParams
4855
4856 rule = platformBootclasspath.Output("hiddenapi-index.csv")
4857 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
4858 }
4859
Paul Duffin89f570a2021-06-16 01:42:33 +01004860 fragment := java.ApexVariantReference{
4861 Apex: proptools.StringPtr("myapex"),
4862 Module: proptools.StringPtr("my-bootclasspath-fragment"),
4863 }
4864
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004865 t.Run("prebuilt only", func(t *testing.T) {
4866 bp := `
4867 prebuilt_apex {
4868 name: "myapex",
4869 arch: {
4870 arm64: {
4871 src: "myapex-arm64.apex",
4872 },
4873 arm: {
4874 src: "myapex-arm.apex",
4875 },
4876 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004877 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4878 }
4879
4880 prebuilt_bootclasspath_fragment {
4881 name: "my-bootclasspath-fragment",
4882 contents: ["libfoo", "libbar"],
4883 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004884 hidden_api: {
4885 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4886 metadata: "my-bootclasspath-fragment/metadata.csv",
4887 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004888 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4889 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4890 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004891 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004892 }
4893
4894 java_import {
4895 name: "libfoo",
4896 jars: ["libfoo.jar"],
4897 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004898 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004899 }
Paul Duffin37856732021-02-26 14:24:15 +00004900
4901 java_sdk_library_import {
4902 name: "libbar",
4903 public: {
4904 jars: ["libbar.jar"],
4905 },
4906 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004907 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004908 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00004909 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004910 `
4911
Paul Duffin89f570a2021-06-16 01:42:33 +01004912 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01004913 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4914 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00004915
Paul Duffin537ea3d2021-05-14 10:38:00 +01004916 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004917 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004918 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004919 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004920 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4921 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004922 })
4923
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004924 t.Run("apex_set only", func(t *testing.T) {
4925 bp := `
4926 apex_set {
4927 name: "myapex",
4928 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01004929 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4930 }
4931
4932 prebuilt_bootclasspath_fragment {
4933 name: "my-bootclasspath-fragment",
4934 contents: ["libfoo", "libbar"],
4935 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004936 hidden_api: {
4937 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4938 metadata: "my-bootclasspath-fragment/metadata.csv",
4939 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01004940 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
4941 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
4942 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01004943 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004944 }
4945
4946 java_import {
4947 name: "libfoo",
4948 jars: ["libfoo.jar"],
4949 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01004950 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004951 }
4952
4953 java_sdk_library_import {
4954 name: "libbar",
4955 public: {
4956 jars: ["libbar.jar"],
4957 },
4958 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01004959 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01004960 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004961 }
4962 `
4963
Paul Duffin89f570a2021-06-16 01:42:33 +01004964 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004965 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
4966 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
4967
Paul Duffin537ea3d2021-05-14 10:38:00 +01004968 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01004969 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01004970 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01004971 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01004972 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
4973 `)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01004974 })
4975
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004976 t.Run("prebuilt with source library preferred", func(t *testing.T) {
4977 bp := `
4978 prebuilt_apex {
4979 name: "myapex",
4980 arch: {
4981 arm64: {
4982 src: "myapex-arm64.apex",
4983 },
4984 arm: {
4985 src: "myapex-arm.apex",
4986 },
4987 },
Paul Duffin89f570a2021-06-16 01:42:33 +01004988 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
4989 }
4990
4991 prebuilt_bootclasspath_fragment {
4992 name: "my-bootclasspath-fragment",
4993 contents: ["libfoo", "libbar"],
4994 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01004995 hidden_api: {
4996 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4997 metadata: "my-bootclasspath-fragment/metadata.csv",
4998 index: "my-bootclasspath-fragment/index.csv",
4999 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5000 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5001 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005002 }
5003
5004 java_import {
5005 name: "libfoo",
5006 jars: ["libfoo.jar"],
5007 apex_available: ["myapex"],
5008 }
5009
5010 java_library {
5011 name: "libfoo",
5012 srcs: ["foo/bar/MyClass.java"],
5013 apex_available: ["myapex"],
5014 }
Paul Duffin37856732021-02-26 14:24:15 +00005015
5016 java_sdk_library_import {
5017 name: "libbar",
5018 public: {
5019 jars: ["libbar.jar"],
5020 },
5021 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005022 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005023 }
5024
5025 java_sdk_library {
5026 name: "libbar",
5027 srcs: ["foo/bar/MyClass.java"],
5028 unsafe_ignore_missing_latest_api: true,
5029 apex_available: ["myapex"],
5030 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005031 `
5032
5033 // In this test the source (java_library) libfoo is active since the
5034 // prebuilt (java_import) defaults to prefer:false. However the
5035 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5036 // find the dex boot jar in it. We either need to disable the source libfoo
5037 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005038 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005039 // dexbootjar check is skipped if AllowMissingDependencies is true
5040 preparerAllowMissingDeps := android.GroupFixturePreparers(
5041 preparer,
5042 android.PrepareForTestWithAllowMissingDependencies,
5043 )
5044 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005045 })
5046
5047 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5048 bp := `
5049 prebuilt_apex {
5050 name: "myapex",
5051 arch: {
5052 arm64: {
5053 src: "myapex-arm64.apex",
5054 },
5055 arm: {
5056 src: "myapex-arm.apex",
5057 },
5058 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005059 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5060 }
5061
5062 prebuilt_bootclasspath_fragment {
5063 name: "my-bootclasspath-fragment",
5064 contents: ["libfoo", "libbar"],
5065 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005066 hidden_api: {
5067 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5068 metadata: "my-bootclasspath-fragment/metadata.csv",
5069 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005070 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5071 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5072 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005073 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005074 }
5075
5076 java_import {
5077 name: "libfoo",
5078 prefer: true,
5079 jars: ["libfoo.jar"],
5080 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005081 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005082 }
5083
5084 java_library {
5085 name: "libfoo",
5086 srcs: ["foo/bar/MyClass.java"],
5087 apex_available: ["myapex"],
5088 }
Paul Duffin37856732021-02-26 14:24:15 +00005089
5090 java_sdk_library_import {
5091 name: "libbar",
5092 prefer: true,
5093 public: {
5094 jars: ["libbar.jar"],
5095 },
5096 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005097 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005098 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005099 }
5100
5101 java_sdk_library {
5102 name: "libbar",
5103 srcs: ["foo/bar/MyClass.java"],
5104 unsafe_ignore_missing_latest_api: true,
5105 apex_available: ["myapex"],
5106 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005107 `
5108
Paul Duffin89f570a2021-06-16 01:42:33 +01005109 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005110 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5111 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005112
Paul Duffin537ea3d2021-05-14 10:38:00 +01005113 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005114 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005115 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005116 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005117 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5118 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005119 })
5120
5121 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5122 bp := `
5123 apex {
5124 name: "myapex",
5125 key: "myapex.key",
Paul Duffin37856732021-02-26 14:24:15 +00005126 java_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005127 updatable: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005128 }
5129
5130 apex_key {
5131 name: "myapex.key",
5132 public_key: "testkey.avbpubkey",
5133 private_key: "testkey.pem",
5134 }
5135
5136 prebuilt_apex {
5137 name: "myapex",
5138 arch: {
5139 arm64: {
5140 src: "myapex-arm64.apex",
5141 },
5142 arm: {
5143 src: "myapex-arm.apex",
5144 },
5145 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005146 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5147 }
5148
5149 prebuilt_bootclasspath_fragment {
5150 name: "my-bootclasspath-fragment",
5151 contents: ["libfoo", "libbar"],
5152 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005153 hidden_api: {
5154 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5155 metadata: "my-bootclasspath-fragment/metadata.csv",
5156 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005157 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5158 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5159 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005160 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005161 }
5162
5163 java_import {
5164 name: "libfoo",
5165 jars: ["libfoo.jar"],
5166 apex_available: ["myapex"],
5167 }
5168
5169 java_library {
5170 name: "libfoo",
5171 srcs: ["foo/bar/MyClass.java"],
5172 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005173 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005174 }
Paul Duffin37856732021-02-26 14:24:15 +00005175
5176 java_sdk_library_import {
5177 name: "libbar",
5178 public: {
5179 jars: ["libbar.jar"],
5180 },
5181 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005183 }
5184
5185 java_sdk_library {
5186 name: "libbar",
5187 srcs: ["foo/bar/MyClass.java"],
5188 unsafe_ignore_missing_latest_api: true,
5189 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005190 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005191 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005192 `
5193
Paul Duffin89f570a2021-06-16 01:42:33 +01005194 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005195 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
5196 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005197
Paul Duffin537ea3d2021-05-14 10:38:00 +01005198 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005199 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005200 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005201 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005202 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5203 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005204 })
5205
5206 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5207 bp := `
5208 apex {
5209 name: "myapex",
5210 enabled: false,
5211 key: "myapex.key",
Paul Duffin8f146b92021-04-12 17:24:18 +01005212 java_libs: ["libfoo", "libbar"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005213 }
5214
5215 apex_key {
5216 name: "myapex.key",
5217 public_key: "testkey.avbpubkey",
5218 private_key: "testkey.pem",
5219 }
5220
5221 prebuilt_apex {
5222 name: "myapex",
5223 arch: {
5224 arm64: {
5225 src: "myapex-arm64.apex",
5226 },
5227 arm: {
5228 src: "myapex-arm.apex",
5229 },
5230 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005231 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5232 }
5233
5234 prebuilt_bootclasspath_fragment {
5235 name: "my-bootclasspath-fragment",
5236 contents: ["libfoo", "libbar"],
5237 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005238 hidden_api: {
5239 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5240 metadata: "my-bootclasspath-fragment/metadata.csv",
5241 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005242 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5243 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5244 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005245 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005246 }
5247
5248 java_import {
5249 name: "libfoo",
5250 prefer: true,
5251 jars: ["libfoo.jar"],
5252 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005253 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005254 }
5255
5256 java_library {
5257 name: "libfoo",
5258 srcs: ["foo/bar/MyClass.java"],
5259 apex_available: ["myapex"],
5260 }
Paul Duffin37856732021-02-26 14:24:15 +00005261
5262 java_sdk_library_import {
5263 name: "libbar",
5264 prefer: true,
5265 public: {
5266 jars: ["libbar.jar"],
5267 },
5268 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005269 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005270 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005271 }
5272
5273 java_sdk_library {
5274 name: "libbar",
5275 srcs: ["foo/bar/MyClass.java"],
5276 unsafe_ignore_missing_latest_api: true,
5277 apex_available: ["myapex"],
5278 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005279 `
5280
Paul Duffin89f570a2021-06-16 01:42:33 +01005281 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005282 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5283 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005284
Paul Duffin537ea3d2021-05-14 10:38:00 +01005285 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005286 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005287 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005288 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005289 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
5290 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005291 })
5292}
5293
Roland Levillain630846d2019-06-26 12:48:34 +01005294func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005295 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005296 apex_test {
5297 name: "myapex",
5298 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005299 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005300 tests: [
5301 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01005302 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01005303 ],
5304 }
5305
5306 apex_key {
5307 name: "myapex.key",
5308 public_key: "testkey.avbpubkey",
5309 private_key: "testkey.pem",
5310 }
5311
Liz Kammer1c14a212020-05-12 15:26:55 -07005312 filegroup {
5313 name: "fg",
5314 srcs: [
5315 "baz",
5316 "bar/baz"
5317 ],
5318 }
5319
Roland Levillain630846d2019-06-26 12:48:34 +01005320 cc_test {
5321 name: "mytest",
5322 gtest: false,
5323 srcs: ["mytest.cpp"],
5324 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005325 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005326 system_shared_libs: [],
5327 static_executable: true,
5328 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005329 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005330 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005331
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005332 cc_library {
5333 name: "mylib",
5334 srcs: ["mylib.cpp"],
5335 system_shared_libs: [],
5336 stl: "none",
5337 }
5338
Liz Kammer5bd365f2020-05-27 15:15:11 -07005339 filegroup {
5340 name: "fg2",
5341 srcs: [
5342 "testdata/baz"
5343 ],
5344 }
5345
Roland Levillain9b5fde92019-06-28 15:41:19 +01005346 cc_test {
5347 name: "mytests",
5348 gtest: false,
5349 srcs: [
5350 "mytest1.cpp",
5351 "mytest2.cpp",
5352 "mytest3.cpp",
5353 ],
5354 test_per_src: true,
5355 relative_install_path: "test",
5356 system_shared_libs: [],
5357 static_executable: true,
5358 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07005359 data: [
5360 ":fg",
5361 ":fg2",
5362 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01005363 }
Roland Levillain630846d2019-06-26 12:48:34 +01005364 `)
5365
Sundong Ahnabb64432019-10-22 13:58:29 +09005366 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005367 copyCmds := apexRule.Args["copy_commands"]
5368
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005369 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005370 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005371 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005372
Liz Kammer1c14a212020-05-12 15:26:55 -07005373 //Ensure that test data are copied into apex.
5374 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5375 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5376
Roland Levillain9b5fde92019-06-28 15:41:19 +01005377 // Ensure that test deps built with `test_per_src` are copied into apex.
5378 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
5379 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
5380 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01005381
5382 // Ensure the module is correctly translated.
Liz Kammer81faaaf2020-05-20 09:57:08 -07005383 bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005384 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005385 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005386 prefix := "TARGET_"
5387 var builder strings.Builder
5388 data.Custom(&builder, name, prefix, "", data)
5389 androidMk := builder.String()
Jooyung Han31c470b2019-10-18 16:26:59 +09005390 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
5391 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
5392 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
5393 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Jooyung Han214bf372019-11-12 13:03:50 +09005394 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
Jooyung Han31c470b2019-10-18 16:26:59 +09005395 ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005396 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Liz Kammer81faaaf2020-05-20 09:57:08 -07005397
5398 flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005399 data = android.AndroidMkDataForTest(t, ctx, flatBundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005400 data.Custom(&builder, name, prefix, "", data)
5401 flatAndroidMk := builder.String()
Liz Kammer5bd365f2020-05-27 15:15:11 -07005402 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
5403 ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005404}
5405
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005406func TestInstallExtraFlattenedApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005407 ctx := testApex(t, `
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005408 apex {
5409 name: "myapex",
5410 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005411 updatable: false,
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005412 }
5413 apex_key {
5414 name: "myapex.key",
5415 public_key: "testkey.avbpubkey",
5416 private_key: "testkey.pem",
5417 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00005418 `,
5419 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5420 variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
5421 }),
5422 )
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005423 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Jiyong Park83dc74b2020-01-14 18:38:44 +09005424 ensureListContains(t, ab.requiredDeps, "myapex.flattened")
Colin Crossaa255532020-07-03 13:18:24 -07005425 mk := android.AndroidMkDataForTest(t, ctx, ab)
Jooyung Han3ab2c3e2019-12-05 16:27:44 +09005426 var builder strings.Builder
5427 mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
5428 androidMk := builder.String()
5429 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += myapex.flattened")
5430}
5431
Jooyung Hand48f3c32019-08-23 11:18:57 +09005432func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5433 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5434 apex {
5435 name: "myapex",
5436 key: "myapex.key",
5437 native_shared_libs: ["libfoo"],
5438 }
5439
5440 apex_key {
5441 name: "myapex.key",
5442 public_key: "testkey.avbpubkey",
5443 private_key: "testkey.pem",
5444 }
5445
5446 cc_library {
5447 name: "libfoo",
5448 stl: "none",
5449 system_shared_libs: [],
5450 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005451 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005452 }
5453 `)
5454 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5455 apex {
5456 name: "myapex",
5457 key: "myapex.key",
5458 java_libs: ["myjar"],
5459 }
5460
5461 apex_key {
5462 name: "myapex.key",
5463 public_key: "testkey.avbpubkey",
5464 private_key: "testkey.pem",
5465 }
5466
5467 java_library {
5468 name: "myjar",
5469 srcs: ["foo/bar/MyClass.java"],
5470 sdk_version: "none",
5471 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005472 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005473 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005474 }
5475 `)
5476}
5477
Bill Peckhama41a6962021-01-11 10:58:54 -08005478func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005479 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005480 apex {
5481 name: "myapex",
5482 key: "myapex.key",
5483 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005484 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005485 }
5486
5487 apex_key {
5488 name: "myapex.key",
5489 public_key: "testkey.avbpubkey",
5490 private_key: "testkey.pem",
5491 }
5492
5493 java_import {
5494 name: "myjavaimport",
5495 apex_available: ["myapex"],
5496 jars: ["my.jar"],
5497 compile_dex: true,
5498 }
5499 `)
5500
5501 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5502 apexRule := module.Rule("apexRule")
5503 copyCmds := apexRule.Args["copy_commands"]
5504 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5505}
5506
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005507func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005508 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005509 apex {
5510 name: "myapex",
5511 key: "myapex.key",
5512 apps: [
5513 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005514 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005515 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005516 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005517 }
5518
5519 apex_key {
5520 name: "myapex.key",
5521 public_key: "testkey.avbpubkey",
5522 private_key: "testkey.pem",
5523 }
5524
5525 android_app {
5526 name: "AppFoo",
5527 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005528 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005529 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09005530 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005531 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005532 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005533 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005534
5535 android_app {
5536 name: "AppFooPriv",
5537 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005538 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005539 system_modules: "none",
5540 privileged: true,
Colin Cross094cde42020-02-15 10:38:00 -08005541 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005542 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005543 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005544
5545 cc_library_shared {
5546 name: "libjni",
5547 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005548 shared_libs: ["libfoo"],
5549 stl: "none",
5550 system_shared_libs: [],
5551 apex_available: [ "myapex" ],
5552 sdk_version: "current",
5553 }
5554
5555 cc_library_shared {
5556 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005557 stl: "none",
5558 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005559 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005560 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005561 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005562 `)
5563
Sundong Ahnabb64432019-10-22 13:58:29 +09005564 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005565 apexRule := module.Rule("apexRule")
5566 copyCmds := apexRule.Args["copy_commands"]
5567
5568 ensureContains(t, copyCmds, "image.apex/app/AppFoo/AppFoo.apk")
Jiyong Parkf7487312019-10-17 12:54:30 +09005569 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv/AppFooPriv.apk")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005570
Colin Crossaede88c2020-08-11 12:17:01 -07005571 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005572 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005573 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005574 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005575 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005576 // JNI libraries including transitive deps are
5577 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005578 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005579 // ... embedded inside APK (jnilibs.zip)
5580 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5581 // ... and not directly inside the APEX
5582 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5583 }
Dario Frenicde2a032019-10-27 00:29:22 +01005584}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005585
Dario Frenicde2a032019-10-27 00:29:22 +01005586func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005587 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005588 apex {
5589 name: "myapex",
5590 key: "myapex.key",
5591 apps: [
5592 "AppFooPrebuilt",
5593 "AppFooPrivPrebuilt",
5594 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005595 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005596 }
5597
5598 apex_key {
5599 name: "myapex.key",
5600 public_key: "testkey.avbpubkey",
5601 private_key: "testkey.pem",
5602 }
5603
5604 android_app_import {
5605 name: "AppFooPrebuilt",
5606 apk: "PrebuiltAppFoo.apk",
5607 presigned: true,
5608 dex_preopt: {
5609 enabled: false,
5610 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005611 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005612 }
5613
5614 android_app_import {
5615 name: "AppFooPrivPrebuilt",
5616 apk: "PrebuiltAppFooPriv.apk",
5617 privileged: true,
5618 presigned: true,
5619 dex_preopt: {
5620 enabled: false,
5621 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005622 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005623 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005624 }
5625 `)
5626
Sundong Ahnabb64432019-10-22 13:58:29 +09005627 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Dario Frenicde2a032019-10-27 00:29:22 +01005628 apexRule := module.Rule("apexRule")
5629 copyCmds := apexRule.Args["copy_commands"]
5630
5631 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt/AppFooPrebuilt.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005632 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt/AwesomePrebuiltAppFooPriv.apk")
5633}
5634
5635func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005636 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005637 apex {
5638 name: "myapex",
5639 key: "myapex.key",
5640 apps: [
5641 "AppFoo",
5642 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005643 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005644 }
5645
5646 apex_key {
5647 name: "myapex.key",
5648 public_key: "testkey.avbpubkey",
5649 private_key: "testkey.pem",
5650 }
5651
5652 android_app {
5653 name: "AppFoo",
5654 srcs: ["foo/bar/MyClass.java"],
5655 sdk_version: "none",
5656 system_modules: "none",
5657 apex_available: [ "myapex" ],
5658 }
5659
5660 android_app_import {
5661 name: "AppFoo",
5662 apk: "AppFooPrebuilt.apk",
5663 filename: "AppFooPrebuilt.apk",
5664 presigned: true,
5665 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09005666 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09005667 }
5668 `, withFiles(map[string][]byte{
5669 "AppFooPrebuilt.apk": nil,
5670 }))
5671
5672 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han86feead2021-03-08 13:11:48 +09005673 "app/AppFoo/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09005674 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005675}
5676
Dario Freni6f3937c2019-12-20 22:58:03 +00005677func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005678 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00005679 apex {
5680 name: "myapex",
5681 key: "myapex.key",
5682 apps: [
5683 "TesterHelpAppFoo",
5684 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005685 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00005686 }
5687
5688 apex_key {
5689 name: "myapex.key",
5690 public_key: "testkey.avbpubkey",
5691 private_key: "testkey.pem",
5692 }
5693
5694 android_test_helper_app {
5695 name: "TesterHelpAppFoo",
5696 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005697 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00005698 }
5699
5700 `)
5701
5702 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
5703 apexRule := module.Rule("apexRule")
5704 copyCmds := apexRule.Args["copy_commands"]
5705
5706 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo/TesterHelpAppFoo.apk")
5707}
5708
Jooyung Han18020ea2019-11-13 10:50:48 +09005709func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
5710 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00005711 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09005712 apex {
5713 name: "myapex",
5714 key: "myapex.key",
5715 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005716 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005717 }
5718
5719 apex_key {
5720 name: "myapex.key",
5721 public_key: "testkey.avbpubkey",
5722 private_key: "testkey.pem",
5723 }
5724
5725 apex {
5726 name: "otherapex",
5727 key: "myapex.key",
5728 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005729 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09005730 }
5731
5732 cc_defaults {
5733 name: "libfoo-defaults",
5734 apex_available: ["otherapex"],
5735 }
5736
5737 cc_library {
5738 name: "libfoo",
5739 defaults: ["libfoo-defaults"],
5740 stl: "none",
5741 system_shared_libs: [],
5742 }`)
5743}
5744
Paul Duffine52e66f2020-03-30 17:54:29 +01005745func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005746 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00005747 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09005748 apex {
5749 name: "myapex",
5750 key: "myapex.key",
5751 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005752 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005753 }
5754
5755 apex_key {
5756 name: "myapex.key",
5757 public_key: "testkey.avbpubkey",
5758 private_key: "testkey.pem",
5759 }
5760
5761 apex {
5762 name: "otherapex",
5763 key: "otherapex.key",
5764 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005765 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005766 }
5767
5768 apex_key {
5769 name: "otherapex.key",
5770 public_key: "testkey.avbpubkey",
5771 private_key: "testkey.pem",
5772 }
5773
5774 cc_library {
5775 name: "libfoo",
5776 stl: "none",
5777 system_shared_libs: [],
5778 apex_available: ["otherapex"],
5779 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005780}
Jiyong Park127b40b2019-09-30 16:04:35 +09005781
Paul Duffine52e66f2020-03-30 17:54:29 +01005782func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09005783 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09005784 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Colin Cross6e511a92020-07-27 21:26:48 -07005785.*via tag apex\.dependencyTag.*name:sharedLib.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005786.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005787.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01005788.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07005789.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01005790.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005791 apex {
5792 name: "myapex",
5793 key: "myapex.key",
5794 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005795 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005796 }
5797
5798 apex_key {
5799 name: "myapex.key",
5800 public_key: "testkey.avbpubkey",
5801 private_key: "testkey.pem",
5802 }
5803
Jiyong Park127b40b2019-09-30 16:04:35 +09005804 cc_library {
5805 name: "libfoo",
5806 stl: "none",
5807 shared_libs: ["libbar"],
5808 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005809 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005810 }
5811
5812 cc_library {
5813 name: "libbar",
5814 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09005815 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005816 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09005817 apex_available: ["myapex"],
5818 }
5819
5820 cc_library {
5821 name: "libbaz",
5822 stl: "none",
5823 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09005824 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005825}
Jiyong Park127b40b2019-09-30 16:04:35 +09005826
Paul Duffine52e66f2020-03-30 17:54:29 +01005827func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09005828 testApexError(t, "\"otherapex\" is not a valid module name", `
5829 apex {
5830 name: "myapex",
5831 key: "myapex.key",
5832 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005833 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005834 }
5835
5836 apex_key {
5837 name: "myapex.key",
5838 public_key: "testkey.avbpubkey",
5839 private_key: "testkey.pem",
5840 }
5841
5842 cc_library {
5843 name: "libfoo",
5844 stl: "none",
5845 system_shared_libs: [],
5846 apex_available: ["otherapex"],
5847 }`)
5848
Paul Duffine52e66f2020-03-30 17:54:29 +01005849 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005850 apex {
5851 name: "myapex",
5852 key: "myapex.key",
5853 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005854 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005855 }
5856
5857 apex_key {
5858 name: "myapex.key",
5859 public_key: "testkey.avbpubkey",
5860 private_key: "testkey.pem",
5861 }
5862
5863 cc_library {
5864 name: "libfoo",
5865 stl: "none",
5866 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09005867 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005868 apex_available: ["myapex"],
5869 }
5870
5871 cc_library {
5872 name: "libbar",
5873 stl: "none",
5874 system_shared_libs: [],
5875 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09005876 }
5877
5878 cc_library {
5879 name: "libbaz",
5880 stl: "none",
5881 system_shared_libs: [],
5882 stubs: {
5883 versions: ["10", "20", "30"],
5884 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005885 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01005886}
Jiyong Park127b40b2019-09-30 16:04:35 +09005887
Jiyong Park89e850a2020-04-07 16:37:39 +09005888func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005889 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09005890 apex {
5891 name: "myapex",
5892 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09005893 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005894 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09005895 }
5896
5897 apex_key {
5898 name: "myapex.key",
5899 public_key: "testkey.avbpubkey",
5900 private_key: "testkey.pem",
5901 }
5902
5903 cc_library {
5904 name: "libfoo",
5905 stl: "none",
5906 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09005907 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09005908 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09005909 }
5910
5911 cc_library {
5912 name: "libfoo2",
5913 stl: "none",
5914 system_shared_libs: [],
5915 shared_libs: ["libbaz"],
5916 apex_available: ["//apex_available:platform"],
5917 }
5918
5919 cc_library {
5920 name: "libbar",
5921 stl: "none",
5922 system_shared_libs: [],
5923 apex_available: ["myapex"],
5924 }
5925
5926 cc_library {
5927 name: "libbaz",
5928 stl: "none",
5929 system_shared_libs: [],
5930 apex_available: ["myapex"],
5931 stubs: {
5932 versions: ["1"],
5933 },
Jiyong Park127b40b2019-09-30 16:04:35 +09005934 }`)
5935
Jiyong Park89e850a2020-04-07 16:37:39 +09005936 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
5937 // because it depends on libbar which isn't available to platform
5938 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5939 if libfoo.NotAvailableForPlatform() != true {
5940 t.Errorf("%q shouldn't be available to platform", libfoo.String())
5941 }
5942
5943 // libfoo2 however can be available to platform because it depends on libbaz which provides
5944 // stubs
5945 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5946 if libfoo2.NotAvailableForPlatform() == true {
5947 t.Errorf("%q should be available to platform", libfoo2.String())
5948 }
Paul Duffine52e66f2020-03-30 17:54:29 +01005949}
Jiyong Parka90ca002019-10-07 15:47:24 +09005950
Paul Duffine52e66f2020-03-30 17:54:29 +01005951func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005952 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09005953 apex {
5954 name: "myapex",
5955 key: "myapex.key",
5956 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005957 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09005958 }
5959
5960 apex_key {
5961 name: "myapex.key",
5962 public_key: "testkey.avbpubkey",
5963 private_key: "testkey.pem",
5964 }
5965
5966 cc_library {
5967 name: "libfoo",
5968 stl: "none",
5969 system_shared_libs: [],
5970 apex_available: ["myapex"],
5971 static: {
5972 apex_available: ["//apex_available:platform"],
5973 },
5974 }`)
5975
Jiyong Park89e850a2020-04-07 16:37:39 +09005976 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
5977 if libfooShared.NotAvailableForPlatform() != true {
5978 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
5979 }
5980 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
5981 if libfooStatic.NotAvailableForPlatform() != false {
5982 t.Errorf("%q should be available to platform", libfooStatic.String())
5983 }
Jiyong Park127b40b2019-09-30 16:04:35 +09005984}
5985
Jiyong Park5d790c32019-11-15 18:40:32 +09005986func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005987 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09005988 apex {
5989 name: "myapex",
5990 key: "myapex.key",
5991 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08005992 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07005993 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08005994 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005995 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09005996 }
5997
5998 override_apex {
5999 name: "override_myapex",
6000 base: "myapex",
6001 apps: ["override_app"],
markchien7c803b82021-08-26 22:10:06 +08006002 bpfs: ["override_bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006003 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006004 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08006005 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006006 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006007 key: "mynewapex.key",
6008 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09006009 }
6010
6011 apex_key {
6012 name: "myapex.key",
6013 public_key: "testkey.avbpubkey",
6014 private_key: "testkey.pem",
6015 }
6016
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006017 apex_key {
6018 name: "mynewapex.key",
6019 public_key: "testkey2.avbpubkey",
6020 private_key: "testkey2.pem",
6021 }
6022
6023 android_app_certificate {
6024 name: "myapex.certificate",
6025 certificate: "testkey",
6026 }
6027
Jiyong Park5d790c32019-11-15 18:40:32 +09006028 android_app {
6029 name: "app",
6030 srcs: ["foo/bar/MyClass.java"],
6031 package_name: "foo",
6032 sdk_version: "none",
6033 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006034 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09006035 }
6036
6037 override_android_app {
6038 name: "override_app",
6039 base: "app",
6040 package_name: "bar",
6041 }
markchien7c803b82021-08-26 22:10:06 +08006042
6043 bpf {
6044 name: "bpf",
6045 srcs: ["bpf.c"],
6046 }
6047
6048 bpf {
6049 name: "override_bpf",
6050 srcs: ["override_bpf.c"],
6051 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07006052
6053 prebuilt_etc {
6054 name: "myetc",
6055 src: "myprebuilt",
6056 }
6057
6058 prebuilt_etc {
6059 name: "override_myetc",
6060 src: "override_myprebuilt",
6061 }
Jiyong Park20bacab2020-03-03 11:45:41 +09006062 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09006063
Jiyong Park317645e2019-12-05 13:20:58 +09006064 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
6065 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
6066 if originalVariant.GetOverriddenBy() != "" {
6067 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
6068 }
6069 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
6070 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
6071 }
6072
Jiyong Park5d790c32019-11-15 18:40:32 +09006073 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
6074 apexRule := module.Rule("apexRule")
6075 copyCmds := apexRule.Args["copy_commands"]
6076
6077 ensureNotContains(t, copyCmds, "image.apex/app/app/app.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006078 ensureContains(t, copyCmds, "image.apex/app/override_app/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006079
markchien7c803b82021-08-26 22:10:06 +08006080 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
6081 ensureContains(t, copyCmds, "image.apex/etc/bpf/override_bpf.o")
6082
Daniel Norman5a3ce132021-08-26 15:44:43 -07006083 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
6084 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
6085
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006086 apexBundle := module.Module().(*apexBundle)
6087 name := apexBundle.Name()
6088 if name != "override_myapex" {
6089 t.Errorf("name should be \"override_myapex\", but was %q", name)
6090 }
6091
Baligh Uddin004d7172020-02-19 21:29:28 -08006092 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
6093 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
6094 }
6095
Jiyong Park20bacab2020-03-03 11:45:41 +09006096 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07006097 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07006098 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
6099
6100 signApkRule := module.Rule("signapk")
6101 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09006102
Colin Crossaa255532020-07-03 13:18:24 -07006103 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006104 var builder strings.Builder
6105 data.Custom(&builder, name, "TARGET_", "", data)
6106 androidMk := builder.String()
Jiyong Parkf653b052019-11-18 15:39:01 +09006107 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
markchien7c803b82021-08-26 22:10:06 +08006108 ensureContains(t, androidMk, "LOCAL_MODULE := override_bpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006109 ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
6110 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08006111 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006112 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08006113 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09006114 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08006115 ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
6116 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09006117}
6118
Jooyung Han214bf372019-11-12 13:03:50 +09006119func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006120 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09006121 apex {
6122 name: "myapex",
6123 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006124 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09006125 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09006126 }
6127
6128 apex_key {
6129 name: "myapex.key",
6130 public_key: "testkey.avbpubkey",
6131 private_key: "testkey.pem",
6132 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006133
6134 cc_library {
6135 name: "mylib",
6136 srcs: ["mylib.cpp"],
6137 stl: "libc++",
6138 system_shared_libs: [],
6139 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09006140 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006141 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006142 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09006143
6144 module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
6145 args := module.Rule("apexRule").Args
6146 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00006147 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006148
6149 // The copies of the libraries in the apex should have one more dependency than
6150 // the ones outside the apex, namely the unwinder. Ideally we should check
6151 // the dependency names directly here but for some reason the names are blank in
6152 // this test.
6153 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07006154 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08006155 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
6156 if len(apexImplicits) != len(nonApexImplicits)+1 {
6157 t.Errorf("%q missing unwinder dep", lib)
6158 }
6159 }
Jooyung Han214bf372019-11-12 13:03:50 +09006160}
6161
Paul Duffine05480a2021-03-08 15:07:14 +00006162var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01006163 "api/current.txt": nil,
6164 "api/removed.txt": nil,
6165 "api/system-current.txt": nil,
6166 "api/system-removed.txt": nil,
6167 "api/test-current.txt": nil,
6168 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01006169
Anton Hanssondff2c782020-12-21 17:10:01 +00006170 "100/public/api/foo.txt": nil,
6171 "100/public/api/foo-removed.txt": nil,
6172 "100/system/api/foo.txt": nil,
6173 "100/system/api/foo-removed.txt": nil,
6174
Paul Duffineedc5d52020-06-12 17:46:39 +01006175 // For java_sdk_library_import
6176 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01006177}
6178
Jooyung Han58f26ab2019-12-18 15:34:32 +09006179func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006180 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09006181 apex {
6182 name: "myapex",
6183 key: "myapex.key",
6184 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006185 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09006186 }
6187
6188 apex_key {
6189 name: "myapex.key",
6190 public_key: "testkey.avbpubkey",
6191 private_key: "testkey.pem",
6192 }
6193
6194 java_sdk_library {
6195 name: "foo",
6196 srcs: ["a.java"],
6197 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006198 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09006199 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006200
6201 prebuilt_apis {
6202 name: "sdk",
6203 api_dirs: ["100"],
6204 }
Paul Duffin9b879592020-05-26 13:21:35 +01006205 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09006206
6207 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana57af4a2020-01-23 05:36:59 +00006208 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09006209 "javalib/foo.jar",
6210 "etc/permissions/foo.xml",
6211 })
6212 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09006213 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
6214 ensureContains(t, sdkLibrary.RuleParams.Command, `<library name=\"foo\" file=\"/apex/myapex/javalib/foo.jar\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09006215}
6216
Paul Duffin9b879592020-05-26 13:21:35 +01006217func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006218 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006219 apex {
6220 name: "myapex",
6221 key: "myapex.key",
6222 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006223 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006224 }
6225
6226 apex_key {
6227 name: "myapex.key",
6228 public_key: "testkey.avbpubkey",
6229 private_key: "testkey.pem",
6230 }
6231
6232 java_sdk_library {
6233 name: "foo",
6234 srcs: ["a.java"],
6235 api_packages: ["foo"],
6236 apex_available: ["myapex"],
6237 sdk_version: "none",
6238 system_modules: "none",
6239 }
6240
6241 java_library {
6242 name: "bar",
6243 srcs: ["a.java"],
6244 libs: ["foo"],
6245 apex_available: ["myapex"],
6246 sdk_version: "none",
6247 system_modules: "none",
6248 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006249
6250 prebuilt_apis {
6251 name: "sdk",
6252 api_dirs: ["100"],
6253 }
Paul Duffin9b879592020-05-26 13:21:35 +01006254 `, withFiles(filesForSdkLibrary))
6255
6256 // java_sdk_library installs both impl jar and permission XML
6257 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6258 "javalib/bar.jar",
6259 "javalib/foo.jar",
6260 "etc/permissions/foo.xml",
6261 })
6262
6263 // The bar library should depend on the implementation jar.
6264 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006265 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006266 t.Errorf("expected %q, found %#q", expected, actual)
6267 }
6268}
6269
6270func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006271 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01006272 apex {
6273 name: "myapex",
6274 key: "myapex.key",
6275 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006276 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01006277 }
6278
6279 apex_key {
6280 name: "myapex.key",
6281 public_key: "testkey.avbpubkey",
6282 private_key: "testkey.pem",
6283 }
6284
6285 java_sdk_library {
6286 name: "foo",
6287 srcs: ["a.java"],
6288 api_packages: ["foo"],
6289 apex_available: ["myapex"],
6290 sdk_version: "none",
6291 system_modules: "none",
6292 }
6293
6294 java_library {
6295 name: "bar",
6296 srcs: ["a.java"],
6297 libs: ["foo"],
6298 sdk_version: "none",
6299 system_modules: "none",
6300 }
Anton Hanssondff2c782020-12-21 17:10:01 +00006301
6302 prebuilt_apis {
6303 name: "sdk",
6304 api_dirs: ["100"],
6305 }
Paul Duffin9b879592020-05-26 13:21:35 +01006306 `, withFiles(filesForSdkLibrary))
6307
6308 // java_sdk_library installs both impl jar and permission XML
6309 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6310 "javalib/foo.jar",
6311 "etc/permissions/foo.xml",
6312 })
6313
6314 // The bar library should depend on the stubs jar.
6315 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006316 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01006317 t.Errorf("expected %q, found %#q", expected, actual)
6318 }
6319}
6320
Paul Duffineedc5d52020-06-12 17:46:39 +01006321func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006322 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00006323 prebuilt_apis {
6324 name: "sdk",
6325 api_dirs: ["100"],
6326 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01006327 withFiles(map[string][]byte{
6328 "apex/a.java": nil,
6329 "apex/apex_manifest.json": nil,
6330 "apex/Android.bp": []byte(`
6331 package {
6332 default_visibility: ["//visibility:private"],
6333 }
6334
6335 apex {
6336 name: "myapex",
6337 key: "myapex.key",
6338 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006339 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006340 }
6341
6342 apex_key {
6343 name: "myapex.key",
6344 public_key: "testkey.avbpubkey",
6345 private_key: "testkey.pem",
6346 }
6347
6348 java_library {
6349 name: "bar",
6350 srcs: ["a.java"],
6351 libs: ["foo"],
6352 apex_available: ["myapex"],
6353 sdk_version: "none",
6354 system_modules: "none",
6355 }
6356`),
6357 "source/a.java": nil,
6358 "source/api/current.txt": nil,
6359 "source/api/removed.txt": nil,
6360 "source/Android.bp": []byte(`
6361 package {
6362 default_visibility: ["//visibility:private"],
6363 }
6364
6365 java_sdk_library {
6366 name: "foo",
6367 visibility: ["//apex"],
6368 srcs: ["a.java"],
6369 api_packages: ["foo"],
6370 apex_available: ["myapex"],
6371 sdk_version: "none",
6372 system_modules: "none",
6373 public: {
6374 enabled: true,
6375 },
6376 }
6377`),
6378 "prebuilt/a.jar": nil,
6379 "prebuilt/Android.bp": []byte(`
6380 package {
6381 default_visibility: ["//visibility:private"],
6382 }
6383
6384 java_sdk_library_import {
6385 name: "foo",
6386 visibility: ["//apex", "//source"],
6387 apex_available: ["myapex"],
6388 prefer: true,
6389 public: {
6390 jars: ["a.jar"],
6391 },
6392 }
6393`),
Anton Hanssondff2c782020-12-21 17:10:01 +00006394 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01006395 )
6396
6397 // java_sdk_library installs both impl jar and permission XML
6398 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6399 "javalib/bar.jar",
6400 "javalib/foo.jar",
6401 "etc/permissions/foo.xml",
6402 })
6403
6404 // The bar library should depend on the implementation jar.
6405 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01006406 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01006407 t.Errorf("expected %q, found %#q", expected, actual)
6408 }
6409}
6410
6411func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
6412 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
6413 apex {
6414 name: "myapex",
6415 key: "myapex.key",
6416 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006417 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01006418 }
6419
6420 apex_key {
6421 name: "myapex.key",
6422 public_key: "testkey.avbpubkey",
6423 private_key: "testkey.pem",
6424 }
6425
6426 java_sdk_library_import {
6427 name: "foo",
6428 apex_available: ["myapex"],
6429 prefer: true,
6430 public: {
6431 jars: ["a.jar"],
6432 },
6433 }
6434
6435 `, withFiles(filesForSdkLibrary))
6436}
6437
atrost6e126252020-01-27 17:01:16 +00006438func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01006439 result := android.GroupFixturePreparers(
6440 prepareForApexTest,
6441 java.PrepareForTestWithPlatformCompatConfig,
6442 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00006443 apex {
6444 name: "myapex",
6445 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00006446 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00006447 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006448 updatable: false,
atrost6e126252020-01-27 17:01:16 +00006449 }
6450
6451 apex_key {
6452 name: "myapex.key",
6453 public_key: "testkey.avbpubkey",
6454 private_key: "testkey.pem",
6455 }
6456
6457 platform_compat_config {
6458 name: "myjar-platform-compat-config",
6459 src: ":myjar",
6460 }
6461
6462 java_library {
6463 name: "myjar",
6464 srcs: ["foo/bar/MyClass.java"],
6465 sdk_version: "none",
6466 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00006467 apex_available: [ "myapex" ],
6468 }
Paul Duffin1b29e002021-03-16 15:06:54 +00006469
6470 // Make sure that a preferred prebuilt does not affect the apex contents.
6471 prebuilt_platform_compat_config {
6472 name: "myjar-platform-compat-config",
6473 metadata: "compat-config/metadata.xml",
6474 prefer: true,
6475 }
atrost6e126252020-01-27 17:01:16 +00006476 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00006477 ctx := result.TestContext
atrost6e126252020-01-27 17:01:16 +00006478 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6479 "etc/compatconfig/myjar-platform-compat-config.xml",
6480 "javalib/myjar.jar",
6481 })
6482}
6483
Jiyong Park479321d2019-12-16 11:47:12 +09006484func TestRejectNonInstallableJavaLibrary(t *testing.T) {
6485 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
6486 apex {
6487 name: "myapex",
6488 key: "myapex.key",
6489 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006490 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09006491 }
6492
6493 apex_key {
6494 name: "myapex.key",
6495 public_key: "testkey.avbpubkey",
6496 private_key: "testkey.pem",
6497 }
6498
6499 java_library {
6500 name: "myjar",
6501 srcs: ["foo/bar/MyClass.java"],
6502 sdk_version: "none",
6503 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09006504 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006505 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09006506 }
6507 `)
6508}
6509
Jiyong Park7afd1072019-12-30 16:56:33 +09006510func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006511 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09006512 apex {
6513 name: "myapex",
6514 key: "myapex.key",
6515 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006516 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09006517 }
6518
6519 apex_key {
6520 name: "myapex.key",
6521 public_key: "testkey.avbpubkey",
6522 private_key: "testkey.pem",
6523 }
6524
6525 cc_library {
6526 name: "mylib",
6527 srcs: ["mylib.cpp"],
6528 system_shared_libs: [],
6529 stl: "none",
6530 required: ["a", "b"],
6531 host_required: ["c", "d"],
6532 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006533 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09006534 }
6535 `)
6536
6537 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006538 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09006539 name := apexBundle.BaseModuleName()
6540 prefix := "TARGET_"
6541 var builder strings.Builder
6542 data.Custom(&builder, name, prefix, "", data)
6543 androidMk := builder.String()
6544 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += a b\n")
6545 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES += c d\n")
6546 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES += e f\n")
6547}
6548
Jiyong Park7cd10e32020-01-14 09:22:18 +09006549func TestSymlinksFromApexToSystem(t *testing.T) {
6550 bp := `
6551 apex {
6552 name: "myapex",
6553 key: "myapex.key",
6554 native_shared_libs: ["mylib"],
6555 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006556 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09006557 }
6558
Jiyong Park9d677202020-02-19 16:29:35 +09006559 apex {
6560 name: "myapex.updatable",
6561 key: "myapex.key",
6562 native_shared_libs: ["mylib"],
6563 java_libs: ["myjar"],
6564 updatable: true,
Jooyung Han548640b2020-04-27 12:10:30 +09006565 min_sdk_version: "current",
Jiyong Park9d677202020-02-19 16:29:35 +09006566 }
6567
Jiyong Park7cd10e32020-01-14 09:22:18 +09006568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 cc_library {
6575 name: "mylib",
6576 srcs: ["mylib.cpp"],
6577 shared_libs: ["myotherlib"],
6578 system_shared_libs: [],
6579 stl: "none",
6580 apex_available: [
6581 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006582 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006583 "//apex_available:platform",
6584 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006585 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006586 }
6587
6588 cc_library {
6589 name: "myotherlib",
6590 srcs: ["mylib.cpp"],
6591 system_shared_libs: [],
6592 stl: "none",
6593 apex_available: [
6594 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006595 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006596 "//apex_available:platform",
6597 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006598 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006599 }
6600
6601 java_library {
6602 name: "myjar",
6603 srcs: ["foo/bar/MyClass.java"],
6604 sdk_version: "none",
6605 system_modules: "none",
6606 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09006607 apex_available: [
6608 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006609 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006610 "//apex_available:platform",
6611 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006612 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006613 }
6614
6615 java_library {
6616 name: "myotherjar",
6617 srcs: ["foo/bar/MyClass.java"],
6618 sdk_version: "none",
6619 system_modules: "none",
6620 apex_available: [
6621 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09006622 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006623 "//apex_available:platform",
6624 ],
Jooyung Han749dc692020-04-15 11:03:39 +09006625 min_sdk_version: "current",
Jiyong Park7cd10e32020-01-14 09:22:18 +09006626 }
6627 `
6628
6629 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
6630 for _, f := range files {
6631 if f.path == file {
6632 if f.isLink {
6633 t.Errorf("%q is not a real file", file)
6634 }
6635 return
6636 }
6637 }
6638 t.Errorf("%q is not found", file)
6639 }
6640
6641 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string) {
6642 for _, f := range files {
6643 if f.path == file {
6644 if !f.isLink {
6645 t.Errorf("%q is not a symlink", file)
6646 }
6647 return
6648 }
6649 }
6650 t.Errorf("%q is not found", file)
6651 }
6652
Jiyong Park9d677202020-02-19 16:29:35 +09006653 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
6654 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08006655 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006656 files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006657 ensureRealfileExists(t, files, "javalib/myjar.jar")
6658 ensureRealfileExists(t, files, "lib64/mylib.so")
6659 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6660
Jiyong Park9d677202020-02-19 16:29:35 +09006661 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6662 ensureRealfileExists(t, files, "javalib/myjar.jar")
6663 ensureRealfileExists(t, files, "lib64/mylib.so")
6664 ensureRealfileExists(t, files, "lib64/myotherlib.so")
6665
6666 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08006667 ctx = testApex(t, bp)
Jooyung Hana57af4a2020-01-23 05:36:59 +00006668 files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
Jiyong Park7cd10e32020-01-14 09:22:18 +09006669 ensureRealfileExists(t, files, "javalib/myjar.jar")
6670 ensureRealfileExists(t, files, "lib64/mylib.so")
6671 ensureSymlinkExists(t, files, "lib64/myotherlib.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09006672
6673 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
6674 ensureRealfileExists(t, files, "javalib/myjar.jar")
6675 ensureRealfileExists(t, files, "lib64/mylib.so")
6676 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09006677}
6678
Yo Chiange8128052020-07-23 20:09:18 +08006679func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006680 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08006681 apex {
6682 name: "myapex",
6683 key: "myapex.key",
6684 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006685 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08006686 }
6687
6688 apex_key {
6689 name: "myapex.key",
6690 public_key: "testkey.avbpubkey",
6691 private_key: "testkey.pem",
6692 }
6693
6694 cc_library_shared {
6695 name: "mylib",
6696 srcs: ["mylib.cpp"],
6697 shared_libs: ["myotherlib"],
6698 system_shared_libs: [],
6699 stl: "none",
6700 apex_available: [
6701 "myapex",
6702 "//apex_available:platform",
6703 ],
6704 }
6705
6706 cc_prebuilt_library_shared {
6707 name: "myotherlib",
6708 srcs: ["prebuilt.so"],
6709 system_shared_libs: [],
6710 stl: "none",
6711 apex_available: [
6712 "myapex",
6713 "//apex_available:platform",
6714 ],
6715 }
6716 `)
6717
6718 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006719 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08006720 var builder strings.Builder
6721 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
6722 androidMk := builder.String()
6723 // `myotherlib` is added to `myapex` as symlink
6724 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
6725 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
6726 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
6727 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jiyong Park57621b22021-01-20 20:33:11 +09006728 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 +08006729}
6730
Jooyung Han643adc42020-02-27 13:50:06 +09006731func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006732 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09006733 apex {
6734 name: "myapex",
6735 key: "myapex.key",
6736 jni_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006737 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09006738 }
6739
6740 apex_key {
6741 name: "myapex.key",
6742 public_key: "testkey.avbpubkey",
6743 private_key: "testkey.pem",
6744 }
6745
6746 cc_library {
6747 name: "mylib",
6748 srcs: ["mylib.cpp"],
6749 shared_libs: ["mylib2"],
6750 system_shared_libs: [],
6751 stl: "none",
6752 apex_available: [ "myapex" ],
6753 }
6754
6755 cc_library {
6756 name: "mylib2",
6757 srcs: ["mylib.cpp"],
6758 system_shared_libs: [],
6759 stl: "none",
6760 apex_available: [ "myapex" ],
6761 }
6762 `)
6763
6764 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
6765 // Notice mylib2.so (transitive dep) is not added as a jni_lib
6766 ensureEquals(t, rule.Args["opt"], "-a jniLibs mylib.so")
6767 ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
6768 "lib64/mylib.so",
6769 "lib64/mylib2.so",
6770 })
6771}
6772
Jooyung Han49f67012020-04-17 13:43:10 +09006773func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006774 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09006775 apex {
6776 name: "myapex",
6777 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006778 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09006779 }
6780 apex_key {
6781 name: "myapex.key",
6782 public_key: "testkey.avbpubkey",
6783 private_key: "testkey.pem",
6784 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00006785 `,
6786 android.FixtureModifyConfig(func(config android.Config) {
6787 delete(config.Targets, android.Android)
6788 config.AndroidCommonTarget = android.Target{}
6789 }),
6790 )
Jooyung Han49f67012020-04-17 13:43:10 +09006791
6792 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
6793 t.Errorf("Expected variants: %v, but got: %v", expected, got)
6794 }
6795}
6796
Jiyong Parkbd159612020-02-28 15:22:21 +09006797func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006798 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09006799 apex {
6800 name: "myapex",
6801 key: "myapex.key",
6802 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006803 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09006804 }
6805
6806 apex_key {
6807 name: "myapex.key",
6808 public_key: "testkey.avbpubkey",
6809 private_key: "testkey.pem",
6810 }
6811
6812 android_app {
6813 name: "AppFoo",
6814 srcs: ["foo/bar/MyClass.java"],
6815 sdk_version: "none",
6816 system_modules: "none",
6817 apex_available: [ "myapex" ],
6818 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006819 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09006820
Colin Crosscf371cc2020-11-13 11:48:42 -08006821 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09006822 content := bundleConfigRule.Args["content"]
6823
6824 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Jiyong Parkcfaa1642020-02-28 16:51:07 +09006825 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 +09006826}
6827
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006828func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006829 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006834 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006835 }
6836
6837 apex_key {
6838 name: "myapex.key",
6839 public_key: "testkey.avbpubkey",
6840 private_key: "testkey.pem",
6841 }
6842
6843 android_app_set {
6844 name: "AppSet",
6845 set: "AppSet.apks",
6846 }`)
6847 mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
Colin Crosscf371cc2020-11-13 11:48:42 -08006848 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07006849 content := bundleConfigRule.Args["content"]
6850 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
6851 s := mod.Rule("apexRule").Args["copy_commands"]
6852 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
6853 if len(copyCmds) != 3 {
6854 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(copyCmds), s)
6855 }
6856 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet$")
6857 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet$")
6858 ensureMatches(t, copyCmds[2], "^unzip .*-d .*/app/AppSet .*/AppSet.zip$")
6859}
6860
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006861func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01006862 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006863 apex_set {
6864 name: "myapex",
6865 filename: "foo_v2.apex",
6866 sanitized: {
6867 none: { set: "myapex.apks", },
6868 hwaddress: { set: "myapex.hwasan.apks", },
6869 },
Paul Duffin24704672021-04-06 16:09:30 +01006870 }
6871 `
6872 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006873
Paul Duffin24704672021-04-06 16:09:30 +01006874 // Check that the extractor produces the correct output file from the correct input file.
6875 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006876
Paul Duffin24704672021-04-06 16:09:30 +01006877 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
6878 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006879
Paul Duffin24704672021-04-06 16:09:30 +01006880 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
6881
6882 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01006883 m = ctx.ModuleForTests("myapex", "android_common_myapex")
6884 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01006885
6886 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07006887}
6888
Paul Duffin89f570a2021-06-16 01:42:33 +01006889func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006890 t.Helper()
6891
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006892 bp := `
6893 java_library {
6894 name: "some-updatable-apex-lib",
6895 srcs: ["a.java"],
6896 sdk_version: "current",
6897 apex_available: [
6898 "some-updatable-apex",
6899 ],
satayevabcd5972021-08-06 17:49:46 +01006900 permitted_packages: ["some.updatable.apex.lib"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006901 }
6902
6903 java_library {
6904 name: "some-non-updatable-apex-lib",
6905 srcs: ["a.java"],
6906 apex_available: [
6907 "some-non-updatable-apex",
6908 ],
Paul Duffin89f570a2021-06-16 01:42:33 +01006909 compile_dex: true,
satayevabcd5972021-08-06 17:49:46 +01006910 permitted_packages: ["some.non.updatable.apex.lib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006911 }
6912
6913 bootclasspath_fragment {
6914 name: "some-non-updatable-fragment",
6915 contents: ["some-non-updatable-apex-lib"],
6916 apex_available: [
6917 "some-non-updatable-apex",
6918 ],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006919 }
6920
6921 java_library {
6922 name: "some-platform-lib",
6923 srcs: ["a.java"],
6924 sdk_version: "current",
6925 installable: true,
6926 }
6927
6928 java_library {
6929 name: "some-art-lib",
6930 srcs: ["a.java"],
6931 sdk_version: "current",
6932 apex_available: [
Paul Duffind376f792021-01-26 11:59:35 +00006933 "com.android.art.debug",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006934 ],
6935 hostdex: true,
Paul Duffine5218812021-06-07 13:28:19 +01006936 compile_dex: true,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006937 }
6938
6939 apex {
6940 name: "some-updatable-apex",
6941 key: "some-updatable-apex.key",
6942 java_libs: ["some-updatable-apex-lib"],
6943 updatable: true,
6944 min_sdk_version: "current",
6945 }
6946
6947 apex {
6948 name: "some-non-updatable-apex",
6949 key: "some-non-updatable-apex.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006950 bootclasspath_fragments: ["some-non-updatable-fragment"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006951 updatable: false,
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006952 }
6953
6954 apex_key {
6955 name: "some-updatable-apex.key",
6956 }
6957
6958 apex_key {
6959 name: "some-non-updatable-apex.key",
6960 }
6961
6962 apex {
Paul Duffind376f792021-01-26 11:59:35 +00006963 name: "com.android.art.debug",
6964 key: "com.android.art.debug.key",
Paul Duffin89f570a2021-06-16 01:42:33 +01006965 bootclasspath_fragments: ["art-bootclasspath-fragment"],
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006966 updatable: true,
6967 min_sdk_version: "current",
6968 }
6969
Paul Duffinf23bc472021-04-27 12:42:20 +01006970 bootclasspath_fragment {
6971 name: "art-bootclasspath-fragment",
6972 image_name: "art",
6973 contents: ["some-art-lib"],
6974 apex_available: [
6975 "com.android.art.debug",
6976 ],
6977 }
6978
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006979 apex_key {
Paul Duffind376f792021-01-26 11:59:35 +00006980 name: "com.android.art.debug.key",
Ulya Trafimovich7caef202020-05-19 12:00:52 +01006981 }
6982
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006983 filegroup {
6984 name: "some-updatable-apex-file_contexts",
6985 srcs: [
6986 "system/sepolicy/apex/some-updatable-apex-file_contexts",
6987 ],
6988 }
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01006989
6990 filegroup {
6991 name: "some-non-updatable-apex-file_contexts",
6992 srcs: [
6993 "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
6994 ],
6995 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00006996 `
Paul Duffinc3bbb962020-12-10 19:15:49 +00006997
Paul Duffin89f570a2021-06-16 01:42:33 +01006998 testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
Paul Duffinc3bbb962020-12-10 19:15:49 +00006999}
7000
Paul Duffin89f570a2021-06-16 01:42:33 +01007001func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00007002 t.Helper()
7003
Paul Duffin55607122021-03-30 23:32:51 +01007004 fs := android.MockFS{
7005 "a.java": nil,
7006 "a.jar": nil,
7007 "apex_manifest.json": nil,
7008 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007009 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00007010 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
7011 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
7012 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00007013 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007014 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007015
Paul Duffin55607122021-03-30 23:32:51 +01007016 errorHandler := android.FixtureExpectsNoErrors
7017 if errmsg != "" {
7018 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007019 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007020
Paul Duffin55607122021-03-30 23:32:51 +01007021 result := android.GroupFixturePreparers(
7022 cc.PrepareForTestWithCcDefaultModules,
7023 java.PrepareForTestWithHiddenApiBuildComponents,
7024 java.PrepareForTestWithJavaDefaultModules,
7025 java.PrepareForTestWithJavaSdkLibraryFiles,
7026 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01007027 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01007028 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01007029 android.FixtureModifyMockFS(func(fs android.MockFS) {
7030 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
7031 insert := ""
7032 for _, fragment := range fragments {
7033 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
7034 }
7035 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
7036 platform_bootclasspath {
7037 name: "platform-bootclasspath",
7038 fragments: [
7039 %s
7040 ],
7041 }
7042 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01007043 }
Paul Duffin89f570a2021-06-16 01:42:33 +01007044 }),
Paul Duffin55607122021-03-30 23:32:51 +01007045 ).
7046 ExtendWithErrorHandler(errorHandler).
7047 RunTestWithBp(t, bp)
7048
7049 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007050}
7051
Jooyung Han548640b2020-04-27 12:10:30 +09007052func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
7053 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7054 apex {
7055 name: "myapex",
7056 key: "myapex.key",
7057 updatable: true,
7058 }
7059
7060 apex_key {
7061 name: "myapex.key",
7062 public_key: "testkey.avbpubkey",
7063 private_key: "testkey.pem",
7064 }
7065 `)
7066}
7067
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007068func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
7069 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
7070 apex {
7071 name: "myapex",
7072 key: "myapex.key",
7073 }
7074
7075 apex_key {
7076 name: "myapex.key",
7077 public_key: "testkey.avbpubkey",
7078 private_key: "testkey.pem",
7079 }
7080 `)
7081}
7082
satayevb98371c2021-06-15 16:49:50 +01007083func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
7084 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
7085 apex {
7086 name: "myapex",
7087 key: "myapex.key",
7088 systemserverclasspath_fragments: [
7089 "mysystemserverclasspathfragment",
7090 ],
7091 min_sdk_version: "29",
7092 updatable: true,
7093 }
7094
7095 apex_key {
7096 name: "myapex.key",
7097 public_key: "testkey.avbpubkey",
7098 private_key: "testkey.pem",
7099 }
7100
7101 java_library {
7102 name: "foo",
7103 srcs: ["b.java"],
7104 min_sdk_version: "29",
7105 installable: true,
7106 apex_available: [
7107 "myapex",
7108 ],
7109 }
7110
7111 systemserverclasspath_fragment {
7112 name: "mysystemserverclasspathfragment",
7113 generate_classpaths_proto: false,
7114 contents: [
7115 "foo",
7116 ],
7117 apex_available: [
7118 "myapex",
7119 ],
7120 }
satayevabcd5972021-08-06 17:49:46 +01007121 `,
7122 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
7123 )
satayevb98371c2021-06-15 16:49:50 +01007124}
7125
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007126func TestNoUpdatableJarsInBootImage(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007127 // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
7128 // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
7129 // modules to be included in the BootJars.
7130 prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
7131 return android.GroupFixturePreparers(
7132 dexpreopt.FixtureSetBootJars(bootJars...),
7133 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7134 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7135 }),
7136 )
7137 }
7138
7139 // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
7140 // same value. This can result in an invalid configuration as it allows non art apex jars to be
7141 // specified in the ArtApexJars configuration.
7142 prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
7143 return android.GroupFixturePreparers(
7144 dexpreopt.FixtureSetArtBootJars(bootJars...),
7145 dexpreopt.FixtureSetBootJars(bootJars...),
7146 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7147 variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
7148 }),
7149 )
7150 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007151
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007152 t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007153 preparer := android.GroupFixturePreparers(
7154 java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
7155 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7156 )
7157 fragments := []java.ApexVariantReference{
7158 {
7159 Apex: proptools.StringPtr("com.android.art.debug"),
7160 Module: proptools.StringPtr("art-bootclasspath-fragment"),
7161 },
7162 {
7163 Apex: proptools.StringPtr("some-non-updatable-apex"),
7164 Module: proptools.StringPtr("some-non-updatable-fragment"),
7165 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007166 }
satayevabcd5972021-08-06 17:49:46 +01007167 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007168 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007169
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007170 t.Run("updatable jar from ART apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007171 err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the framework boot image`
7172 // Update the dexpreopt BootJars directly.
satayevabcd5972021-08-06 17:49:46 +01007173 preparer := android.GroupFixturePreparers(
7174 prepareSetBootJars("com.android.art.debug:some-art-lib"),
7175 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7176 )
Paul Duffin60264a02021-04-12 20:02:36 +01007177 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007178 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007179
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007180 t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007181 err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007182 // Update the dexpreopt ArtApexJars directly.
7183 preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
7184 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007185 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007186
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007187 t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007188 err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
Paul Duffin60264a02021-04-12 20:02:36 +01007189 // Update the dexpreopt ArtApexJars directly.
7190 preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
7191 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007192 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007193
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007194 t.Run("updatable jar from some other apex in the framework boot image => error", func(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01007195 err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the framework boot image`
satayevabcd5972021-08-06 17:49:46 +01007196 preparer := android.GroupFixturePreparers(
7197 java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
7198 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7199 )
Paul Duffin60264a02021-04-12 20:02:36 +01007200 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007201 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007202
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007203 t.Run("non-updatable jar from some other apex in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007204 preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
Paul Duffin89f570a2021-06-16 01:42:33 +01007205 fragment := java.ApexVariantReference{
7206 Apex: proptools.StringPtr("some-non-updatable-apex"),
7207 Module: proptools.StringPtr("some-non-updatable-fragment"),
7208 }
7209 testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007210 })
Ulya Trafimovich7c140d82020-04-22 18:05:58 +01007211
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007212 t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007213 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007214 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7215 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007216 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007217
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007218 t.Run("nonexistent jar in the framework boot image => error", func(t *testing.T) {
Paul Duffin8f146b92021-04-12 17:24:18 +01007219 err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
Paul Duffin60264a02021-04-12 20:02:36 +01007220 preparer := java.FixtureConfigureBootJars("platform:nonexistent")
7221 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007222 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007223
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007224 t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
Paul Duffinf23bc472021-04-27 12:42:20 +01007225 err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
Paul Duffin60264a02021-04-12 20:02:36 +01007226 // Update the dexpreopt ArtApexJars directly.
7227 preparer := prepareSetArtJars("platform:some-platform-lib")
7228 testNoUpdatableJarsInBootImage(t, err, preparer)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007229 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007230
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007231 t.Run("platform jar in the framework boot image => ok", func(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007232 preparer := android.GroupFixturePreparers(
7233 java.FixtureConfigureBootJars("platform:some-platform-lib"),
7234 java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
7235 )
7236 fragments := []java.ApexVariantReference{
7237 {
7238 Apex: proptools.StringPtr("some-non-updatable-apex"),
7239 Module: proptools.StringPtr("some-non-updatable-fragment"),
7240 },
7241 }
7242 testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
Ulya Trafimovich7caef202020-05-19 12:00:52 +01007243 })
Paul Duffin064b70c2020-11-02 17:32:38 +00007244}
7245
7246func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01007247 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00007248 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01007249 fragment := java.ApexVariantReference{
7250 Apex: proptools.StringPtr("myapex"),
7251 Module: proptools.StringPtr("my-bootclasspath-fragment"),
7252 }
7253
Paul Duffin064b70c2020-11-02 17:32:38 +00007254 testDexpreoptWithApexes(t, `
7255 prebuilt_apex {
7256 name: "myapex" ,
7257 arch: {
7258 arm64: {
7259 src: "myapex-arm64.apex",
7260 },
7261 arm: {
7262 src: "myapex-arm.apex",
7263 },
7264 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007265 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
7266 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007267
Paul Duffin89f570a2021-06-16 01:42:33 +01007268 prebuilt_bootclasspath_fragment {
7269 name: "my-bootclasspath-fragment",
7270 contents: ["libfoo"],
7271 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01007272 hidden_api: {
7273 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
7274 metadata: "my-bootclasspath-fragment/metadata.csv",
7275 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01007276 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
7277 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
7278 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01007279 },
Paul Duffin89f570a2021-06-16 01:42:33 +01007280 }
Paul Duffin064b70c2020-11-02 17:32:38 +00007281
Paul Duffin89f570a2021-06-16 01:42:33 +01007282 java_import {
7283 name: "libfoo",
7284 jars: ["libfoo.jar"],
7285 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01007286 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01007287 }
7288 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00007289 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00007290}
7291
satayevd604b212021-07-21 14:23:52 +01007292func testApexPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01007293 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01007294 bp += `
7295 apex_key {
7296 name: "myapex.key",
7297 public_key: "testkey.avbpubkey",
7298 private_key: "testkey.pem",
7299 }`
Paul Duffin45338f02021-03-30 23:07:52 +01007300 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01007301 "lib1/src/A.java": nil,
7302 "lib2/src/B.java": nil,
7303 "system/sepolicy/apex/myapex-file_contexts": nil,
7304 }
7305
Paul Duffin45338f02021-03-30 23:07:52 +01007306 errorHandler := android.FixtureExpectsNoErrors
7307 if errmsg != "" {
7308 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07007309 }
Colin Crossae8600b2020-10-29 17:09:13 -07007310
Paul Duffin45338f02021-03-30 23:07:52 +01007311 android.GroupFixturePreparers(
7312 android.PrepareForTestWithAndroidBuildComponents,
7313 java.PrepareForTestWithJavaBuildComponents,
7314 PrepareForTestWithApexBuildComponents,
7315 android.PrepareForTestWithNeverallowRules(rules),
7316 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01007317 apexBootJars := make([]string, 0, len(bootJars))
7318 for _, apexBootJar := range bootJars {
7319 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01007320 }
satayevd604b212021-07-21 14:23:52 +01007321 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01007322 }),
7323 fs.AddToFixture(),
7324 ).
7325 ExtendWithErrorHandler(errorHandler).
7326 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01007327}
7328
7329func TestApexPermittedPackagesRules(t *testing.T) {
7330 testcases := []struct {
7331 name string
7332 expectedError string
7333 bp string
7334 bootJars []string
7335 modulesPackages map[string][]string
7336 }{
7337
7338 {
7339 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
7340 expectedError: "",
7341 bp: `
7342 java_library {
7343 name: "bcp_lib1",
7344 srcs: ["lib1/src/*.java"],
7345 permitted_packages: ["foo.bar"],
7346 apex_available: ["myapex"],
7347 sdk_version: "none",
7348 system_modules: "none",
7349 }
7350 java_library {
7351 name: "nonbcp_lib2",
7352 srcs: ["lib2/src/*.java"],
7353 apex_available: ["myapex"],
7354 permitted_packages: ["a.b"],
7355 sdk_version: "none",
7356 system_modules: "none",
7357 }
7358 apex {
7359 name: "myapex",
7360 key: "myapex.key",
7361 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007362 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007363 }`,
7364 bootJars: []string{"bcp_lib1"},
7365 modulesPackages: map[string][]string{
7366 "myapex": []string{
7367 "foo.bar",
7368 },
7369 },
7370 },
7371 {
7372 name: "Bootclasspath apex jar not satisfying allowed module packages.",
7373 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.`,
7374 bp: `
7375 java_library {
7376 name: "bcp_lib1",
7377 srcs: ["lib1/src/*.java"],
7378 apex_available: ["myapex"],
7379 permitted_packages: ["foo.bar"],
7380 sdk_version: "none",
7381 system_modules: "none",
7382 }
7383 java_library {
7384 name: "bcp_lib2",
7385 srcs: ["lib2/src/*.java"],
7386 apex_available: ["myapex"],
7387 permitted_packages: ["foo.bar", "bar.baz"],
7388 sdk_version: "none",
7389 system_modules: "none",
7390 }
7391 apex {
7392 name: "myapex",
7393 key: "myapex.key",
7394 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007395 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01007396 }
7397 `,
7398 bootJars: []string{"bcp_lib1", "bcp_lib2"},
7399 modulesPackages: map[string][]string{
7400 "myapex": []string{
7401 "foo.bar",
7402 },
7403 },
7404 },
7405 }
7406 for _, tc := range testcases {
7407 t.Run(tc.name, func(t *testing.T) {
7408 rules := createApexPermittedPackagesRules(tc.modulesPackages)
7409 testApexPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
7410 })
7411 }
7412}
7413
Jiyong Park62304bb2020-04-13 16:19:48 +09007414func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007415 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09007416 apex {
7417 name: "myapex",
7418 key: "myapex.key",
7419 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007420 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09007421 }
7422
7423 apex_key {
7424 name: "myapex.key",
7425 public_key: "testkey.avbpubkey",
7426 private_key: "testkey.pem",
7427 }
7428
7429 cc_library {
7430 name: "mylib",
7431 srcs: ["mylib.cpp"],
7432 system_shared_libs: [],
7433 stl: "none",
7434 stubs: {
7435 versions: ["1"],
7436 },
7437 apex_available: ["myapex"],
7438 }
7439
7440 cc_library {
7441 name: "myprivlib",
7442 srcs: ["mylib.cpp"],
7443 system_shared_libs: [],
7444 stl: "none",
7445 apex_available: ["myapex"],
7446 }
7447
7448
7449 cc_test {
7450 name: "mytest",
7451 gtest: false,
7452 srcs: ["mylib.cpp"],
7453 system_shared_libs: [],
7454 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09007455 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09007456 test_for: ["myapex"]
7457 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007458
7459 cc_library {
7460 name: "mytestlib",
7461 srcs: ["mylib.cpp"],
7462 system_shared_libs: [],
7463 shared_libs: ["mylib", "myprivlib"],
7464 stl: "none",
7465 test_for: ["myapex"],
7466 }
7467
7468 cc_benchmark {
7469 name: "mybench",
7470 srcs: ["mylib.cpp"],
7471 system_shared_libs: [],
7472 shared_libs: ["mylib", "myprivlib"],
7473 stl: "none",
7474 test_for: ["myapex"],
7475 }
Jiyong Park62304bb2020-04-13 16:19:48 +09007476 `)
7477
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007478 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007479 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007480 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7481 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7482 }
7483
7484 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09007485 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007486 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7487 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7488 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
7489}
Jiyong Park46a512f2020-12-04 18:02:13 +09007490
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007491func TestIndirectTestFor(t *testing.T) {
7492 ctx := testApex(t, `
7493 apex {
7494 name: "myapex",
7495 key: "myapex.key",
7496 native_shared_libs: ["mylib", "myprivlib"],
7497 updatable: false,
7498 }
Jiyong Park46a512f2020-12-04 18:02:13 +09007499
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007500 apex_key {
7501 name: "myapex.key",
7502 public_key: "testkey.avbpubkey",
7503 private_key: "testkey.pem",
7504 }
7505
7506 cc_library {
7507 name: "mylib",
7508 srcs: ["mylib.cpp"],
7509 system_shared_libs: [],
7510 stl: "none",
7511 stubs: {
7512 versions: ["1"],
7513 },
7514 apex_available: ["myapex"],
7515 }
7516
7517 cc_library {
7518 name: "myprivlib",
7519 srcs: ["mylib.cpp"],
7520 system_shared_libs: [],
7521 stl: "none",
7522 shared_libs: ["mylib"],
7523 apex_available: ["myapex"],
7524 }
7525
7526 cc_library {
7527 name: "mytestlib",
7528 srcs: ["mylib.cpp"],
7529 system_shared_libs: [],
7530 shared_libs: ["myprivlib"],
7531 stl: "none",
7532 test_for: ["myapex"],
7533 }
7534 `)
7535
7536 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01007537 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00007538 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
7539 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
7540 }
7541
7542 // The platform variant of mytestlib links to the platform variant of the
7543 // internal myprivlib.
7544 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
7545
7546 // The platform variant of myprivlib links to the platform variant of mylib
7547 // and bypasses its stubs.
7548 ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
Jiyong Park62304bb2020-04-13 16:19:48 +09007549}
7550
Martin Stjernholmec009002021-03-27 15:18:31 +00007551func TestTestForForLibInOtherApex(t *testing.T) {
7552 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
7553 _ = testApex(t, `
7554 apex {
7555 name: "com.android.art",
7556 key: "myapex.key",
7557 native_shared_libs: ["mylib"],
7558 updatable: false,
7559 }
7560
7561 apex {
7562 name: "com.android.art.debug",
7563 key: "myapex.key",
7564 native_shared_libs: ["mylib", "mytestlib"],
7565 updatable: false,
7566 }
7567
7568 apex_key {
7569 name: "myapex.key",
7570 public_key: "testkey.avbpubkey",
7571 private_key: "testkey.pem",
7572 }
7573
7574 cc_library {
7575 name: "mylib",
7576 srcs: ["mylib.cpp"],
7577 system_shared_libs: [],
7578 stl: "none",
7579 stubs: {
7580 versions: ["1"],
7581 },
7582 apex_available: ["com.android.art", "com.android.art.debug"],
7583 }
7584
7585 cc_library {
7586 name: "mytestlib",
7587 srcs: ["mylib.cpp"],
7588 system_shared_libs: [],
7589 shared_libs: ["mylib"],
7590 stl: "none",
7591 apex_available: ["com.android.art.debug"],
7592 test_for: ["com.android.art"],
7593 }
7594 `,
7595 android.MockFS{
7596 "system/sepolicy/apex/com.android.art-file_contexts": nil,
7597 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
7598 }.AddToFixture())
7599}
7600
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007601// TODO(jungjw): Move this to proptools
7602func intPtr(i int) *int {
7603 return &i
7604}
7605
7606func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007607 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007608 apex_set {
7609 name: "myapex",
7610 set: "myapex.apks",
7611 filename: "foo_v2.apex",
7612 overrides: ["foo"],
7613 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007614 `,
7615 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7616 variables.Platform_sdk_version = intPtr(30)
7617 }),
7618 android.FixtureModifyConfig(func(config android.Config) {
7619 config.Targets[android.Android] = []android.Target{
7620 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
7621 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
7622 }
7623 }),
7624 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007625
Paul Duffin24704672021-04-06 16:09:30 +01007626 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007627
7628 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01007629 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007630 actual := extractedApex.Args["abis"]
7631 expected := "ARMEABI_V7A,ARM64_V8A"
7632 if actual != expected {
7633 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7634 }
7635 actual = extractedApex.Args["sdk-version"]
7636 expected = "30"
7637 if actual != expected {
7638 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
7639 }
7640
Paul Duffin6717d882021-06-15 19:09:41 +01007641 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007642 a := m.Module().(*ApexSet)
7643 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07007644 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07007645 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
7646 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
7647 }
7648}
7649
Jiyong Park7d95a512020-05-10 15:16:24 +09007650func TestNoStaticLinkingToStubsLib(t *testing.T) {
7651 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
7652 apex {
7653 name: "myapex",
7654 key: "myapex.key",
7655 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007656 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09007657 }
7658
7659 apex_key {
7660 name: "myapex.key",
7661 public_key: "testkey.avbpubkey",
7662 private_key: "testkey.pem",
7663 }
7664
7665 cc_library {
7666 name: "mylib",
7667 srcs: ["mylib.cpp"],
7668 static_libs: ["otherlib"],
7669 system_shared_libs: [],
7670 stl: "none",
7671 apex_available: [ "myapex" ],
7672 }
7673
7674 cc_library {
7675 name: "otherlib",
7676 srcs: ["mylib.cpp"],
7677 system_shared_libs: [],
7678 stl: "none",
7679 stubs: {
7680 versions: ["1", "2", "3"],
7681 },
7682 apex_available: [ "myapex" ],
7683 }
7684 `)
7685}
7686
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007687func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007689 apex {
7690 name: "myapex",
7691 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007692 updatable: false,
Jiyong Park8d6c51e2020-06-12 17:26:31 +09007693 }
7694
7695 apex_key {
7696 name: "myapex.key",
7697 public_key: "testkey.avbpubkey",
7698 private_key: "testkey.pem",
7699 }
7700
7701 prebuilt_apex {
7702 name: "myapex",
7703 prefer: true,
7704 arch: {
7705 arm64: {
7706 src: "myapex-arm64.apex",
7707 },
7708 arm: {
7709 src: "myapex-arm.apex",
7710 },
7711 },
7712 }
7713
7714 apex_set {
7715 name: "myapex_set",
7716 set: "myapex.apks",
7717 filename: "myapex_set.apex",
7718 overrides: ["myapex"],
7719 }
7720 `)
7721
7722 apexKeysText := ctx.SingletonForTests("apex_keys_text")
7723 content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
7724 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 +09007725 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 +09007726}
7727
Jooyung Han938b5932020-06-20 12:47:47 +09007728func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007729 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09007730 apex {
7731 name: "myapex",
7732 key: "myapex.key",
7733 apps: ["app"],
7734 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007735 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09007736 }
7737
7738 apex_key {
7739 name: "myapex.key",
7740 public_key: "testkey.avbpubkey",
7741 private_key: "testkey.pem",
7742 }
7743
7744 android_app {
7745 name: "app",
7746 srcs: ["foo/bar/MyClass.java"],
7747 package_name: "foo",
7748 sdk_version: "none",
7749 system_modules: "none",
7750 apex_available: [ "myapex" ],
7751 }
7752 `, withFiles(map[string][]byte{
7753 "sub/Android.bp": []byte(`
7754 override_apex {
7755 name: "override_myapex",
7756 base: "myapex",
7757 apps: ["override_app"],
7758 allowed_files: ":allowed",
7759 }
7760 // Overridable "path" property should be referenced indirectly
7761 filegroup {
7762 name: "allowed",
7763 srcs: ["allowed.txt"],
7764 }
7765 override_android_app {
7766 name: "override_app",
7767 base: "app",
7768 package_name: "bar",
7769 }
7770 `),
7771 }))
7772
7773 rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
7774 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
7775 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7776 }
7777
7778 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
7779 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
7780 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
7781 }
7782}
7783
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007784func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007785 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007786 apex {
7787 name: "myapex",
7788 key: "myapex.key",
7789 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007790 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007791 }
7792
7793 apex_key {
7794 name: "myapex.key",
7795 public_key: "testkey.avbpubkey",
7796 private_key: "testkey.pem",
7797 }
7798
7799 cc_library {
7800 name: "mylib",
7801 srcs: ["mylib.cpp"],
7802 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007803 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007804 },
7805 apex_available: ["myapex"],
7806 }
7807
7808 cc_prebuilt_library_shared {
7809 name: "mylib",
7810 prefer: false,
7811 srcs: ["prebuilt.so"],
7812 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07007813 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01007814 },
7815 apex_available: ["myapex"],
7816 }
7817 `)
7818}
7819
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007820func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007821 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007822 apex {
7823 name: "myapex",
7824 key: "myapex.key",
7825 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007826 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007827 }
7828 apex_key {
7829 name: "myapex.key",
7830 public_key: "testkey.avbpubkey",
7831 private_key: "testkey.pem",
7832 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00007833 `,
7834 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7835 variables.CompressedApex = proptools.BoolPtr(true)
7836 }),
7837 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007838
7839 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
7840 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
7841
7842 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
7843 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
7844
7845 // Make sure output of bundle is .capex
7846 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
7847 ensureContains(t, ab.outputFile.String(), "myapex.capex")
7848
7849 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07007850 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00007851 var builder strings.Builder
7852 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7853 androidMk := builder.String()
7854 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
7855}
7856
Martin Stjernholm2856c662020-12-02 15:03:42 +00007857func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007858 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00007859 apex {
7860 name: "myapex",
7861 key: "myapex.key",
7862 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007863 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00007864 }
7865
7866 apex_key {
7867 name: "myapex.key",
7868 public_key: "testkey.avbpubkey",
7869 private_key: "testkey.pem",
7870 }
7871
7872 cc_library {
7873 name: "mylib",
7874 srcs: ["mylib.cpp"],
7875 apex_available: ["myapex"],
7876 shared_libs: ["otherlib"],
7877 system_shared_libs: [],
7878 }
7879
7880 cc_library {
7881 name: "otherlib",
7882 srcs: ["mylib.cpp"],
7883 stubs: {
7884 versions: ["current"],
7885 },
7886 }
7887
7888 cc_prebuilt_library_shared {
7889 name: "otherlib",
7890 prefer: true,
7891 srcs: ["prebuilt.so"],
7892 stubs: {
7893 versions: ["current"],
7894 },
7895 }
7896 `)
7897
7898 ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007899 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00007900 var builder strings.Builder
7901 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
7902 androidMk := builder.String()
7903
7904 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
7905 // a thing there.
7906 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += otherlib\n")
7907}
7908
Jiyong Parke3867542020-12-03 17:28:25 +09007909func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007910 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09007911 apex {
7912 name: "myapex",
7913 key: "myapex.key",
7914 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007915 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09007916 }
7917
7918 apex_key {
7919 name: "myapex.key",
7920 public_key: "testkey.avbpubkey",
7921 private_key: "testkey.pem",
7922 }
7923
7924 cc_library {
7925 name: "mylib",
7926 srcs: ["mylib.cpp"],
7927 system_shared_libs: [],
7928 stl: "none",
7929 apex_available: ["myapex"],
7930 shared_libs: ["mylib2"],
7931 target: {
7932 apex: {
7933 exclude_shared_libs: ["mylib2"],
7934 },
7935 },
7936 }
7937
7938 cc_library {
7939 name: "mylib2",
7940 srcs: ["mylib.cpp"],
7941 system_shared_libs: [],
7942 stl: "none",
7943 }
7944 `)
7945
7946 // Check if mylib is linked to mylib2 for the non-apex target
7947 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
7948 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
7949
7950 // Make sure that the link doesn't occur for the apex target
7951 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
7952 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
7953
7954 // It shouldn't appear in the copy cmd as well.
7955 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
7956 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
7957}
7958
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007959func TestPrebuiltStubLibDep(t *testing.T) {
7960 bpBase := `
7961 apex {
7962 name: "myapex",
7963 key: "myapex.key",
7964 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007965 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007966 }
7967 apex_key {
7968 name: "myapex.key",
7969 public_key: "testkey.avbpubkey",
7970 private_key: "testkey.pem",
7971 }
7972 cc_library {
7973 name: "mylib",
7974 srcs: ["mylib.cpp"],
7975 apex_available: ["myapex"],
7976 shared_libs: ["stublib"],
7977 system_shared_libs: [],
7978 }
7979 apex {
7980 name: "otherapex",
7981 enabled: %s,
7982 key: "myapex.key",
7983 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007984 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09007985 }
7986 `
7987
7988 stublibSourceBp := `
7989 cc_library {
7990 name: "stublib",
7991 srcs: ["mylib.cpp"],
7992 apex_available: ["otherapex"],
7993 system_shared_libs: [],
7994 stl: "none",
7995 stubs: {
7996 versions: ["1"],
7997 },
7998 }
7999 `
8000
8001 stublibPrebuiltBp := `
8002 cc_prebuilt_library_shared {
8003 name: "stublib",
8004 srcs: ["prebuilt.so"],
8005 apex_available: ["otherapex"],
8006 stubs: {
8007 versions: ["1"],
8008 },
8009 %s
8010 }
8011 `
8012
8013 tests := []struct {
8014 name string
8015 stublibBp string
8016 usePrebuilt bool
8017 modNames []string // Modules to collect AndroidMkEntries for
8018 otherApexEnabled []string
8019 }{
8020 {
8021 name: "only_source",
8022 stublibBp: stublibSourceBp,
8023 usePrebuilt: false,
8024 modNames: []string{"stublib"},
8025 otherApexEnabled: []string{"true", "false"},
8026 },
8027 {
8028 name: "source_preferred",
8029 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
8030 usePrebuilt: false,
8031 modNames: []string{"stublib", "prebuilt_stublib"},
8032 otherApexEnabled: []string{"true", "false"},
8033 },
8034 {
8035 name: "prebuilt_preferred",
8036 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
8037 usePrebuilt: true,
8038 modNames: []string{"stublib", "prebuilt_stublib"},
8039 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8040 },
8041 {
8042 name: "only_prebuilt",
8043 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
8044 usePrebuilt: true,
8045 modNames: []string{"stublib"},
8046 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
8047 },
8048 }
8049
8050 for _, test := range tests {
8051 t.Run(test.name, func(t *testing.T) {
8052 for _, otherApexEnabled := range test.otherApexEnabled {
8053 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008054 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008055
8056 type modAndMkEntries struct {
8057 mod *cc.Module
8058 mkEntries android.AndroidMkEntries
8059 }
8060 entries := []*modAndMkEntries{}
8061
8062 // Gather shared lib modules that are installable
8063 for _, modName := range test.modNames {
8064 for _, variant := range ctx.ModuleVariantsForTests(modName) {
8065 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
8066 continue
8067 }
8068 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08008069 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008070 continue
8071 }
Colin Crossaa255532020-07-03 13:18:24 -07008072 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008073 if ent.Disabled {
8074 continue
8075 }
8076 entries = append(entries, &modAndMkEntries{
8077 mod: mod,
8078 mkEntries: ent,
8079 })
8080 }
8081 }
8082 }
8083
8084 var entry *modAndMkEntries = nil
8085 for _, ent := range entries {
8086 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
8087 if entry != nil {
8088 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
8089 } else {
8090 entry = ent
8091 }
8092 }
8093 }
8094
8095 if entry == nil {
8096 t.Errorf("AndroidMk entry for \"stublib\" missing")
8097 } else {
8098 isPrebuilt := entry.mod.Prebuilt() != nil
8099 if isPrebuilt != test.usePrebuilt {
8100 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
8101 }
8102 if !entry.mod.IsStubs() {
8103 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
8104 }
8105 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
8106 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
8107 }
Jiyong Park892a98f2020-12-14 09:20:00 +09008108 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09008109 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09008110 if !android.InList(expected, cflags) {
8111 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
8112 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09008113 }
8114 })
8115 }
8116 })
8117 }
8118}
8119
Martin Stjernholmdf298b32021-05-21 20:57:29 +01008120func TestHostApexInHostOnlyBuild(t *testing.T) {
8121 testApex(t, `
8122 apex {
8123 name: "myapex",
8124 host_supported: true,
8125 key: "myapex.key",
8126 updatable: false,
8127 payload_type: "zip",
8128 }
8129 apex_key {
8130 name: "myapex.key",
8131 public_key: "testkey.avbpubkey",
8132 private_key: "testkey.pem",
8133 }
8134 `,
8135 android.FixtureModifyConfig(func(config android.Config) {
8136 // We may not have device targets in all builds, e.g. in
8137 // prebuilts/build-tools/build-prebuilts.sh
8138 config.Targets[android.Android] = []android.Target{}
8139 }))
8140}
8141
Colin Crossc33e5212021-05-25 18:16:02 -07008142func TestApexJavaCoverage(t *testing.T) {
8143 bp := `
8144 apex {
8145 name: "myapex",
8146 key: "myapex.key",
8147 java_libs: ["mylib"],
8148 bootclasspath_fragments: ["mybootclasspathfragment"],
8149 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
8150 updatable: false,
8151 }
8152
8153 apex_key {
8154 name: "myapex.key",
8155 public_key: "testkey.avbpubkey",
8156 private_key: "testkey.pem",
8157 }
8158
8159 java_library {
8160 name: "mylib",
8161 srcs: ["mylib.java"],
8162 apex_available: ["myapex"],
8163 compile_dex: true,
8164 }
8165
8166 bootclasspath_fragment {
8167 name: "mybootclasspathfragment",
8168 contents: ["mybootclasspathlib"],
8169 apex_available: ["myapex"],
8170 }
8171
8172 java_library {
8173 name: "mybootclasspathlib",
8174 srcs: ["mybootclasspathlib.java"],
8175 apex_available: ["myapex"],
8176 compile_dex: true,
8177 }
8178
8179 systemserverclasspath_fragment {
8180 name: "mysystemserverclasspathfragment",
8181 contents: ["mysystemserverclasspathlib"],
8182 apex_available: ["myapex"],
8183 }
8184
8185 java_library {
8186 name: "mysystemserverclasspathlib",
8187 srcs: ["mysystemserverclasspathlib.java"],
8188 apex_available: ["myapex"],
8189 compile_dex: true,
8190 }
8191 `
8192
8193 result := android.GroupFixturePreparers(
8194 PrepareForTestWithApexBuildComponents,
8195 prepareForTestWithMyapex,
8196 java.PrepareForTestWithJavaDefaultModules,
8197 android.PrepareForTestWithAndroidBuildComponents,
8198 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01008199 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
8200 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Colin Crossc33e5212021-05-25 18:16:02 -07008201 android.FixtureMergeEnv(map[string]string{
8202 "EMMA_INSTRUMENT": "true",
8203 }),
8204 ).RunTest(t)
8205
8206 // Make sure jacoco ran on both mylib and mybootclasspathlib
8207 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8208 t.Errorf("Failed to find jacoco rule for mylib")
8209 }
8210 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8211 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
8212 }
8213 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
8214 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
8215 }
8216}
8217
Jiyong Park192600a2021-08-03 07:52:17 +00008218func TestProhibitStaticExecutable(t *testing.T) {
8219 testApexError(t, `executable mybin is static`, `
8220 apex {
8221 name: "myapex",
8222 key: "myapex.key",
8223 binaries: ["mybin"],
8224 min_sdk_version: "29",
8225 }
8226
8227 apex_key {
8228 name: "myapex.key",
8229 public_key: "testkey.avbpubkey",
8230 private_key: "testkey.pem",
8231 }
8232
8233 cc_binary {
8234 name: "mybin",
8235 srcs: ["mylib.cpp"],
8236 relative_install_path: "foo/bar",
8237 static_executable: true,
8238 system_shared_libs: [],
8239 stl: "none",
8240 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09008241 min_sdk_version: "29",
8242 }
8243 `)
8244
8245 testApexError(t, `executable mybin.rust is static`, `
8246 apex {
8247 name: "myapex",
8248 key: "myapex.key",
8249 binaries: ["mybin.rust"],
8250 min_sdk_version: "29",
8251 }
8252
8253 apex_key {
8254 name: "myapex.key",
8255 public_key: "testkey.avbpubkey",
8256 private_key: "testkey.pem",
8257 }
8258
8259 rust_binary {
8260 name: "mybin.rust",
8261 srcs: ["foo.rs"],
8262 static_executable: true,
8263 apex_available: ["myapex"],
8264 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00008265 }
8266 `)
8267}
8268
Jiakai Zhang470b7e22021-09-30 09:34:26 +00008269func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
8270 ctx := testApex(t, `
8271 apex {
8272 name: "myapex",
8273 key: "myapex.key",
8274 updatable: false,
8275 java_libs: ["foo"],
8276 }
8277
8278 apex_key {
8279 name: "myapex.key",
8280 public_key: "testkey.avbpubkey",
8281 private_key: "testkey.pem",
8282 }
8283
8284 java_library {
8285 name: "foo",
8286 srcs: ["foo.java"],
8287 apex_available: ["myapex"],
8288 installable: true,
8289 }
8290 `,
8291 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8292 )
8293
8294 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
8295 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
8296 var builder strings.Builder
8297 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8298 androidMk := builder.String()
8299 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES += foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex")
8300}
8301
8302func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
8303 ctx := testApex(t, `
8304 prebuilt_apex {
8305 name: "myapex",
8306 arch: {
8307 arm64: {
8308 src: "myapex-arm64.apex",
8309 },
8310 arm: {
8311 src: "myapex-arm.apex",
8312 },
8313 },
8314 exported_java_libs: ["foo"],
8315 }
8316
8317 java_import {
8318 name: "foo",
8319 jars: ["foo.jar"],
8320 installable: true,
8321 }
8322 `,
8323 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8324 )
8325
8326 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
8327 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
8328 mainModuleEntries := entriesList[0]
8329 android.AssertArrayString(t,
8330 "LOCAL_REQUIRED_MODULES",
8331 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
8332 []string{
8333 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
8334 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
8335 })
8336}
8337
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008338func TestMain(m *testing.M) {
Paul Duffin37ba3442021-03-29 00:21:08 +01008339 os.Exit(m.Run())
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07008340}