blob: af643a0a01024b39cf0b94dd17bbf943ff0f6388 [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"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Kiyoung Kim487689e2022-07-26 09:48:22 +090029 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090030 "github.com/google/blueprint/proptools"
31
32 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070037 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090038 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090039 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070040 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090041)
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Paul Duffin40b62572021-03-20 11:39:01 +000053func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090054 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010055 android.GroupFixturePreparers(
56 prepareForApexTest,
57 android.GroupFixturePreparers(preparers...),
58 ).
Paul Duffine05480a2021-03-08 15:07:14 +000059 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000060 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090061}
62
Paul Duffin40b62572021-03-20 11:39:01 +000063func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090064 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010065
66 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000067 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010068 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000069 }
Paul Duffin284165a2021-03-29 01:50:31 +010070
71 result := android.GroupFixturePreparers(
72 prepareForApexTest,
73 android.GroupFixturePreparers(preparers...),
74 optionalBpPreparer,
75 ).RunTest(t)
76
Paul Duffine05480a2021-03-08 15:07:14 +000077 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Paul Duffin810f33d2021-03-09 14:12:32 +000080func withFiles(files android.MockFS) android.FixturePreparer {
81 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090082}
83
Paul Duffin810f33d2021-03-09 14:12:32 +000084func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
85 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090086 for k, v := range targets {
87 config.Targets[k] = v
88 }
Paul Duffin810f33d2021-03-09 14:12:32 +000089 })
Jooyung Han344d5432019-08-23 11:17:39 +090090}
91
Jooyung Han35155c42020-02-06 17:33:20 +090092// withNativeBridgeTargets sets configuration with targets including:
93// - X86_64 (primary)
94// - X86 (secondary)
95// - Arm64 on X86_64 (native bridge)
96// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000097var withNativeBridgeEnabled = android.FixtureModifyConfig(
98 func(config android.Config) {
99 config.Targets[android.Android] = []android.Target{
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
108 }
109 },
110)
111
112func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
113 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
114 variables.ManifestPackageNameOverrides = specs
115 })
Jooyung Han35155c42020-02-06 17:33:20 +0900116}
117
Albert Martineefabcf2022-03-21 20:11:16 +0000118func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
119 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
120 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
121 })
122}
123
Paul Duffin810f33d2021-03-09 14:12:32 +0000124var withBinder32bit = android.FixtureModifyProductVariables(
125 func(variables android.FixtureProductVariables) {
126 variables.Binder32bit = proptools.BoolPtr(true)
127 },
128)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900129
Paul Duffin810f33d2021-03-09 14:12:32 +0000130var withUnbundledBuild = android.FixtureModifyProductVariables(
131 func(variables android.FixtureProductVariables) {
132 variables.Unbundled_build = proptools.BoolPtr(true)
133 },
134)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900135
Paul Duffin284165a2021-03-29 01:50:31 +0100136// Legacy preparer used for running tests within the apex package.
137//
138// This includes everything that was needed to run any test in the apex package prior to the
139// introduction of the test fixtures. Tests that are being converted to use fixtures directly
140// rather than through the testApex...() methods should avoid using this and instead use the
141// various preparers directly, using android.GroupFixturePreparers(...) to group them when
142// necessary.
143//
144// deprecated
145var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000146 // General preparers in alphabetical order as test infrastructure will enforce correct
147 // registration order.
148 android.PrepareForTestWithAndroidBuildComponents,
149 bpf.PrepareForTestWithBpf,
150 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100151 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000152 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
153 rust.PrepareForTestWithRustDefaultModules,
154 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800155 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000156
157 PrepareForTestWithApexBuildComponents,
158
159 // Additional apex test specific preparers.
160 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
161 filegroup {
162 name: "myapex-file_contexts",
163 srcs: [
164 "apex/myapex-file_contexts",
165 ],
166 }
167 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000169 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000170 "a.java": nil,
171 "PrebuiltAppFoo.apk": nil,
172 "PrebuiltAppFooPriv.apk": nil,
173 "apex_manifest.json": nil,
174 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000175 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
176 "system/sepolicy/apex/myapex2-file_contexts": nil,
177 "system/sepolicy/apex/otherapex-file_contexts": nil,
178 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700180 "mylib.cpp": nil,
181 "mytest.cpp": nil,
182 "mytest1.cpp": nil,
183 "mytest2.cpp": nil,
184 "mytest3.cpp": nil,
185 "myprebuilt": nil,
186 "my_include": nil,
187 "foo/bar/MyClass.java": nil,
188 "prebuilt.jar": nil,
189 "prebuilt.so": nil,
190 "vendor/foo/devkeys/test.x509.pem": nil,
191 "vendor/foo/devkeys/test.pk8": nil,
192 "testkey.x509.pem": nil,
193 "testkey.pk8": nil,
194 "testkey.override.x509.pem": nil,
195 "testkey.override.pk8": nil,
196 "vendor/foo/devkeys/testkey.avbpubkey": nil,
197 "vendor/foo/devkeys/testkey.pem": nil,
198 "NOTICE": nil,
199 "custom_notice": nil,
200 "custom_notice_for_static_lib": nil,
201 "testkey2.avbpubkey": nil,
202 "testkey2.pem": nil,
203 "myapex-arm64.apex": nil,
204 "myapex-arm.apex": nil,
205 "myapex.apks": nil,
206 "frameworks/base/api/current.txt": nil,
207 "framework/aidl/a.aidl": nil,
208 "dummy.txt": nil,
209 "baz": nil,
210 "bar/baz": nil,
211 "testdata/baz": nil,
212 "AppSet.apks": nil,
213 "foo.rs": nil,
214 "libfoo.jar": nil,
215 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000216 },
217 ),
218
219 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
220 variables.DeviceVndkVersion = proptools.StringPtr("current")
221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900228 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000229 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000230 }),
231)
232
Paul Duffin52bfaa42021-03-23 23:40:12 +0000233var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
234 "system/sepolicy/apex/myapex-file_contexts": nil,
235})
236
Jooyung Han643adc42020-02-27 13:50:06 +0900237// ensure that 'result' equals 'expected'
238func ensureEquals(t *testing.T, result string, expected string) {
239 t.Helper()
240 if result != expected {
241 t.Errorf("%q != %q", expected, result)
242 }
243}
244
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245// ensure that 'result' contains 'expected'
246func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900247 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900248 if !strings.Contains(result, expected) {
249 t.Errorf("%q is not found in %q", expected, result)
250 }
251}
252
Liz Kammer5bd365f2020-05-27 15:15:11 -0700253// ensure that 'result' contains 'expected' exactly one time
254func ensureContainsOnce(t *testing.T, result string, expected string) {
255 t.Helper()
256 count := strings.Count(result, expected)
257 if count != 1 {
258 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
259 }
260}
261
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262// ensures that 'result' does not contain 'notExpected'
263func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265 if strings.Contains(result, notExpected) {
266 t.Errorf("%q is found in %q", notExpected, result)
267 }
268}
269
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700270func ensureMatches(t *testing.T, result string, expectedRex string) {
271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900282 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283 if !android.InList(expected, result) {
284 t.Errorf("%q is not found in %v", expected, result)
285 }
286}
287
288func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if android.InList(notExpected, result) {
291 t.Errorf("%q is found in %v", notExpected, result)
292 }
293}
294
Jooyung Hane1633032019-08-01 17:41:43 +0900295func ensureListEmpty(t *testing.T, result []string) {
296 t.Helper()
297 if len(result) > 0 {
298 t.Errorf("%q is expected to be empty", result)
299 }
300}
301
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000302func ensureListNotEmpty(t *testing.T, result []string) {
303 t.Helper()
304 if len(result) == 0 {
305 t.Errorf("%q is expected to be not empty", result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// Minimal test
310func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800311 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900312 apex_defaults {
313 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900314 manifest: ":myapex.manifest",
315 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900318 native_shared_libs: [
319 "mylib",
320 "libfoo.ffi",
321 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900322 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800323 multilib: {
324 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800326 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900327 },
Jiyong Park77acec62020-06-01 21:39:15 +0900328 java_libs: [
329 "myjar",
330 "myjar_dex",
331 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000332 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333 }
334
Jiyong Park30ca9372019-02-07 16:27:23 +0900335 apex {
336 name: "myapex",
337 defaults: ["myapex-defaults"],
338 }
339
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 apex_key {
341 name: "myapex.key",
342 public_key: "testkey.avbpubkey",
343 private_key: "testkey.pem",
344 }
345
Jiyong Park809bb722019-02-13 21:33:49 +0900346 filegroup {
347 name: "myapex.manifest",
348 srcs: ["apex_manifest.json"],
349 }
350
351 filegroup {
352 name: "myapex.androidmanifest",
353 srcs: ["AndroidManifest.xml"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 cc_library {
357 name: "mylib",
358 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900359 shared_libs: [
360 "mylib2",
361 "libbar.ffi",
362 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 system_shared_libs: [],
364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000365 // TODO: remove //apex_available:platform
366 apex_available: [
367 "//apex_available:platform",
368 "myapex",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 }
371
Alex Light3d673592019-01-18 14:37:31 -0800372 cc_binary {
373 name: "foo",
374 srcs: ["mylib.cpp"],
375 compile_multilib: "both",
376 multilib: {
377 lib32: {
378 suffix: "32",
379 },
380 lib64: {
381 suffix: "64",
382 },
383 },
384 symlinks: ["foo_link_"],
385 symlink_preferred_arch: true,
386 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800387 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 apex_available: [ "myapex", "com.android.gki.*" ],
389 }
390
Jiyong Park99644e92020-11-17 22:21:02 +0900391 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000392 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900393 srcs: ["foo.rs"],
394 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400395 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900396 apex_available: ["myapex"],
397 }
398
399 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000400 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900401 srcs: ["foo.rs"],
402 crate_name: "foo",
403 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900404 shared_libs: ["libfoo.shared_from_rust"],
405 }
406
407 cc_library_shared {
408 name: "libfoo.shared_from_rust",
409 srcs: ["mylib.cpp"],
410 system_shared_libs: [],
411 stl: "none",
412 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900413 }
414
415 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000416 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900417 srcs: ["foo.rs"],
418 crate_name: "foo",
419 apex_available: ["myapex"],
420 }
421
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900422 rust_ffi_shared {
423 name: "libfoo.ffi",
424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
429 rust_ffi_shared {
430 name: "libbar.ffi",
431 srcs: ["foo.rs"],
432 crate_name: "bar",
433 apex_available: ["myapex"],
434 }
435
Yifan Hongd22a84a2020-07-28 17:37:46 -0700436 apex {
437 name: "com.android.gki.fake",
438 binaries: ["foo"],
439 key: "myapex.key",
440 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000441 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
465 }
466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Jooyung Hana0503a52023-08-23 13:12:50 +0900600 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
603 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
604 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100605
Jooyung Hana0503a52023-08-23 13:12:50 +0900606 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800611}
612
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800614 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 apex_defaults {
616 name: "myapex-defaults",
617 key: "myapex.key",
618 prebuilts: ["myetc"],
619 native_shared_libs: ["mylib"],
620 java_libs: ["myjar"],
621 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900622 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800623 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000624 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
626
627 prebuilt_etc {
628 name: "myetc",
629 src: "myprebuilt",
630 }
631
632 apex {
633 name: "myapex",
634 defaults: ["myapex-defaults"],
635 }
636
637 apex_key {
638 name: "myapex.key",
639 public_key: "testkey.avbpubkey",
640 private_key: "testkey.pem",
641 }
642
643 cc_library {
644 name: "mylib",
645 system_shared_libs: [],
646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
649
650 java_library {
651 name: "myjar",
652 srcs: ["foo/bar/MyClass.java"],
653 sdk_version: "none",
654 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000655 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900656 }
657
658 android_app {
659 name: "AppFoo",
660 srcs: ["foo/bar/MyClass.java"],
661 sdk_version: "none",
662 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900664 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900665
666 runtime_resource_overlay {
667 name: "rro",
668 theme: "blue",
669 }
670
markchien2f59ec92020-09-02 16:23:38 +0800671 bpf {
672 name: "bpf",
673 srcs: ["bpf.c", "bpf2.c"],
674 }
675
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800677 name: "netdTest",
678 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 sub_dir: "netd",
680 }
681
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900683 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 "etc/myetc",
685 "javalib/myjar.jar",
686 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000687 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900688 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800689 "etc/bpf/bpf.o",
690 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800691 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900692 })
693}
694
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800696 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 apex {
698 name: "myapex",
699 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000700 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708 `)
709
Jooyung Hana0503a52023-08-23 13:12:50 +0900710 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900711 args := module.Rule("apexRule").Args
712 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
713 t.Error("manifest should be apex_manifest.pb, but " + manifest)
714 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715}
716
Liz Kammer4854a7d2021-05-27 14:28:27 -0400717func TestApexManifestMinSdkVersion(t *testing.T) {
718 ctx := testApex(t, `
719 apex_defaults {
720 name: "my_defaults",
721 key: "myapex.key",
722 product_specific: true,
723 file_contexts: ":my-file-contexts",
724 updatable: false,
725 }
726 apex {
727 name: "myapex_30",
728 min_sdk_version: "30",
729 defaults: ["my_defaults"],
730 }
731
732 apex {
733 name: "myapex_current",
734 min_sdk_version: "current",
735 defaults: ["my_defaults"],
736 }
737
738 apex {
739 name: "myapex_none",
740 defaults: ["my_defaults"],
741 }
742
743 apex_key {
744 name: "myapex.key",
745 public_key: "testkey.avbpubkey",
746 private_key: "testkey.pem",
747 }
748
749 filegroup {
750 name: "my-file-contexts",
751 srcs: ["product_specific_file_contexts"],
752 }
753 `, withFiles(map[string][]byte{
754 "product_specific_file_contexts": nil,
755 }), android.FixtureModifyProductVariables(
756 func(variables android.FixtureProductVariables) {
757 variables.Unbundled_build = proptools.BoolPtr(true)
758 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
759 }), android.FixtureMergeEnv(map[string]string{
760 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
761 }))
762
763 testCases := []struct {
764 module string
765 minSdkVersion string
766 }{
767 {
768 module: "myapex_30",
769 minSdkVersion: "30",
770 },
771 {
772 module: "myapex_current",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 {
776 module: "myapex_none",
777 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
778 },
779 }
780 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900781 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400782 args := module.Rule("apexRule").Args
783 optFlags := args["opt_flags"]
784 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
785 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
786 }
787 }
788}
789
Jooyung Hanaf730952023-02-28 14:13:38 +0900790func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900792 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900793 if vendor {
794 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 }
796 ctx := testApex(t, `
797 apex {
798 name: "myapex",
799 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900800 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900809 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900810
Jooyung Hana0503a52023-08-23 13:12:50 +0900811 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 if vendor {
813 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
814 rule.RuleParams.Command,
815 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900816 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900817 android.AssertStringDoesContain(t, "should force-label as system_file",
818 rule.RuleParams.Command,
819 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900820 }
821 }
822}
823
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900830 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2", "mylib3"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900852 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900853 system_shared_libs: [],
854 stl: "none",
855 stubs: {
856 versions: ["1", "2", "3"],
857 },
858 }
859
860 cc_library {
861 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900862 srcs: ["mylib.cpp"],
863 shared_libs: ["mylib4"],
864 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865 stl: "none",
866 stubs: {
867 versions: ["10", "11", "12"],
868 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000869 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900871
872 cc_library {
873 name: "mylib4",
874 srcs: ["mylib.cpp"],
875 system_shared_libs: [],
876 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000877 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 }
Jiyong Park105dc322021-06-11 17:22:09 +0900879
880 rust_binary {
881 name: "foo.rust",
882 srcs: ["foo.rs"],
883 shared_libs: ["libfoo.shared_from_rust"],
884 prefer_rlib: true,
885 apex_available: ["myapex"],
886 }
887
888 cc_library_shared {
889 name: "libfoo.shared_from_rust",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
893 stubs: {
894 versions: ["10", "11", "12"],
895 },
896 }
897
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 `)
899
Jooyung Hana0503a52023-08-23 13:12:50 +0900900 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 copyCmds := apexRule.Args["copy_commands"]
902
903 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800904 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905
906 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
Colin Crossaede88c2020-08-11 12:17:01 -0700912 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913
914 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900915 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900917 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // 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 -0700920 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700922 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900923
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700924 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
925 // is replaced by sharing of "cFlags" in cc/builder.go.
926 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
927 // module variable representing "cflags". So it was not detected by ensureNotContains.
928 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
929 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
930 // including the original cflags's "-include mylib.h".
931 //
Jiyong Park64379952018-12-13 18:37:29 +0900932 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700933 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
934 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900935
Jiyong Park85cc35a2022-07-17 11:30:47 +0900936 // Ensure that genstub for platform-provided lib is invoked with --systemapi
937 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
938 // Ensure that genstub for apex-provided lib is invoked with --apex
939 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940
Jooyung Hana0503a52023-08-23 13:12:50 +0900941 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942 "lib64/mylib.so",
943 "lib64/mylib3.so",
944 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900945 "bin/foo.rust",
946 "lib64/libc++.so", // by the implicit dependency from foo.rust
947 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900948 })
Jiyong Park105dc322021-06-11 17:22:09 +0900949
950 // Ensure that stub dependency from a rust module is not included
951 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
952 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700953 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900954 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
955 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900956
Jooyung Hana0503a52023-08-23 13:12:50 +0900957 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900958 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959}
960
Jiyong Park1bc84122021-06-22 20:23:05 +0900961func TestApexCanUsePrivateApis(t *testing.T) {
962 ctx := testApex(t, `
963 apex {
964 name: "myapex",
965 key: "myapex.key",
966 native_shared_libs: ["mylib"],
967 binaries: ["foo.rust"],
968 updatable: false,
969 platform_apis: true,
970 }
971
972 apex_key {
973 name: "myapex.key",
974 public_key: "testkey.avbpubkey",
975 private_key: "testkey.pem",
976 }
977
978 cc_library {
979 name: "mylib",
980 srcs: ["mylib.cpp"],
981 shared_libs: ["mylib2"],
982 system_shared_libs: [],
983 stl: "none",
984 apex_available: [ "myapex" ],
985 }
986
987 cc_library {
988 name: "mylib2",
989 srcs: ["mylib.cpp"],
990 cflags: ["-include mylib.h"],
991 system_shared_libs: [],
992 stl: "none",
993 stubs: {
994 versions: ["1", "2", "3"],
995 },
996 }
997
998 rust_binary {
999 name: "foo.rust",
1000 srcs: ["foo.rs"],
1001 shared_libs: ["libfoo.shared_from_rust"],
1002 prefer_rlib: true,
1003 apex_available: ["myapex"],
1004 }
1005
1006 cc_library_shared {
1007 name: "libfoo.shared_from_rust",
1008 srcs: ["mylib.cpp"],
1009 system_shared_libs: [],
1010 stl: "none",
1011 stubs: {
1012 versions: ["10", "11", "12"],
1013 },
1014 }
1015 `)
1016
Jooyung Hana0503a52023-08-23 13:12:50 +09001017 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001018 copyCmds := apexRule.Args["copy_commands"]
1019
1020 // Ensure that indirect stubs dep is not included
1021 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1022 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1023
1024 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1025 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001026 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001027 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1028 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001029 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001030 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1031 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1032}
1033
Colin Cross7812fd32020-09-25 12:35:10 -07001034func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001036 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001037 apex {
1038 name: "myapex",
1039 key: "myapex.key",
1040 native_shared_libs: ["mylib", "mylib3"],
1041 min_sdk_version: "29",
1042 }
1043
1044 apex_key {
1045 name: "myapex.key",
1046 public_key: "testkey.avbpubkey",
1047 private_key: "testkey.pem",
1048 }
1049
1050 cc_library {
1051 name: "mylib",
1052 srcs: ["mylib.cpp"],
1053 shared_libs: ["mylib2", "mylib3"],
1054 system_shared_libs: [],
1055 stl: "none",
1056 apex_available: [ "myapex" ],
1057 min_sdk_version: "28",
1058 }
1059
1060 cc_library {
1061 name: "mylib2",
1062 srcs: ["mylib.cpp"],
1063 cflags: ["-include mylib.h"],
1064 system_shared_libs: [],
1065 stl: "none",
1066 stubs: {
1067 versions: ["28", "29", "30", "current"],
1068 },
1069 min_sdk_version: "28",
1070 }
1071
1072 cc_library {
1073 name: "mylib3",
1074 srcs: ["mylib.cpp"],
1075 shared_libs: ["mylib4"],
1076 system_shared_libs: [],
1077 stl: "none",
1078 stubs: {
1079 versions: ["28", "29", "30", "current"],
1080 },
1081 apex_available: [ "myapex" ],
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib4",
1087 srcs: ["mylib.cpp"],
1088 system_shared_libs: [],
1089 stl: "none",
1090 apex_available: [ "myapex" ],
1091 min_sdk_version: "28",
1092 }
1093 `)
1094
Jooyung Hana0503a52023-08-23 13:12:50 +09001095 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001096 copyCmds := apexRule.Args["copy_commands"]
1097
1098 // Ensure that direct non-stubs dep is always included
1099 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1100
1101 // Ensure that indirect stubs dep is not included
1102 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1103
1104 // Ensure that direct stubs dep is included
1105 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1106
1107 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1108
Jiyong Park55549df2021-02-26 23:57:23 +09001109 // Ensure that mylib is linking with the latest version of stub for mylib2
1110 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001111 // ... and not linking to the non-stub (impl) variant of mylib2
1112 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1113
1114 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1115 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1116 // .. and not linking to the stubs variant of mylib3
1117 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1118
1119 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001120 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001121 ensureNotContains(t, mylib2Cflags, "-include ")
1122
Jiyong Park85cc35a2022-07-17 11:30:47 +09001123 // Ensure that genstub is invoked with --systemapi
1124 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001125
Jooyung Hana0503a52023-08-23 13:12:50 +09001126 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001127 "lib64/mylib.so",
1128 "lib64/mylib3.so",
1129 "lib64/mylib4.so",
1130 })
1131}
1132
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001133func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1134 t.Parallel()
1135 // myapex (Z)
1136 // mylib -----------------.
1137 // |
1138 // otherapex (29) |
1139 // libstub's versions: 29 Z current
1140 // |
1141 // <platform> |
1142 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001143 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001144 apex {
1145 name: "myapex",
1146 key: "myapex.key",
1147 native_shared_libs: ["mylib"],
1148 min_sdk_version: "Z", // non-final
1149 }
1150
1151 cc_library {
1152 name: "mylib",
1153 srcs: ["mylib.cpp"],
1154 shared_libs: ["libstub"],
1155 apex_available: ["myapex"],
1156 min_sdk_version: "Z",
1157 }
1158
1159 apex_key {
1160 name: "myapex.key",
1161 public_key: "testkey.avbpubkey",
1162 private_key: "testkey.pem",
1163 }
1164
1165 apex {
1166 name: "otherapex",
1167 key: "myapex.key",
1168 native_shared_libs: ["libstub"],
1169 min_sdk_version: "29",
1170 }
1171
1172 cc_library {
1173 name: "libstub",
1174 srcs: ["mylib.cpp"],
1175 stubs: {
1176 versions: ["29", "Z", "current"],
1177 },
1178 apex_available: ["otherapex"],
1179 min_sdk_version: "29",
1180 }
1181
1182 // platform module depending on libstub from otherapex should use the latest stub("current")
1183 cc_library {
1184 name: "libplatform",
1185 srcs: ["mylib.cpp"],
1186 shared_libs: ["libstub"],
1187 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001188 `,
1189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1190 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1191 variables.Platform_sdk_final = proptools.BoolPtr(false)
1192 variables.Platform_version_active_codenames = []string{"Z"}
1193 }),
1194 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195
Jiyong Park55549df2021-02-26 23:57:23 +09001196 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001200 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001201
1202 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1203 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1204 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1205 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1206 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1207}
1208
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001210 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001211 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001212 name: "myapex2",
1213 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001215 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001216 }
1217
1218 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001219 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001220 public_key: "testkey.avbpubkey",
1221 private_key: "testkey.pem",
1222 }
1223
1224 cc_library {
1225 name: "mylib",
1226 srcs: ["mylib.cpp"],
1227 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001228 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 system_shared_libs: [],
1230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001231 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 }
1233
1234 cc_library {
1235 name: "libfoo",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libbar"],
1238 system_shared_libs: [],
1239 stl: "none",
1240 stubs: {
1241 versions: ["10", "20", "30"],
1242 },
1243 }
1244
1245 cc_library {
1246 name: "libbar",
1247 srcs: ["mylib.cpp"],
1248 system_shared_libs: [],
1249 stl: "none",
1250 }
1251
Jiyong Park678c8812020-02-07 17:25:49 +09001252 cc_library_static {
1253 name: "libbaz",
1254 srcs: ["mylib.cpp"],
1255 system_shared_libs: [],
1256 stl: "none",
1257 apex_available: [ "myapex2" ],
1258 }
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 `)
1261
Jooyung Hana0503a52023-08-23 13:12:50 +09001262 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 copyCmds := apexRule.Args["copy_commands"]
1264
1265 // Ensure that direct non-stubs dep is always included
1266 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1267
1268 // Ensure that indirect stubs dep is not included
1269 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1270
1271 // Ensure that dependency of stubs is not included
1272 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1273
Colin Crossaede88c2020-08-11 12:17:01 -07001274 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275
1276 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001282
1283 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1284 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001285
Jooyung Hana0503a52023-08-23 13:12:50 +09001286 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001287 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001288
Jooyung Hana0503a52023-08-23 13:12:50 +09001289 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001290 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291}
1292
Jooyung Hand3639552019-08-09 12:57:43 +09001293func TestApexWithRuntimeLibsDependency(t *testing.T) {
1294 /*
1295 myapex
1296 |
1297 v (runtime_libs)
1298 mylib ------+------> libfoo [provides stub]
1299 |
1300 `------> libbar
1301 */
Colin Cross1c460562021-02-16 17:55:47 -08001302 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001303 apex {
1304 name: "myapex",
1305 key: "myapex.key",
1306 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001307 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001308 }
1309
1310 apex_key {
1311 name: "myapex.key",
1312 public_key: "testkey.avbpubkey",
1313 private_key: "testkey.pem",
1314 }
1315
1316 cc_library {
1317 name: "mylib",
1318 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001319 static_libs: ["libstatic"],
1320 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001321 runtime_libs: ["libfoo", "libbar"],
1322 system_shared_libs: [],
1323 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001324 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001325 }
1326
1327 cc_library {
1328 name: "libfoo",
1329 srcs: ["mylib.cpp"],
1330 system_shared_libs: [],
1331 stl: "none",
1332 stubs: {
1333 versions: ["10", "20", "30"],
1334 },
1335 }
1336
1337 cc_library {
1338 name: "libbar",
1339 srcs: ["mylib.cpp"],
1340 system_shared_libs: [],
1341 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001342 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001343 }
1344
Liz Kammer5f108fa2023-05-11 14:33:17 -04001345 cc_library {
1346 name: "libstatic",
1347 srcs: ["mylib.cpp"],
1348 system_shared_libs: [],
1349 stl: "none",
1350 apex_available: [ "myapex" ],
1351 runtime_libs: ["libstatic_to_runtime"],
1352 }
1353
1354 cc_library {
1355 name: "libshared",
1356 srcs: ["mylib.cpp"],
1357 system_shared_libs: [],
1358 stl: "none",
1359 apex_available: [ "myapex" ],
1360 runtime_libs: ["libshared_to_runtime"],
1361 }
1362
1363 cc_library {
1364 name: "libstatic_to_runtime",
1365 srcs: ["mylib.cpp"],
1366 system_shared_libs: [],
1367 stl: "none",
1368 apex_available: [ "myapex" ],
1369 }
1370
1371 cc_library {
1372 name: "libshared_to_runtime",
1373 srcs: ["mylib.cpp"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 apex_available: [ "myapex" ],
1377 }
Jooyung Hand3639552019-08-09 12:57:43 +09001378 `)
1379
Jooyung Hana0503a52023-08-23 13:12:50 +09001380 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001381 copyCmds := apexRule.Args["copy_commands"]
1382
1383 // Ensure that direct non-stubs dep is always included
1384 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1385
1386 // Ensure that indirect stubs dep is not included
1387 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1388
1389 // Ensure that runtime_libs dep in included
1390 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001391 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1392 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1393
1394 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001395
Jooyung Hana0503a52023-08-23 13:12:50 +09001396 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001397 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1398 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001399}
1400
Paul Duffina02cae32021-03-09 01:44:06 +00001401var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1402 cc.PrepareForTestWithCcBuildComponents,
1403 PrepareForTestWithApexBuildComponents,
1404 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001405 apex {
1406 name: "com.android.runtime",
1407 key: "com.android.runtime.key",
1408 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001409 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001410 }
1411
1412 apex_key {
1413 name: "com.android.runtime.key",
1414 public_key: "testkey.avbpubkey",
1415 private_key: "testkey.pem",
1416 }
Paul Duffina02cae32021-03-09 01:44:06 +00001417 `),
1418 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1419)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001420
Paul Duffina02cae32021-03-09 01:44:06 +00001421func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001422 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423 cc_library {
1424 name: "libc",
1425 no_libcrt: true,
1426 nocrt: true,
1427 stl: "none",
1428 system_shared_libs: [],
1429 stubs: { versions: ["1"] },
1430 apex_available: ["com.android.runtime"],
1431
1432 sanitize: {
1433 hwaddress: true,
1434 }
1435 }
1436
1437 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001438 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001439 no_libcrt: true,
1440 nocrt: true,
1441 stl: "none",
1442 system_shared_libs: [],
1443 srcs: [""],
1444 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001445 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001446
1447 sanitize: {
1448 never: true,
1449 },
Spandan Das4de7b492023-05-05 21:13:01 +00001450 apex_available: [
1451 "//apex_available:anyapex",
1452 "//apex_available:platform",
1453 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001454 } `)
1455 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001456
Jooyung Hana0503a52023-08-23 13:12:50 +09001457 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001458 "lib64/bionic/libc.so",
1459 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1460 })
1461
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463
1464 installed := hwasan.Description("install libclang_rt.hwasan")
1465 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1466
1467 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1468 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1469 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1470}
1471
1472func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001473 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001474 prepareForTestOfRuntimeApexWithHwasan,
1475 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1476 variables.SanitizeDevice = []string{"hwaddress"}
1477 }),
1478 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479 cc_library {
1480 name: "libc",
1481 no_libcrt: true,
1482 nocrt: true,
1483 stl: "none",
1484 system_shared_libs: [],
1485 stubs: { versions: ["1"] },
1486 apex_available: ["com.android.runtime"],
1487 }
1488
1489 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001490 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 srcs: [""],
1496 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001497 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001498
1499 sanitize: {
1500 never: true,
1501 },
Spandan Das4de7b492023-05-05 21:13:01 +00001502 apex_available: [
1503 "//apex_available:anyapex",
1504 "//apex_available:platform",
1505 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001506 }
Paul Duffina02cae32021-03-09 01:44:06 +00001507 `)
1508 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509
Jooyung Hana0503a52023-08-23 13:12:50 +09001510 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001511 "lib64/bionic/libc.so",
1512 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1513 })
1514
Colin Cross4c4c1be2022-02-10 11:41:18 -08001515 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001516
1517 installed := hwasan.Description("install libclang_rt.hwasan")
1518 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1519
1520 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1521 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1522 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1523}
1524
Jooyung Han61b66e92020-03-21 14:21:46 +00001525func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1526 testcases := []struct {
1527 name string
1528 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001529 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001530 shouldLink string
1531 shouldNotLink []string
1532 }{
1533 {
Jiyong Park55549df2021-02-26 23:57:23 +09001534 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001535 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001536 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001537 shouldLink: "current",
1538 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001539 },
1540 {
Jiyong Park55549df2021-02-26 23:57:23 +09001541 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001542 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001543 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001544 shouldLink: "current",
1545 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001546 },
1547 }
1548 for _, tc := range testcases {
1549 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001550 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001551 apex {
1552 name: "myapex",
1553 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001554 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001555 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001556 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001558
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 apex_key {
1560 name: "myapex.key",
1561 public_key: "testkey.avbpubkey",
1562 private_key: "testkey.pem",
1563 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 cc_library {
1566 name: "mylib",
1567 srcs: ["mylib.cpp"],
1568 vendor_available: true,
1569 shared_libs: ["libbar"],
1570 system_shared_libs: [],
1571 stl: "none",
1572 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001573 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001575
Jooyung Han61b66e92020-03-21 14:21:46 +00001576 cc_library {
1577 name: "libbar",
1578 srcs: ["mylib.cpp"],
1579 system_shared_libs: [],
1580 stl: "none",
1581 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001582 llndk: {
1583 symbol_file: "libbar.map.txt",
1584 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001585 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001586 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001587 withUnbundledBuild,
1588 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001589
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001591 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001592 "lib64/mylib.so",
1593 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001594
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001596 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001597 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1598 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Steven Moreland2c4000c2021-04-27 02:08:49 +00001600 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1601 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001602 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001603 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001604 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001605
Steven Moreland2c4000c2021-04-27 02:08:49 +00001606 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001607 ver := tc.shouldLink
1608 if tc.shouldLink == "current" {
1609 ver = strconv.Itoa(android.FutureApiLevelInt)
1610 }
1611 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001612 })
1613 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001614}
1615
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001617 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001618 apex {
1619 name: "myapex",
1620 key: "myapex.key",
1621 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001622 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 }
1624
1625 apex_key {
1626 name: "myapex.key",
1627 public_key: "testkey.avbpubkey",
1628 private_key: "testkey.pem",
1629 }
1630
1631 cc_library {
1632 name: "mylib",
1633 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001634 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635 shared_libs: ["libdl#27"],
1636 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001637 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638 }
1639
1640 cc_library_shared {
1641 name: "mylib_shared",
1642 srcs: ["mylib.cpp"],
1643 shared_libs: ["libdl#27"],
1644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001645 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646 }
1647
1648 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001649 name: "libBootstrap",
1650 srcs: ["mylib.cpp"],
1651 stl: "none",
1652 bootstrap: true,
1653 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 `)
1655
Jooyung Hana0503a52023-08-23 13:12:50 +09001656 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001657 copyCmds := apexRule.Args["copy_commands"]
1658
1659 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001660 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001661 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1662 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663
1664 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001665 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666
Colin Crossaede88c2020-08-11 12:17:01 -07001667 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1668 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1669 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670
1671 // For dependency to libc
1672 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001673 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001675 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001677 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1678 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679
1680 // For dependency to libm
1681 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001682 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001684 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685 // ... and is not compiling with the stub
1686 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1687 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1688
1689 // For dependency to libdl
1690 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001691 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001692 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001693 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1694 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001696 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... Cflags from stub is correctly exported to mylib
1698 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1699 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001700
1701 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001702 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1703 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1704 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1705 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001707
Jooyung Han749dc692020-04-15 11:03:39 +09001708func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001709 // there are three links between liba --> libz.
1710 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001711 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001712 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001713 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001714 apex {
1715 name: "myapex",
1716 key: "myapex.key",
1717 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001718 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001719 }
1720
1721 apex {
1722 name: "otherapex",
1723 key: "myapex.key",
1724 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001725 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001726 }
1727
1728 apex_key {
1729 name: "myapex.key",
1730 public_key: "testkey.avbpubkey",
1731 private_key: "testkey.pem",
1732 }
1733
1734 cc_library {
1735 name: "libx",
1736 shared_libs: ["liba"],
1737 system_shared_libs: [],
1738 stl: "none",
1739 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001740 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001741 }
1742
1743 cc_library {
1744 name: "liby",
1745 shared_libs: ["liba"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001749 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001750 }
1751
1752 cc_library {
1753 name: "liba",
1754 shared_libs: ["libz"],
1755 system_shared_libs: [],
1756 stl: "none",
1757 apex_available: [
1758 "//apex_available:anyapex",
1759 "//apex_available:platform",
1760 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001761 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001762 }
1763
1764 cc_library {
1765 name: "libz",
1766 system_shared_libs: [],
1767 stl: "none",
1768 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001769 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001770 },
1771 }
Jooyung Han749dc692020-04-15 11:03:39 +09001772 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001773
1774 expectLink := func(from, from_variant, to, to_variant string) {
1775 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1776 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1777 }
1778 expectNoLink := func(from, from_variant, to, to_variant string) {
1779 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1780 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1781 }
1782 // platform liba is linked to non-stub version
1783 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001784 // liba in myapex is linked to current
1785 expectLink("liba", "shared_apex29", "libz", "shared_current")
1786 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001787 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001788 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001789 // liba in otherapex is linked to current
1790 expectLink("liba", "shared_apex30", "libz", "shared_current")
1791 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001792 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1793 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001794}
1795
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001797 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001798 apex {
1799 name: "myapex",
1800 key: "myapex.key",
1801 native_shared_libs: ["libx"],
1802 min_sdk_version: "R",
1803 }
1804
1805 apex_key {
1806 name: "myapex.key",
1807 public_key: "testkey.avbpubkey",
1808 private_key: "testkey.pem",
1809 }
1810
1811 cc_library {
1812 name: "libx",
1813 shared_libs: ["libz"],
1814 system_shared_libs: [],
1815 stl: "none",
1816 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001817 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001818 }
1819
1820 cc_library {
1821 name: "libz",
1822 system_shared_libs: [],
1823 stl: "none",
1824 stubs: {
1825 versions: ["29", "R"],
1826 },
1827 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001828 `,
1829 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1830 variables.Platform_version_active_codenames = []string{"R"}
1831 }),
1832 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001833
1834 expectLink := func(from, from_variant, to, to_variant string) {
1835 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1836 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1837 }
1838 expectNoLink := func(from, from_variant, to, to_variant string) {
1839 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1840 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1841 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001842 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1843 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001844 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1845 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001846}
1847
Jooyung Han4c4da062021-06-23 10:23:16 +09001848func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1849 testApex(t, `
1850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 java_libs: ["libx"],
1854 min_sdk_version: "S",
1855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 java_library {
1864 name: "libx",
1865 srcs: ["a.java"],
1866 apex_available: [ "myapex" ],
1867 sdk_version: "current",
1868 min_sdk_version: "S", // should be okay
1869 }
1870 `,
1871 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1872 variables.Platform_version_active_codenames = []string{"S"}
1873 variables.Platform_sdk_codename = proptools.StringPtr("S")
1874 }),
1875 )
1876}
1877
Jooyung Han749dc692020-04-15 11:03:39 +09001878func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001879 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001880 apex {
1881 name: "myapex",
1882 key: "myapex.key",
1883 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001884 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001885 }
1886
1887 apex_key {
1888 name: "myapex.key",
1889 public_key: "testkey.avbpubkey",
1890 private_key: "testkey.pem",
1891 }
1892
1893 cc_library {
1894 name: "libx",
1895 shared_libs: ["libz"],
1896 system_shared_libs: [],
1897 stl: "none",
1898 apex_available: [ "myapex" ],
1899 }
1900
1901 cc_library {
1902 name: "libz",
1903 system_shared_libs: [],
1904 stl: "none",
1905 stubs: {
1906 versions: ["1", "2"],
1907 },
1908 }
1909 `)
1910
1911 expectLink := func(from, from_variant, to, to_variant string) {
1912 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1913 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1914 }
1915 expectNoLink := func(from, from_variant, to, to_variant string) {
1916 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1917 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1918 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001919 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001920 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001921 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001922 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001923}
1924
Jooyung Handfc864c2023-03-20 18:19:07 +09001925func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001926 ctx := testApex(t, `
1927 apex {
1928 name: "myapex",
1929 key: "myapex.key",
1930 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001931 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001932 vendor: true,
1933 min_sdk_version: "29",
1934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001944 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001945 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001946 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001947 shared_libs: ["libbar"],
1948 }
1949
1950 cc_library {
1951 name: "libbar",
1952 stubs: { versions: ["29", "30"] },
1953 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001954 }
1955 `)
1956
1957 vendorVariant := "android_vendor.29_arm64_armv8-a"
1958
Jooyung Handfc864c2023-03-20 18:19:07 +09001959 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1960
1961 // Ensure that mylib links with "current" LLNDK
1962 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1963 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1964
1965 // Ensure that mylib is targeting 29
1966 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1967 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1968
1969 // Ensure that the correct variant of crtbegin_so is used.
1970 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1971 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001972
1973 // Ensure that the crtbegin_so used by the APEX is targeting 29
1974 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1975 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1976}
1977
Jooyung Han4495f842023-04-25 16:39:59 +09001978func TestTrackAllowedDeps(t *testing.T) {
1979 ctx := testApex(t, `
1980 apex {
1981 name: "myapex",
1982 key: "myapex.key",
1983 updatable: true,
1984 native_shared_libs: [
1985 "mylib",
1986 "yourlib",
1987 ],
1988 min_sdk_version: "29",
1989 }
1990
1991 apex {
1992 name: "myapex2",
1993 key: "myapex.key",
1994 updatable: false,
1995 native_shared_libs: ["yourlib"],
1996 }
1997
1998 apex_key {
1999 name: "myapex.key",
2000 public_key: "testkey.avbpubkey",
2001 private_key: "testkey.pem",
2002 }
2003
2004 cc_library {
2005 name: "mylib",
2006 srcs: ["mylib.cpp"],
2007 shared_libs: ["libbar"],
2008 min_sdk_version: "29",
2009 apex_available: ["myapex"],
2010 }
2011
2012 cc_library {
2013 name: "libbar",
2014 stubs: { versions: ["29", "30"] },
2015 }
2016
2017 cc_library {
2018 name: "yourlib",
2019 srcs: ["mylib.cpp"],
2020 min_sdk_version: "29",
2021 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2022 }
2023 `, withFiles(android.MockFS{
2024 "packages/modules/common/build/allowed_deps.txt": nil,
2025 }))
2026
2027 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2028 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2029 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002030 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002031 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002032 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002033
Jooyung Hana0503a52023-08-23 13:12:50 +09002034 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han4495f842023-04-25 16:39:59 +09002035 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2036 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2037 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2038 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2039 flatlist, "mylib:(minSdkVersion:29)")
2040 android.AssertStringListContains(t, "track platform-available lib",
2041 flatlist, "yourlib(minSdkVersion:29)")
2042}
2043
2044func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2045 ctx := testApex(t, `
2046 apex {
2047 name: "myapex",
2048 key: "myapex.key",
2049 updatable: true,
2050 min_sdk_version: "29",
2051 }
2052
2053 apex_key {
2054 name: "myapex.key",
2055 public_key: "testkey.avbpubkey",
2056 private_key: "testkey.pem",
2057 }
2058 `)
2059 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2060 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2061 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2062 }
2063}
2064
Jooyung Han03b51852020-02-26 22:45:42 +09002065func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002066 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002067 apex {
2068 name: "myapex",
2069 key: "myapex.key",
2070 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002071 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002072 }
2073
2074 apex_key {
2075 name: "myapex.key",
2076 public_key: "testkey.avbpubkey",
2077 private_key: "testkey.pem",
2078 }
2079
2080 cc_library {
2081 name: "libx",
2082 system_shared_libs: [],
2083 stl: "none",
2084 apex_available: [ "myapex" ],
2085 stubs: {
2086 versions: ["1", "2"],
2087 },
2088 }
2089
2090 cc_library {
2091 name: "libz",
2092 shared_libs: ["libx"],
2093 system_shared_libs: [],
2094 stl: "none",
2095 }
2096 `)
2097
2098 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002099 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002100 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2101 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2102 }
2103 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002104 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002105 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2106 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2107 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002108 expectLink("libz", "shared", "libx", "shared_current")
2109 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002110 expectNoLink("libz", "shared", "libz", "shared_1")
2111 expectNoLink("libz", "shared", "libz", "shared")
2112}
2113
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002114var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2115 func(variables android.FixtureProductVariables) {
2116 variables.SanitizeDevice = []string{"hwaddress"}
2117 },
2118)
2119
Jooyung Han75568392020-03-20 04:29:24 +09002120func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002121 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002122 apex {
2123 name: "myapex",
2124 key: "myapex.key",
2125 native_shared_libs: ["libx"],
2126 min_sdk_version: "29",
2127 }
2128
2129 apex_key {
2130 name: "myapex.key",
2131 public_key: "testkey.avbpubkey",
2132 private_key: "testkey.pem",
2133 }
2134
2135 cc_library {
2136 name: "libx",
2137 shared_libs: ["libbar"],
2138 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002139 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002140 }
2141
2142 cc_library {
2143 name: "libbar",
2144 stubs: {
2145 versions: ["29", "30"],
2146 },
2147 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002148 `,
2149 prepareForTestWithSantitizeHwaddress,
2150 )
Jooyung Han03b51852020-02-26 22:45:42 +09002151 expectLink := func(from, from_variant, to, to_variant string) {
2152 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2153 libFlags := ld.Args["libFlags"]
2154 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2155 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002156 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002157}
2158
Jooyung Han75568392020-03-20 04:29:24 +09002159func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002160 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002161 apex {
2162 name: "myapex",
2163 key: "myapex.key",
2164 native_shared_libs: ["libx"],
2165 min_sdk_version: "29",
2166 }
2167
2168 apex_key {
2169 name: "myapex.key",
2170 public_key: "testkey.avbpubkey",
2171 private_key: "testkey.pem",
2172 }
2173
2174 cc_library {
2175 name: "libx",
2176 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002177 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002178 }
Jooyung Han75568392020-03-20 04:29:24 +09002179 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002180
2181 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002182 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002183 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002184 // note that platform variant is not.
2185 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002186 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002187}
2188
Jooyung Han749dc692020-04-15 11:03:39 +09002189func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2190 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002191 apex {
2192 name: "myapex",
2193 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002194 native_shared_libs: ["mylib"],
2195 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002196 }
2197
2198 apex_key {
2199 name: "myapex.key",
2200 public_key: "testkey.avbpubkey",
2201 private_key: "testkey.pem",
2202 }
Jooyung Han749dc692020-04-15 11:03:39 +09002203
2204 cc_library {
2205 name: "mylib",
2206 srcs: ["mylib.cpp"],
2207 system_shared_libs: [],
2208 stl: "none",
2209 apex_available: [
2210 "myapex",
2211 ],
2212 min_sdk_version: "30",
2213 }
2214 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002215
2216 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2217 apex {
2218 name: "myapex",
2219 key: "myapex.key",
2220 native_shared_libs: ["libfoo.ffi"],
2221 min_sdk_version: "29",
2222 }
2223
2224 apex_key {
2225 name: "myapex.key",
2226 public_key: "testkey.avbpubkey",
2227 private_key: "testkey.pem",
2228 }
2229
2230 rust_ffi_shared {
2231 name: "libfoo.ffi",
2232 srcs: ["foo.rs"],
2233 crate_name: "foo",
2234 apex_available: [
2235 "myapex",
2236 ],
2237 min_sdk_version: "30",
2238 }
2239 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002240
2241 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2242 apex {
2243 name: "myapex",
2244 key: "myapex.key",
2245 java_libs: ["libfoo"],
2246 min_sdk_version: "29",
2247 }
2248
2249 apex_key {
2250 name: "myapex.key",
2251 public_key: "testkey.avbpubkey",
2252 private_key: "testkey.pem",
2253 }
2254
2255 java_import {
2256 name: "libfoo",
2257 jars: ["libfoo.jar"],
2258 apex_available: [
2259 "myapex",
2260 ],
2261 min_sdk_version: "30",
2262 }
2263 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002264
2265 // Skip check for modules compiling against core API surface
2266 testApex(t, `
2267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 java_libs: ["libfoo"],
2271 min_sdk_version: "29",
2272 }
2273
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279
2280 java_library {
2281 name: "libfoo",
2282 srcs: ["Foo.java"],
2283 apex_available: [
2284 "myapex",
2285 ],
2286 // Compile against core API surface
2287 sdk_version: "core_current",
2288 min_sdk_version: "30",
2289 }
2290 `)
2291
Jooyung Han749dc692020-04-15 11:03:39 +09002292}
2293
2294func TestApexMinSdkVersion_Okay(t *testing.T) {
2295 testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 native_shared_libs: ["libfoo"],
2300 java_libs: ["libbar"],
2301 min_sdk_version: "29",
2302 }
2303
2304 apex_key {
2305 name: "myapex.key",
2306 public_key: "testkey.avbpubkey",
2307 private_key: "testkey.pem",
2308 }
2309
2310 cc_library {
2311 name: "libfoo",
2312 srcs: ["mylib.cpp"],
2313 shared_libs: ["libfoo_dep"],
2314 apex_available: ["myapex"],
2315 min_sdk_version: "29",
2316 }
2317
2318 cc_library {
2319 name: "libfoo_dep",
2320 srcs: ["mylib.cpp"],
2321 apex_available: ["myapex"],
2322 min_sdk_version: "29",
2323 }
2324
2325 java_library {
2326 name: "libbar",
2327 sdk_version: "current",
2328 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002329 static_libs: [
2330 "libbar_dep",
2331 "libbar_import_dep",
2332 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002333 apex_available: ["myapex"],
2334 min_sdk_version: "29",
2335 }
2336
2337 java_library {
2338 name: "libbar_dep",
2339 sdk_version: "current",
2340 srcs: ["a.java"],
2341 apex_available: ["myapex"],
2342 min_sdk_version: "29",
2343 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002344
2345 java_import {
2346 name: "libbar_import_dep",
2347 jars: ["libbar.jar"],
2348 apex_available: ["myapex"],
2349 min_sdk_version: "29",
2350 }
Jooyung Han03b51852020-02-26 22:45:42 +09002351 `)
2352}
2353
Colin Cross8ca61c12022-10-06 21:00:14 -07002354func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2355 // Tests that an apex dependency with min_sdk_version higher than the
2356 // min_sdk_version of the apex is allowed as long as the dependency's
2357 // min_sdk_version is less than or equal to the api level that the
2358 // architecture was introduced in. In this case, arm64 didn't exist
2359 // until api level 21, so the arm64 code will never need to run on
2360 // an api level 20 device, even if other architectures of the apex
2361 // will.
2362 testApex(t, `
2363 apex {
2364 name: "myapex",
2365 key: "myapex.key",
2366 native_shared_libs: ["libfoo"],
2367 min_sdk_version: "20",
2368 }
2369
2370 apex_key {
2371 name: "myapex.key",
2372 public_key: "testkey.avbpubkey",
2373 private_key: "testkey.pem",
2374 }
2375
2376 cc_library {
2377 name: "libfoo",
2378 srcs: ["mylib.cpp"],
2379 apex_available: ["myapex"],
2380 min_sdk_version: "21",
2381 stl: "none",
2382 }
2383 `)
2384}
2385
Artur Satayev8cf899a2020-04-15 17:29:42 +01002386func TestJavaStableSdkVersion(t *testing.T) {
2387 testCases := []struct {
2388 name string
2389 expectedError string
2390 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002391 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002392 }{
2393 {
2394 name: "Non-updatable apex with non-stable dep",
2395 bp: `
2396 apex {
2397 name: "myapex",
2398 java_libs: ["myjar"],
2399 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002400 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002401 }
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407 java_library {
2408 name: "myjar",
2409 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002410 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002411 apex_available: ["myapex"],
2412 }
2413 `,
2414 },
2415 {
2416 name: "Updatable apex with stable dep",
2417 bp: `
2418 apex {
2419 name: "myapex",
2420 java_libs: ["myjar"],
2421 key: "myapex.key",
2422 updatable: true,
2423 min_sdk_version: "29",
2424 }
2425 apex_key {
2426 name: "myapex.key",
2427 public_key: "testkey.avbpubkey",
2428 private_key: "testkey.pem",
2429 }
2430 java_library {
2431 name: "myjar",
2432 srcs: ["foo/bar/MyClass.java"],
2433 sdk_version: "current",
2434 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002435 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002436 }
2437 `,
2438 },
2439 {
2440 name: "Updatable apex with non-stable dep",
2441 expectedError: "cannot depend on \"myjar\"",
2442 bp: `
2443 apex {
2444 name: "myapex",
2445 java_libs: ["myjar"],
2446 key: "myapex.key",
2447 updatable: true,
2448 }
2449 apex_key {
2450 name: "myapex.key",
2451 public_key: "testkey.avbpubkey",
2452 private_key: "testkey.pem",
2453 }
2454 java_library {
2455 name: "myjar",
2456 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002457 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002458 apex_available: ["myapex"],
2459 }
2460 `,
2461 },
2462 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002463 name: "Updatable apex with non-stable legacy core platform dep",
2464 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2465 bp: `
2466 apex {
2467 name: "myapex",
2468 java_libs: ["myjar-uses-legacy"],
2469 key: "myapex.key",
2470 updatable: true,
2471 }
2472 apex_key {
2473 name: "myapex.key",
2474 public_key: "testkey.avbpubkey",
2475 private_key: "testkey.pem",
2476 }
2477 java_library {
2478 name: "myjar-uses-legacy",
2479 srcs: ["foo/bar/MyClass.java"],
2480 sdk_version: "core_platform",
2481 apex_available: ["myapex"],
2482 }
2483 `,
2484 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2485 },
2486 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002487 name: "Updatable apex with non-stable transitive dep",
2488 // This is not actually detecting that the transitive dependency is unstable, rather it is
2489 // detecting that the transitive dependency is building against a wider API surface than the
2490 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002491 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002492 bp: `
2493 apex {
2494 name: "myapex",
2495 java_libs: ["myjar"],
2496 key: "myapex.key",
2497 updatable: true,
2498 }
2499 apex_key {
2500 name: "myapex.key",
2501 public_key: "testkey.avbpubkey",
2502 private_key: "testkey.pem",
2503 }
2504 java_library {
2505 name: "myjar",
2506 srcs: ["foo/bar/MyClass.java"],
2507 sdk_version: "current",
2508 apex_available: ["myapex"],
2509 static_libs: ["transitive-jar"],
2510 }
2511 java_library {
2512 name: "transitive-jar",
2513 srcs: ["foo/bar/MyClass.java"],
2514 sdk_version: "core_platform",
2515 apex_available: ["myapex"],
2516 }
2517 `,
2518 },
2519 }
2520
2521 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002522 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2523 continue
2524 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002525 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002526 errorHandler := android.FixtureExpectsNoErrors
2527 if test.expectedError != "" {
2528 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002529 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002530 android.GroupFixturePreparers(
2531 java.PrepareForTestWithJavaDefaultModules,
2532 PrepareForTestWithApexBuildComponents,
2533 prepareForTestWithMyapex,
2534 android.OptionalFixturePreparer(test.preparer),
2535 ).
2536 ExtendWithErrorHandler(errorHandler).
2537 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002538 })
2539 }
2540}
2541
Jooyung Han749dc692020-04-15 11:03:39 +09002542func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2543 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2544 apex {
2545 name: "myapex",
2546 key: "myapex.key",
2547 native_shared_libs: ["mylib"],
2548 min_sdk_version: "29",
2549 }
2550
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556
2557 cc_library {
2558 name: "mylib",
2559 srcs: ["mylib.cpp"],
2560 shared_libs: ["mylib2"],
2561 system_shared_libs: [],
2562 stl: "none",
2563 apex_available: [
2564 "myapex",
2565 ],
2566 min_sdk_version: "29",
2567 }
2568
2569 // indirect part of the apex
2570 cc_library {
2571 name: "mylib2",
2572 srcs: ["mylib.cpp"],
2573 system_shared_libs: [],
2574 stl: "none",
2575 apex_available: [
2576 "myapex",
2577 ],
2578 min_sdk_version: "30",
2579 }
2580 `)
2581}
2582
2583func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2584 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2585 apex {
2586 name: "myapex",
2587 key: "myapex.key",
2588 apps: ["AppFoo"],
2589 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002590 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 android_app {
2600 name: "AppFoo",
2601 srcs: ["foo/bar/MyClass.java"],
2602 sdk_version: "current",
2603 min_sdk_version: "29",
2604 system_modules: "none",
2605 stl: "none",
2606 static_libs: ["bar"],
2607 apex_available: [ "myapex" ],
2608 }
2609
2610 java_library {
2611 name: "bar",
2612 sdk_version: "current",
2613 srcs: ["a.java"],
2614 apex_available: [ "myapex" ],
2615 }
2616 `)
2617}
2618
2619func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002620 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002621 apex {
2622 name: "myapex",
2623 key: "myapex.key",
2624 native_shared_libs: ["mylib"],
2625 min_sdk_version: "29",
2626 }
2627
2628 apex_key {
2629 name: "myapex.key",
2630 public_key: "testkey.avbpubkey",
2631 private_key: "testkey.pem",
2632 }
2633
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002634 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002635 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2636 cc_library {
2637 name: "mylib",
2638 srcs: ["mylib.cpp"],
2639 shared_libs: ["mylib2"],
2640 system_shared_libs: [],
2641 stl: "none",
2642 apex_available: ["myapex", "otherapex"],
2643 min_sdk_version: "29",
2644 }
2645
2646 cc_library {
2647 name: "mylib2",
2648 srcs: ["mylib.cpp"],
2649 system_shared_libs: [],
2650 stl: "none",
2651 apex_available: ["otherapex"],
2652 stubs: { versions: ["29", "30"] },
2653 min_sdk_version: "30",
2654 }
2655
2656 apex {
2657 name: "otherapex",
2658 key: "myapex.key",
2659 native_shared_libs: ["mylib", "mylib2"],
2660 min_sdk_version: "30",
2661 }
2662 `)
2663 expectLink := func(from, from_variant, to, to_variant string) {
2664 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2665 libFlags := ld.Args["libFlags"]
2666 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2667 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002668 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002669 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002670}
2671
Jooyung Haned124c32021-01-26 11:43:46 +09002672func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002673 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2674 func(variables android.FixtureProductVariables) {
2675 variables.Platform_sdk_codename = proptools.StringPtr("S")
2676 variables.Platform_version_active_codenames = []string{"S"}
2677 },
2678 )
Jooyung Haned124c32021-01-26 11:43:46 +09002679 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2680 apex {
2681 name: "myapex",
2682 key: "myapex.key",
2683 native_shared_libs: ["libfoo"],
2684 min_sdk_version: "S",
2685 }
2686 apex_key {
2687 name: "myapex.key",
2688 public_key: "testkey.avbpubkey",
2689 private_key: "testkey.pem",
2690 }
2691 cc_library {
2692 name: "libfoo",
2693 shared_libs: ["libbar"],
2694 apex_available: ["myapex"],
2695 min_sdk_version: "29",
2696 }
2697 cc_library {
2698 name: "libbar",
2699 apex_available: ["myapex"],
2700 }
2701 `, withSAsActiveCodeNames)
2702}
2703
2704func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002705 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2706 variables.Platform_sdk_codename = proptools.StringPtr("S")
2707 variables.Platform_version_active_codenames = []string{"S", "T"}
2708 })
Colin Cross1c460562021-02-16 17:55:47 -08002709 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002710 apex {
2711 name: "myapex",
2712 key: "myapex.key",
2713 native_shared_libs: ["libfoo"],
2714 min_sdk_version: "S",
2715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 cc_library {
2722 name: "libfoo",
2723 shared_libs: ["libbar"],
2724 apex_available: ["myapex"],
2725 min_sdk_version: "S",
2726 }
2727 cc_library {
2728 name: "libbar",
2729 stubs: {
2730 symbol_file: "libbar.map.txt",
2731 versions: ["30", "S", "T"],
2732 },
2733 }
2734 `, withSAsActiveCodeNames)
2735
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002736 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002737 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2738 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002739 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002740}
2741
Jiyong Park7c2ee712018-12-07 00:42:25 +09002742func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002743 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002744 apex {
2745 name: "myapex",
2746 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002747 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002748 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002749 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002750 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002751 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002752 }
2753
2754 apex_key {
2755 name: "myapex.key",
2756 public_key: "testkey.avbpubkey",
2757 private_key: "testkey.pem",
2758 }
2759
2760 prebuilt_etc {
2761 name: "myetc",
2762 src: "myprebuilt",
2763 sub_dir: "foo/bar",
2764 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002765
2766 cc_library {
2767 name: "mylib",
2768 srcs: ["mylib.cpp"],
2769 relative_install_path: "foo/bar",
2770 system_shared_libs: [],
2771 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002772 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002773 }
2774
2775 cc_binary {
2776 name: "mybin",
2777 srcs: ["mylib.cpp"],
2778 relative_install_path: "foo/bar",
2779 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002780 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002781 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002782 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002783
2784 rust_binary {
2785 name: "mybin.rust",
2786 srcs: ["foo.rs"],
2787 relative_install_path: "rust_subdir",
2788 apex_available: [ "myapex" ],
2789 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002790 `)
2791
Jooyung Hana0503a52023-08-23 13:12:50 +09002792 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002793 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002794
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002795 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002796 ensureContains(t, cmd, "/etc ")
2797 ensureContains(t, cmd, "/etc/foo ")
2798 ensureContains(t, cmd, "/etc/foo/bar ")
2799 ensureContains(t, cmd, "/lib64 ")
2800 ensureContains(t, cmd, "/lib64/foo ")
2801 ensureContains(t, cmd, "/lib64/foo/bar ")
2802 ensureContains(t, cmd, "/lib ")
2803 ensureContains(t, cmd, "/lib/foo ")
2804 ensureContains(t, cmd, "/lib/foo/bar ")
2805 ensureContains(t, cmd, "/bin ")
2806 ensureContains(t, cmd, "/bin/foo ")
2807 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002808 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002809}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002810
Jooyung Han35155c42020-02-06 17:33:20 +09002811func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002812 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002813 apex {
2814 name: "myapex",
2815 key: "myapex.key",
2816 multilib: {
2817 both: {
2818 native_shared_libs: ["mylib"],
2819 binaries: ["mybin"],
2820 },
2821 },
2822 compile_multilib: "both",
2823 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002824 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002825 }
2826
2827 apex_key {
2828 name: "myapex.key",
2829 public_key: "testkey.avbpubkey",
2830 private_key: "testkey.pem",
2831 }
2832
2833 cc_library {
2834 name: "mylib",
2835 relative_install_path: "foo/bar",
2836 system_shared_libs: [],
2837 stl: "none",
2838 apex_available: [ "myapex" ],
2839 native_bridge_supported: true,
2840 }
2841
2842 cc_binary {
2843 name: "mybin",
2844 relative_install_path: "foo/bar",
2845 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002846 stl: "none",
2847 apex_available: [ "myapex" ],
2848 native_bridge_supported: true,
2849 compile_multilib: "both", // default is "first" for binary
2850 multilib: {
2851 lib64: {
2852 suffix: "64",
2853 },
2854 },
2855 }
2856 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002857 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002858 "bin/foo/bar/mybin",
2859 "bin/foo/bar/mybin64",
2860 "bin/arm/foo/bar/mybin",
2861 "bin/arm64/foo/bar/mybin64",
2862 "lib/foo/bar/mylib.so",
2863 "lib/arm/foo/bar/mylib.so",
2864 "lib64/foo/bar/mylib.so",
2865 "lib64/arm64/foo/bar/mylib.so",
2866 })
2867}
2868
Jooyung Han85d61762020-06-24 23:50:26 +09002869func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002870 result := android.GroupFixturePreparers(
2871 prepareForApexTest,
2872 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2873 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002874 apex {
2875 name: "myapex",
2876 key: "myapex.key",
2877 binaries: ["mybin"],
2878 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002879 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002880 }
2881 apex_key {
2882 name: "myapex.key",
2883 public_key: "testkey.avbpubkey",
2884 private_key: "testkey.pem",
2885 }
2886 cc_binary {
2887 name: "mybin",
2888 vendor: true,
2889 shared_libs: ["libfoo"],
2890 }
2891 cc_library {
2892 name: "libfoo",
2893 proprietary: true,
2894 }
2895 `)
2896
Jooyung Hana0503a52023-08-23 13:12:50 +09002897 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002898 "bin/mybin",
2899 "lib64/libfoo.so",
2900 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2901 "lib64/libc++.so",
2902 })
2903
Jooyung Hana0503a52023-08-23 13:12:50 +09002904 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002905 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002906 name := apexBundle.BaseModuleName()
2907 prefix := "TARGET_"
2908 var builder strings.Builder
2909 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002910 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002911 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002912 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913
Jooyung Hana0503a52023-08-23 13:12:50 +09002914 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002915 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2916 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002917}
2918
Jooyung Hanc5a96762022-02-04 11:54:50 +09002919func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2920 testApexError(t, `Trying to include a VNDK library`, `
2921 apex {
2922 name: "myapex",
2923 key: "myapex.key",
2924 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2925 vendor: true,
2926 use_vndk_as_stable: true,
2927 updatable: false,
2928 }
2929 apex_key {
2930 name: "myapex.key",
2931 public_key: "testkey.avbpubkey",
2932 private_key: "testkey.pem",
2933 }`)
2934}
2935
Jooyung Handf78e212020-07-22 15:54:47 +09002936func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002937 // myapex myapex2
2938 // | |
2939 // mybin ------. mybin2
2940 // \ \ / |
2941 // (stable) .---\--------` |
2942 // \ / \ |
2943 // \ / \ /
2944 // libvndk libvendor
2945 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002946 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002947 apex {
2948 name: "myapex",
2949 key: "myapex.key",
2950 binaries: ["mybin"],
2951 vendor: true,
2952 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002953 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002954 }
2955 apex_key {
2956 name: "myapex.key",
2957 public_key: "testkey.avbpubkey",
2958 private_key: "testkey.pem",
2959 }
2960 cc_binary {
2961 name: "mybin",
2962 vendor: true,
2963 shared_libs: ["libvndk", "libvendor"],
2964 }
2965 cc_library {
2966 name: "libvndk",
2967 vndk: {
2968 enabled: true,
2969 },
2970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002971 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002972 }
2973 cc_library {
2974 name: "libvendor",
2975 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002976 stl: "none",
2977 }
2978 apex {
2979 name: "myapex2",
2980 key: "myapex.key",
2981 binaries: ["mybin2"],
2982 vendor: true,
2983 use_vndk_as_stable: false,
2984 updatable: false,
2985 }
2986 cc_binary {
2987 name: "mybin2",
2988 vendor: true,
2989 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002990 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002991 `,
2992 android.FixtureModifyConfig(func(config android.Config) {
2993 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2994 }),
2995 )
Jooyung Handf78e212020-07-22 15:54:47 +09002996
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002997 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002998
Jooyung Han91f92032022-02-04 12:36:33 +09002999 for _, tc := range []struct {
3000 name string
3001 apexName string
3002 moduleName string
3003 moduleVariant string
3004 libs []string
3005 contents []string
3006 requireVndkNamespace bool
3007 }{
3008 {
3009 name: "use_vndk_as_stable",
3010 apexName: "myapex",
3011 moduleName: "mybin",
3012 moduleVariant: vendorVariant + "_apex10000",
3013 libs: []string{
3014 // should link with vendor variants of VNDK libs(libvndk/libc++)
3015 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3016 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3017 // unstable Vendor libs as APEX variant
3018 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3019 },
3020 contents: []string{
3021 "bin/mybin",
3022 "lib64/libvendor.so",
3023 // VNDK libs (libvndk/libc++) are not included
3024 },
3025 requireVndkNamespace: true,
3026 },
3027 {
3028 name: "!use_vndk_as_stable",
3029 apexName: "myapex2",
3030 moduleName: "mybin2",
3031 moduleVariant: vendorVariant + "_myapex2",
3032 libs: []string{
3033 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3034 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3035 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3036 // unstable vendor libs have "merged" APEX variants
3037 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3038 },
3039 contents: []string{
3040 "bin/mybin2",
3041 "lib64/libvendor.so",
3042 // VNDK libs are included as well
3043 "lib64/libvndk.so",
3044 "lib64/libc++.so",
3045 },
3046 requireVndkNamespace: false,
3047 },
3048 } {
3049 t.Run(tc.name, func(t *testing.T) {
3050 // Check linked libs
3051 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3052 libs := names(ldRule.Args["libFlags"])
3053 for _, lib := range tc.libs {
3054 ensureListContains(t, libs, lib)
3055 }
3056 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003057 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003058
Jooyung Han91f92032022-02-04 12:36:33 +09003059 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003060 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003061 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3062 if tc.requireVndkNamespace {
3063 ensureListContains(t, requireNativeLibs, ":vndk")
3064 } else {
3065 ensureListNotContains(t, requireNativeLibs, ":vndk")
3066 }
3067 })
3068 }
Jooyung Handf78e212020-07-22 15:54:47 +09003069}
3070
Justin Yun13decfb2021-03-08 19:25:55 +09003071func TestProductVariant(t *testing.T) {
3072 ctx := testApex(t, `
3073 apex {
3074 name: "myapex",
3075 key: "myapex.key",
3076 updatable: false,
3077 product_specific: true,
3078 binaries: ["foo"],
3079 }
3080
3081 apex_key {
3082 name: "myapex.key",
3083 public_key: "testkey.avbpubkey",
3084 private_key: "testkey.pem",
3085 }
3086
3087 cc_binary {
3088 name: "foo",
3089 product_available: true,
3090 apex_available: ["myapex"],
3091 srcs: ["foo.cpp"],
3092 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003093 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003094
3095 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003096 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003097 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3098 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3099 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3100 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3101}
3102
Jooyung Han8e5685d2020-09-21 11:02:57 +09003103func TestApex_withPrebuiltFirmware(t *testing.T) {
3104 testCases := []struct {
3105 name string
3106 additionalProp string
3107 }{
3108 {"system apex with prebuilt_firmware", ""},
3109 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3110 }
3111 for _, tc := range testCases {
3112 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003113 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003114 apex {
3115 name: "myapex",
3116 key: "myapex.key",
3117 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003118 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003119 `+tc.additionalProp+`
3120 }
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }
3126 prebuilt_firmware {
3127 name: "myfirmware",
3128 src: "myfirmware.bin",
3129 filename_from_src: true,
3130 `+tc.additionalProp+`
3131 }
3132 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003133 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003134 "etc/firmware/myfirmware.bin",
3135 })
3136 })
3137 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003138}
3139
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003141 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003142 apex {
3143 name: "myapex",
3144 key: "myapex.key",
3145 vendor: true,
3146 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003147 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003148 }
3149
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155
3156 cc_library {
3157 name: "mylib",
3158 vendor_available: true,
3159 }
3160 `)
3161
Jooyung Hana0503a52023-08-23 13:12:50 +09003162 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003163 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003164 name := apexBundle.BaseModuleName()
3165 prefix := "TARGET_"
3166 var builder strings.Builder
3167 data.Custom(&builder, name, prefix, "", data)
3168 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003169 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003170}
3171
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003173 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003174 apex {
3175 name: "myapex",
3176 key: "myapex.key",
3177 vintf_fragments: ["fragment.xml"],
3178 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003179 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003180 }
3181 apex_key {
3182 name: "myapex.key",
3183 public_key: "testkey.avbpubkey",
3184 private_key: "testkey.pem",
3185 }
3186 cc_binary {
3187 name: "mybin",
3188 }
3189 `)
3190
Jooyung Hana0503a52023-08-23 13:12:50 +09003191 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003192 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003193 name := apexBundle.BaseModuleName()
3194 prefix := "TARGET_"
3195 var builder strings.Builder
3196 data.Custom(&builder, name, prefix, "", data)
3197 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003198 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003199 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003200}
3201
Jiyong Park16e91a02018-12-20 18:18:08 +09003202func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003203 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003204 apex {
3205 name: "myapex",
3206 key: "myapex.key",
3207 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003208 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 }
3210
3211 apex_key {
3212 name: "myapex.key",
3213 public_key: "testkey.avbpubkey",
3214 private_key: "testkey.pem",
3215 }
3216
3217 cc_library {
3218 name: "mylib",
3219 srcs: ["mylib.cpp"],
3220 system_shared_libs: [],
3221 stl: "none",
3222 stubs: {
3223 versions: ["1", "2", "3"],
3224 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003225 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003226 }
3227
3228 cc_binary {
3229 name: "not_in_apex",
3230 srcs: ["mylib.cpp"],
3231 static_libs: ["mylib"],
3232 static_executable: true,
3233 system_shared_libs: [],
3234 stl: "none",
3235 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003236 `)
3237
Colin Cross7113d202019-11-20 16:39:12 -08003238 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003239
3240 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003241 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003242}
Jiyong Park9335a262018-12-24 11:31:58 +09003243
3244func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003245 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003246 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003247 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003248 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003249 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003250 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003251 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003252 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254
3255 cc_library {
3256 name: "mylib",
3257 srcs: ["mylib.cpp"],
3258 system_shared_libs: [],
3259 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003260 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003261 }
3262
3263 apex_key {
3264 name: "myapex.key",
3265 public_key: "testkey.avbpubkey",
3266 private_key: "testkey.pem",
3267 }
3268
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003269 android_app_certificate {
3270 name: "myapex.certificate",
3271 certificate: "testkey",
3272 }
3273
3274 android_app_certificate {
3275 name: "myapex.certificate.override",
3276 certificate: "testkey.override",
3277 }
3278
Jiyong Park9335a262018-12-24 11:31:58 +09003279 `)
3280
3281 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003282 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003283
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003284 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3285 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003286 "vendor/foo/devkeys/testkey.avbpubkey")
3287 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003288 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3289 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003290 "vendor/foo/devkeys/testkey.pem")
3291 }
3292
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003294 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003295 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003296 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003297 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003298 }
3299}
Jiyong Park58e364a2019-01-19 19:24:06 +09003300
Jooyung Hanf121a652019-12-17 14:30:11 +09003301func TestCertificate(t *testing.T) {
3302 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003303 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003304 apex {
3305 name: "myapex",
3306 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003307 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003308 }
3309 apex_key {
3310 name: "myapex.key",
3311 public_key: "testkey.avbpubkey",
3312 private_key: "testkey.pem",
3313 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003314 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3316 if actual := rule.Args["certificates"]; actual != expected {
3317 t.Errorf("certificates should be %q, not %q", expected, actual)
3318 }
3319 })
3320 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003321 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003322 apex {
3323 name: "myapex_keytest",
3324 key: "myapex.key",
3325 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003326 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003327 }
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333 android_app_certificate {
3334 name: "myapex.certificate.override",
3335 certificate: "testkey.override",
3336 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003337 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003338 expected := "testkey.override.x509.pem testkey.override.pk8"
3339 if actual := rule.Args["certificates"]; actual != expected {
3340 t.Errorf("certificates should be %q, not %q", expected, actual)
3341 }
3342 })
3343 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003344 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003345 apex {
3346 name: "myapex",
3347 key: "myapex.key",
3348 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003349 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003350 }
3351 apex_key {
3352 name: "myapex.key",
3353 public_key: "testkey.avbpubkey",
3354 private_key: "testkey.pem",
3355 }
3356 android_app_certificate {
3357 name: "myapex.certificate",
3358 certificate: "testkey",
3359 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003360 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003361 expected := "testkey.x509.pem testkey.pk8"
3362 if actual := rule.Args["certificates"]; actual != expected {
3363 t.Errorf("certificates should be %q, not %q", expected, actual)
3364 }
3365 })
3366 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003368 apex {
3369 name: "myapex_keytest",
3370 key: "myapex.key",
3371 file_contexts: ":myapex-file_contexts",
3372 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003373 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 }
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380 android_app_certificate {
3381 name: "myapex.certificate.override",
3382 certificate: "testkey.override",
3383 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003384 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003385 expected := "testkey.override.x509.pem testkey.override.pk8"
3386 if actual := rule.Args["certificates"]; actual != expected {
3387 t.Errorf("certificates should be %q, not %q", expected, actual)
3388 }
3389 })
3390 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003391 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003392 apex {
3393 name: "myapex",
3394 key: "myapex.key",
3395 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003396 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 }
3398 apex_key {
3399 name: "myapex.key",
3400 public_key: "testkey.avbpubkey",
3401 private_key: "testkey.pem",
3402 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003403 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003404 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3405 if actual := rule.Args["certificates"]; actual != expected {
3406 t.Errorf("certificates should be %q, not %q", expected, actual)
3407 }
3408 })
3409 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003410 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 apex {
3412 name: "myapex_keytest",
3413 key: "myapex.key",
3414 file_contexts: ":myapex-file_contexts",
3415 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 android_app_certificate {
3424 name: "myapex.certificate.override",
3425 certificate: "testkey.override",
3426 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003427 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003428 expected := "testkey.override.x509.pem testkey.override.pk8"
3429 if actual := rule.Args["certificates"]; actual != expected {
3430 t.Errorf("certificates should be %q, not %q", expected, actual)
3431 }
3432 })
3433}
3434
Jiyong Park58e364a2019-01-19 19:24:06 +09003435func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003436 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003437 apex {
3438 name: "myapex",
3439 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003440 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003442 }
3443
3444 apex {
3445 name: "otherapex",
3446 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003447 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003448 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003449 }
3450
3451 apex_key {
3452 name: "myapex.key",
3453 public_key: "testkey.avbpubkey",
3454 private_key: "testkey.pem",
3455 }
3456
3457 cc_library {
3458 name: "mylib",
3459 srcs: ["mylib.cpp"],
3460 system_shared_libs: [],
3461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003462 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003463 "myapex",
3464 "otherapex",
3465 ],
Jooyung Han24282772020-03-21 23:20:55 +09003466 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003467 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003468 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003469 cc_library {
3470 name: "mylib2",
3471 srcs: ["mylib.cpp"],
3472 system_shared_libs: [],
3473 stl: "none",
3474 apex_available: [
3475 "myapex",
3476 "otherapex",
3477 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003478 static_libs: ["mylib3"],
3479 recovery_available: true,
3480 min_sdk_version: "29",
3481 }
3482 cc_library {
3483 name: "mylib3",
3484 srcs: ["mylib.cpp"],
3485 system_shared_libs: [],
3486 stl: "none",
3487 apex_available: [
3488 "myapex",
3489 "otherapex",
3490 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003491 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003492 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003493 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003494 `)
3495
Jooyung Hanc87a0592020-03-02 17:44:33 +09003496 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003497 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003498 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499
Vinh Tranf9754732023-01-19 22:41:46 -05003500 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003501 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503
Vinh Tranf9754732023-01-19 22:41:46 -05003504 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003505 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003506 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003507
Colin Crossaede88c2020-08-11 12:17:01 -07003508 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3509 // each variant defines additional macros to distinguish which apex variant it is built for
3510
3511 // non-APEX variant does not have __ANDROID_APEX__ defined
3512 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3513 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3514
Vinh Tranf9754732023-01-19 22:41:46 -05003515 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003516 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3517 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003518
Jooyung Hanc87a0592020-03-02 17:44:33 +09003519 // non-APEX variant does not have __ANDROID_APEX__ defined
3520 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3521 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3522
Vinh Tranf9754732023-01-19 22:41:46 -05003523 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003524 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003525 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003526}
Jiyong Park7e636d02019-01-28 16:16:54 +09003527
3528func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003529 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003530 apex {
3531 name: "myapex",
3532 key: "myapex.key",
3533 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003534 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003535 }
3536
3537 apex_key {
3538 name: "myapex.key",
3539 public_key: "testkey.avbpubkey",
3540 private_key: "testkey.pem",
3541 }
3542
3543 cc_library_headers {
3544 name: "mylib_headers",
3545 export_include_dirs: ["my_include"],
3546 system_shared_libs: [],
3547 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003548 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003549 }
3550
3551 cc_library {
3552 name: "mylib",
3553 srcs: ["mylib.cpp"],
3554 system_shared_libs: [],
3555 stl: "none",
3556 header_libs: ["mylib_headers"],
3557 export_header_lib_headers: ["mylib_headers"],
3558 stubs: {
3559 versions: ["1", "2", "3"],
3560 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003561 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003562 }
3563
3564 cc_library {
3565 name: "otherlib",
3566 srcs: ["mylib.cpp"],
3567 system_shared_libs: [],
3568 stl: "none",
3569 shared_libs: ["mylib"],
3570 }
3571 `)
3572
Colin Cross7113d202019-11-20 16:39:12 -08003573 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003574
3575 // Ensure that the include path of the header lib is exported to 'otherlib'
3576 ensureContains(t, cFlags, "-Imy_include")
3577}
Alex Light9670d332019-01-29 18:07:33 -08003578
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579type fileInApex struct {
3580 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003581 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003582 isLink bool
3583}
3584
Jooyung Han1724d582022-12-21 10:17:44 +09003585func (f fileInApex) String() string {
3586 return f.src + ":" + f.path
3587}
3588
3589func (f fileInApex) match(expectation string) bool {
3590 parts := strings.Split(expectation, ":")
3591 if len(parts) == 1 {
3592 match, _ := path.Match(parts[0], f.path)
3593 return match
3594 }
3595 if len(parts) == 2 {
3596 matchSrc, _ := path.Match(parts[0], f.src)
3597 matchDst, _ := path.Match(parts[1], f.path)
3598 return matchSrc && matchDst
3599 }
3600 panic("invalid expected file specification: " + expectation)
3601}
3602
Jooyung Hana57af4a2020-01-23 05:36:59 +00003603func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003604 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003605 module := ctx.ModuleForTests(moduleName, variant)
3606 apexRule := module.MaybeRule("apexRule")
3607 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 for _, cmd := range strings.Split(copyCmds, "&&") {
3611 cmd = strings.TrimSpace(cmd)
3612 if cmd == "" {
3613 continue
3614 }
3615 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 switch terms[0] {
3619 case "mkdir":
3620 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003621 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003622 t.Fatal("copyCmds contains invalid cp command", cmd)
3623 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink = false
3627 case "ln":
3628 if len(terms) != 3 && len(terms) != 4 {
3629 // ln LINK TARGET or ln -s LINK TARGET
3630 t.Fatal("copyCmds contains invalid ln command", cmd)
3631 }
3632 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003633 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003634 isLink = true
3635 default:
3636 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3637 }
3638 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003641 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 }
Jooyung Han1724d582022-12-21 10:17:44 +09003643 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003644 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 }
3646 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003647 return ret
3648}
3649
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003650func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003651 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 var failed bool
3653 var surplus []string
3654 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003656 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003657 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003658 if file.match(expected) {
3659 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003661 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003662 }
3663 }
Jooyung Han1724d582022-12-21 10:17:44 +09003664 if !matchFound {
3665 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003666 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003668
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003670 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003671 t.Log("surplus files", surplus)
3672 failed = true
3673 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003675 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003677 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 if !filesMatched[expected] {
3679 missing = append(missing, expected)
3680 }
3681 }
3682 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 t.Log("missing files", missing)
3684 failed = true
3685 }
3686 if failed {
3687 t.Fail()
3688 }
3689}
3690
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003691func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3692 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3693}
3694
3695func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3696 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3697 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3698 if deapexer.Output != nil {
3699 outputs = append(outputs, deapexer.Output.String())
3700 }
3701 for _, output := range deapexer.ImplicitOutputs {
3702 outputs = append(outputs, output.String())
3703 }
3704 actualFiles := make([]fileInApex, 0, len(outputs))
3705 for _, output := range outputs {
3706 dir := "/deapexer/"
3707 pos := strings.LastIndex(output, dir)
3708 if pos == -1 {
3709 t.Fatal("Unknown deapexer output ", output)
3710 }
3711 path := output[pos+len(dir):]
3712 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3713 }
3714 assertFileListEquals(t, files, actualFiles)
3715}
3716
Jooyung Han344d5432019-08-23 11:17:39 +09003717func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003718 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003719 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003721 "etc/llndk.libraries.29.txt",
3722 "etc/vndkcore.libraries.29.txt",
3723 "etc/vndksp.libraries.29.txt",
3724 "etc/vndkprivate.libraries.29.txt",
3725 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003726 }
3727 testCases := []struct {
3728 vndkVersion string
3729 expectedFiles []string
3730 }{
3731 {
3732 vndkVersion: "current",
3733 expectedFiles: append(commonFiles,
3734 "lib/libvndk.so",
3735 "lib/libvndksp.so",
3736 "lib64/libvndk.so",
3737 "lib64/libvndksp.so"),
3738 },
3739 {
3740 vndkVersion: "",
3741 expectedFiles: append(commonFiles,
3742 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3743 "lib/libvndksp.so",
3744 "lib64/libvndksp.so"),
3745 },
3746 }
3747 for _, tc := range testCases {
3748 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3749 ctx := testApex(t, `
3750 apex_vndk {
3751 name: "com.android.vndk.current",
3752 key: "com.android.vndk.current.key",
3753 updatable: false,
3754 }
3755
3756 apex_key {
3757 name: "com.android.vndk.current.key",
3758 public_key: "testkey.avbpubkey",
3759 private_key: "testkey.pem",
3760 }
3761
3762 cc_library {
3763 name: "libvndk",
3764 srcs: ["mylib.cpp"],
3765 vendor_available: true,
3766 product_available: true,
3767 vndk: {
3768 enabled: true,
3769 },
3770 system_shared_libs: [],
3771 stl: "none",
3772 apex_available: [ "com.android.vndk.current" ],
3773 }
3774
3775 cc_library {
3776 name: "libvndksp",
3777 srcs: ["mylib.cpp"],
3778 vendor_available: true,
3779 product_available: true,
3780 vndk: {
3781 enabled: true,
3782 support_system_process: true,
3783 },
3784 system_shared_libs: [],
3785 stl: "none",
3786 apex_available: [ "com.android.vndk.current" ],
3787 }
3788
3789 // VNDK-Ext should not cause any problems
3790
3791 cc_library {
3792 name: "libvndk.ext",
3793 srcs: ["mylib2.cpp"],
3794 vendor: true,
3795 vndk: {
3796 enabled: true,
3797 extends: "libvndk",
3798 },
3799 system_shared_libs: [],
3800 stl: "none",
3801 }
3802
3803 cc_library {
3804 name: "libvndksp.ext",
3805 srcs: ["mylib2.cpp"],
3806 vendor: true,
3807 vndk: {
3808 enabled: true,
3809 support_system_process: true,
3810 extends: "libvndksp",
3811 },
3812 system_shared_libs: [],
3813 stl: "none",
3814 }
3815 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3816 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003817 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003818 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003819 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003820 })
3821 }
Jooyung Han344d5432019-08-23 11:17:39 +09003822}
3823
3824func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003825 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003827 name: "com.android.vndk.current",
3828 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
3831
3832 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003833 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
3837
3838 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 name: "libvndk",
3840 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003842 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003843 vndk: {
3844 enabled: true,
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003848 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003849 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003850
3851 cc_prebuilt_library_shared {
3852 name: "libvndk.arm",
3853 srcs: ["libvndk.arm.so"],
3854 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003855 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 vndk: {
3857 enabled: true,
3858 },
3859 enabled: false,
3860 arch: {
3861 arm: {
3862 enabled: true,
3863 },
3864 },
3865 system_shared_libs: [],
3866 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003867 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 `+vndkLibrariesTxtFiles("current"),
3870 withFiles(map[string][]byte{
3871 "libvndk.so": nil,
3872 "libvndk.arm.so": nil,
3873 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003874 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 "lib/libvndk.so",
3876 "lib/libvndk.arm.so",
3877 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003878 "lib/libc++.so",
3879 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003880 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 })
Jooyung Han344d5432019-08-23 11:17:39 +09003882}
3883
Jooyung Han39edb6c2019-11-06 16:53:07 +09003884func vndkLibrariesTxtFiles(vers ...string) (result string) {
3885 for _, v := range vers {
3886 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003887 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003889 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003891 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003892 }
3893 `
3894 }
Justin Yund5784122023-10-25 13:25:32 +09003895 result += `
3896 llndk_libraries_txt {
3897 name: "llndk.libraries.txt",
3898 }
3899 llndk_libraries_txt_for_apex {
3900 name: "llndk.libraries.txt.apex",
3901 stem: "llndk.libraries.txt",
3902 insert_vndk_version: true,
3903 }
3904 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003906 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003907 result += `
3908 prebuilt_etc {
3909 name: "` + txt + `.libraries.` + v + `.txt",
3910 src: "dummy.txt",
3911 }
3912 `
3913 }
3914 }
3915 }
3916 return
3917}
3918
Jooyung Han344d5432019-08-23 11:17:39 +09003919func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003920 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003921 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003922 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003923 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003924 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003926 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003927 }
3928
3929 apex_key {
3930 name: "myapex.key",
3931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
3933 }
3934
Jooyung Han31c470b2019-10-18 16:26:59 +09003935 vndk_prebuilt_shared {
3936 name: "libvndk27",
3937 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003938 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003939 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003940 vndk: {
3941 enabled: true,
3942 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003943 target_arch: "arm64",
3944 arch: {
3945 arm: {
3946 srcs: ["libvndk27_arm.so"],
3947 },
3948 arm64: {
3949 srcs: ["libvndk27_arm64.so"],
3950 },
3951 },
Colin Cross2807f002021-03-02 10:15:29 -08003952 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003953 }
3954
3955 vndk_prebuilt_shared {
3956 name: "libvndk27",
3957 version: "27",
3958 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003959 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vndk: {
3961 enabled: true,
3962 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003963 target_arch: "x86_64",
3964 arch: {
3965 x86: {
3966 srcs: ["libvndk27_x86.so"],
3967 },
3968 x86_64: {
3969 srcs: ["libvndk27_x86_64.so"],
3970 },
3971 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003972 }
3973 `+vndkLibrariesTxtFiles("27"),
3974 withFiles(map[string][]byte{
3975 "libvndk27_arm.so": nil,
3976 "libvndk27_arm64.so": nil,
3977 "libvndk27_x86.so": nil,
3978 "libvndk27_x86_64.so": nil,
3979 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003980
Jooyung Hana0503a52023-08-23 13:12:50 +09003981 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003982 "lib/libvndk27_arm.so",
3983 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003984 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 })
Jooyung Han344d5432019-08-23 11:17:39 +09003986}
3987
Jooyung Han90eee022019-10-01 20:02:42 +09003988func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003989 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003990 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003991 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003992 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003993 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003994 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003995 }
3996 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003997 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003998 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003999 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004000 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004001 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004002 }
4003 apex_key {
4004 name: "myapex.key",
4005 public_key: "testkey.avbpubkey",
4006 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004008
4009 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004010 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004011 apexManifestRule := module.Rule("apexManifestRule")
4012 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004013 }
4014
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004015 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004016 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004017}
4018
Jooyung Han344d5432019-08-23 11:17:39 +09004019func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004020 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004021 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004022 name: "com.android.vndk.current",
4023 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004025 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004026 }
4027
4028 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004029 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 public_key: "testkey.avbpubkey",
4031 private_key: "testkey.pem",
4032 }
4033
4034 cc_library {
4035 name: "libvndk",
4036 srcs: ["mylib.cpp"],
4037 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004038 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004039 native_bridge_supported: true,
4040 host_supported: true,
4041 vndk: {
4042 enabled: true,
4043 },
4044 system_shared_libs: [],
4045 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004046 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004047 }
Colin Cross2807f002021-03-02 10:15:29 -08004048 `+vndkLibrariesTxtFiles("current"),
4049 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004050
Jooyung Hana0503a52023-08-23 13:12:50 +09004051 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 "lib/libvndk.so",
4053 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004054 "lib/libc++.so",
4055 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004056 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 })
Jooyung Han344d5432019-08-23 11:17:39 +09004058}
4059
4060func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004061 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004062 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004063 name: "com.android.vndk.current",
4064 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004065 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
4067 }
4068
4069 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004070 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 cc_library {
4076 name: "libvndk",
4077 srcs: ["mylib.cpp"],
4078 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004079 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004080 native_bridge_supported: true,
4081 host_supported: true,
4082 vndk: {
4083 enabled: true,
4084 },
4085 system_shared_libs: [],
4086 stl: "none",
4087 }
4088 `)
4089}
4090
Jooyung Han31c470b2019-10-18 16:26:59 +09004091func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004092 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004094 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004095 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004096 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004098 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004099 }
4100
4101 apex_key {
4102 name: "myapex.key",
4103 public_key: "testkey.avbpubkey",
4104 private_key: "testkey.pem",
4105 }
4106
4107 vndk_prebuilt_shared {
4108 name: "libvndk27",
4109 version: "27",
4110 target_arch: "arm",
4111 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004112 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004113 vndk: {
4114 enabled: true,
4115 },
4116 arch: {
4117 arm: {
4118 srcs: ["libvndk27.so"],
4119 }
4120 },
4121 }
4122
4123 vndk_prebuilt_shared {
4124 name: "libvndk27",
4125 version: "27",
4126 target_arch: "arm",
4127 binder32bit: true,
4128 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004129 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 vndk: {
4131 enabled: true,
4132 },
4133 arch: {
4134 arm: {
4135 srcs: ["libvndk27binder32.so"],
4136 }
4137 },
Colin Cross2807f002021-03-02 10:15:29 -08004138 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004140 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004141 withFiles(map[string][]byte{
4142 "libvndk27.so": nil,
4143 "libvndk27binder32.so": nil,
4144 }),
4145 withBinder32bit,
4146 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004147 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004148 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4149 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004150 },
4151 }),
4152 )
4153
Jooyung Hana0503a52023-08-23 13:12:50 +09004154 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004156 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004157 })
4158}
4159
Jooyung Han45a96772020-06-15 14:59:42 +09004160func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004161 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004162 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004163 name: "com.android.vndk.current",
4164 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004165 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004166 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004167 }
4168
4169 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004170 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
4174
4175 cc_library {
4176 name: "libz",
4177 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004178 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004179 vndk: {
4180 enabled: true,
4181 },
4182 stubs: {
4183 symbol_file: "libz.map.txt",
4184 versions: ["30"],
4185 }
4186 }
4187 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4188 "libz.map.txt": nil,
4189 }))
4190
Jooyung Hana0503a52023-08-23 13:12:50 +09004191 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004192 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4193 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004194 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004195 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4196 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4197 "*/*",
4198 })
Jooyung Han45a96772020-06-15 14:59:42 +09004199}
4200
Jooyung Hane3f02812023-05-08 13:54:50 +09004201func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4202 ctx := testApex(t, "",
4203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4204 variables.DeviceVndkVersion = proptools.StringPtr("27")
4205 }),
4206 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4207 cc.RegisterVendorSnapshotModules(ctx)
4208 }),
4209 withFiles(map[string][]byte{
4210 "vendor/foo/Android.bp": []byte(`
4211 apex {
4212 name: "myapex",
4213 binaries: ["foo"],
4214 key: "myapex.key",
4215 min_sdk_version: "27",
4216 vendor: true,
4217 }
4218
4219 cc_binary {
4220 name: "foo",
4221 vendor: true,
4222 srcs: ["abc.cpp"],
4223 shared_libs: [
4224 "libllndk",
4225 "libvndk",
4226 ],
4227 nocrt: true,
4228 system_shared_libs: [],
4229 min_sdk_version: "27",
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237 `),
4238 // Simulate VNDK prebuilts with vendor_snapshot
4239 "prebuilts/vndk/Android.bp": []byte(`
4240 vndk_prebuilt_shared {
4241 name: "libllndk",
4242 version: "27",
4243 vendor_available: true,
4244 product_available: true,
4245 target_arch: "arm64",
4246 arch: {
4247 arm64: {
4248 srcs: ["libllndk.so"],
4249 },
4250 },
4251 }
4252
4253 vndk_prebuilt_shared {
4254 name: "libvndk",
4255 version: "27",
4256 vendor_available: true,
4257 product_available: true,
4258 target_arch: "arm64",
4259 arch: {
4260 arm64: {
4261 srcs: ["libvndk.so"],
4262 },
4263 },
4264 vndk: {
4265 enabled: true,
4266 },
4267 min_sdk_version: "27",
4268 }
4269
4270 vndk_prebuilt_shared {
4271 name: "libc++",
4272 version: "27",
4273 target_arch: "arm64",
4274 vendor_available: true,
4275 product_available: true,
4276 vndk: {
4277 enabled: true,
4278 support_system_process: true,
4279 },
4280 arch: {
4281 arm64: {
4282 srcs: ["libc++.so"],
4283 },
4284 },
4285 min_sdk_version: "apex_inherit",
4286 }
4287
4288 vendor_snapshot {
4289 name: "vendor_snapshot",
4290 version: "27",
4291 arch: {
4292 arm64: {
4293 vndk_libs: [
4294 "libc++",
4295 "libllndk",
4296 "libvndk",
4297 ],
4298 static_libs: [
4299 "libc++demangle",
4300 "libclang_rt.builtins",
4301 "libunwind",
4302 ],
4303 },
4304 }
4305 }
4306
4307 vendor_snapshot_static {
4308 name: "libclang_rt.builtins",
4309 version: "27",
4310 target_arch: "arm64",
4311 vendor: true,
4312 arch: {
4313 arm64: {
4314 src: "libclang_rt.builtins-aarch64-android.a",
4315 },
4316 },
4317 }
4318
4319 vendor_snapshot_static {
4320 name: "libc++demangle",
4321 version: "27",
4322 target_arch: "arm64",
4323 compile_multilib: "64",
4324 vendor: true,
4325 arch: {
4326 arm64: {
4327 src: "libc++demangle.a",
4328 },
4329 },
4330 min_sdk_version: "apex_inherit",
4331 }
4332
4333 vendor_snapshot_static {
4334 name: "libunwind",
4335 version: "27",
4336 target_arch: "arm64",
4337 compile_multilib: "64",
4338 vendor: true,
4339 arch: {
4340 arm64: {
4341 src: "libunwind.a",
4342 },
4343 },
4344 min_sdk_version: "apex_inherit",
4345 }
4346 `),
4347 }))
4348
4349 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004350 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004351 "bin/foo",
4352 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4353 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4354 })
4355
4356 // Should link foo with prebuilt libraries (shared/static)
4357 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4358 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4359 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4360 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4361 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4362
4363 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004364 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004365 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4366 ensureListContains(t, requireNativeLibs, "libllndk.so")
4367}
4368
Jooyung Hane1633032019-08-01 17:41:43 +09004369func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004370 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004371 apex {
4372 name: "myapex_nodep",
4373 key: "myapex.key",
4374 native_shared_libs: ["lib_nodep"],
4375 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004376 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004377 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004378 }
4379
4380 apex {
4381 name: "myapex_dep",
4382 key: "myapex.key",
4383 native_shared_libs: ["lib_dep"],
4384 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004385 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004386 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004387 }
4388
4389 apex {
4390 name: "myapex_provider",
4391 key: "myapex.key",
4392 native_shared_libs: ["libfoo"],
4393 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004394 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004395 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004396 }
4397
4398 apex {
4399 name: "myapex_selfcontained",
4400 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004401 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004402 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004404 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004405 }
4406
4407 apex_key {
4408 name: "myapex.key",
4409 public_key: "testkey.avbpubkey",
4410 private_key: "testkey.pem",
4411 }
4412
4413 cc_library {
4414 name: "lib_nodep",
4415 srcs: ["mylib.cpp"],
4416 system_shared_libs: [],
4417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004418 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 cc_library {
4422 name: "lib_dep",
4423 srcs: ["mylib.cpp"],
4424 shared_libs: ["libfoo"],
4425 system_shared_libs: [],
4426 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004427 apex_available: [
4428 "myapex_dep",
4429 "myapex_provider",
4430 "myapex_selfcontained",
4431 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004435 name: "lib_dep_on_bar",
4436 srcs: ["mylib.cpp"],
4437 shared_libs: ["libbar"],
4438 system_shared_libs: [],
4439 stl: "none",
4440 apex_available: [
4441 "myapex_selfcontained",
4442 ],
4443 }
4444
4445
4446 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004447 name: "libfoo",
4448 srcs: ["mytest.cpp"],
4449 stubs: {
4450 versions: ["1"],
4451 },
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [
4455 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004456 ],
4457 }
4458
4459 cc_library {
4460 name: "libbar",
4461 srcs: ["mytest.cpp"],
4462 stubs: {
4463 versions: ["1"],
4464 },
4465 system_shared_libs: [],
4466 stl: "none",
4467 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 "myapex_selfcontained",
4469 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004470 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004471
Jooyung Hane1633032019-08-01 17:41:43 +09004472 `)
4473
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004474 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004475 var provideNativeLibs, requireNativeLibs []string
4476
Jooyung Hana0503a52023-08-23 13:12:50 +09004477 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004478 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4479 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004480 ensureListEmpty(t, provideNativeLibs)
4481 ensureListEmpty(t, requireNativeLibs)
4482
Jooyung Hana0503a52023-08-23 13:12:50 +09004483 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004484 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4485 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004486 ensureListEmpty(t, provideNativeLibs)
4487 ensureListContains(t, requireNativeLibs, "libfoo.so")
4488
Jooyung Hana0503a52023-08-23 13:12:50 +09004489 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004490 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4491 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004492 ensureListContains(t, provideNativeLibs, "libfoo.so")
4493 ensureListEmpty(t, requireNativeLibs)
4494
Jooyung Hana0503a52023-08-23 13:12:50 +09004495 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004496 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4497 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004498 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004499 ensureListEmpty(t, requireNativeLibs)
4500}
4501
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004502func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4503 ctx := testApex(t, `
4504 apex {
4505 name: "myapex",
4506 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004507 native_shared_libs: ["mylib"],
4508 updatable: false,
4509 }
4510
4511 apex_key {
4512 name: "myapex.key",
4513 public_key: "testkey.avbpubkey",
4514 private_key: "testkey.pem",
4515 }
4516
4517 cc_library {
4518 name: "mylib",
4519 srcs: ["mylib.cpp"],
4520 system_shared_libs: [],
4521 stl: "none",
4522 apex_available: [
4523 "//apex_available:platform",
4524 "myapex",
4525 ],
4526 }
4527 `, android.FixtureMergeEnv(map[string]string{
4528 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4529 }))
4530
Jooyung Hana0503a52023-08-23 13:12:50 +09004531 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004532 apexManifestRule := module.Rule("apexManifestRule")
4533 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4534}
4535
Vinh Tran8f5310f2022-10-07 18:16:47 -04004536func TestCompileMultilibProp(t *testing.T) {
4537 testCases := []struct {
4538 compileMultiLibProp string
4539 containedLibs []string
4540 notContainedLibs []string
4541 }{
4542 {
4543 containedLibs: []string{
4544 "image.apex/lib64/mylib.so",
4545 "image.apex/lib/mylib.so",
4546 },
4547 compileMultiLibProp: `compile_multilib: "both",`,
4548 },
4549 {
4550 containedLibs: []string{"image.apex/lib64/mylib.so"},
4551 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4552 compileMultiLibProp: `compile_multilib: "first",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib64/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4557 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4558 },
4559 {
4560 containedLibs: []string{"image.apex/lib64/mylib.so"},
4561 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4562 compileMultiLibProp: `compile_multilib: "64",`,
4563 },
4564 {
4565 containedLibs: []string{"image.apex/lib/mylib.so"},
4566 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4567 compileMultiLibProp: `compile_multilib: "32",`,
4568 },
4569 }
4570 for _, testCase := range testCases {
4571 ctx := testApex(t, fmt.Sprintf(`
4572 apex {
4573 name: "myapex",
4574 key: "myapex.key",
4575 %s
4576 native_shared_libs: ["mylib"],
4577 updatable: false,
4578 }
4579 apex_key {
4580 name: "myapex.key",
4581 public_key: "testkey.avbpubkey",
4582 private_key: "testkey.pem",
4583 }
4584 cc_library {
4585 name: "mylib",
4586 srcs: ["mylib.cpp"],
4587 apex_available: [
4588 "//apex_available:platform",
4589 "myapex",
4590 ],
4591 }
4592 `, testCase.compileMultiLibProp),
4593 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004594 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004595 apexRule := module.Rule("apexRule")
4596 copyCmds := apexRule.Args["copy_commands"]
4597 for _, containedLib := range testCase.containedLibs {
4598 ensureContains(t, copyCmds, containedLib)
4599 }
4600 for _, notContainedLib := range testCase.notContainedLibs {
4601 ensureNotContains(t, copyCmds, notContainedLib)
4602 }
4603 }
4604}
4605
Alex Light0851b882019-02-07 13:20:53 -08004606func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004607 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004612 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004613 }
4614
4615 apex_key {
4616 name: "myapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
4620
4621 cc_library {
4622 name: "mylib_common",
4623 srcs: ["mylib.cpp"],
4624 system_shared_libs: [],
4625 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004626 apex_available: [
4627 "//apex_available:platform",
4628 "myapex",
4629 ],
Alex Light0851b882019-02-07 13:20:53 -08004630 }
4631 `)
4632
Jooyung Hana0503a52023-08-23 13:12:50 +09004633 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004634 apexRule := module.Rule("apexRule")
4635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4638 t.Log("Apex was a test apex!")
4639 t.Fail()
4640 }
4641 // Ensure that main rule creates an output
4642 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4643
4644 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004645 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004646
4647 // Ensure that both direct and indirect deps are copied into apex
4648 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4649
Colin Cross7113d202019-11-20 16:39:12 -08004650 // Ensure that the platform variant ends with _shared
4651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004652
Colin Cross56a83212020-09-15 18:30:11 -07004653 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004654 t.Log("Found mylib_common not in any apex!")
4655 t.Fail()
4656 }
4657}
4658
4659func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004660 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004661 apex_test {
4662 name: "myapex",
4663 key: "myapex.key",
4664 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004665 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004666 }
4667
4668 apex_key {
4669 name: "myapex.key",
4670 public_key: "testkey.avbpubkey",
4671 private_key: "testkey.pem",
4672 }
4673
4674 cc_library {
4675 name: "mylib_common_test",
4676 srcs: ["mylib.cpp"],
4677 system_shared_libs: [],
4678 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004679 // TODO: remove //apex_available:platform
4680 apex_available: [
4681 "//apex_available:platform",
4682 "myapex",
4683 ],
Alex Light0851b882019-02-07 13:20:53 -08004684 }
4685 `)
4686
Jooyung Hana0503a52023-08-23 13:12:50 +09004687 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004688 apexRule := module.Rule("apexRule")
4689 copyCmds := apexRule.Args["copy_commands"]
4690
4691 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4692 t.Log("Apex was not a test apex!")
4693 t.Fail()
4694 }
4695 // Ensure that main rule creates an output
4696 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4697
4698 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004699 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004700
4701 // Ensure that both direct and indirect deps are copied into apex
4702 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4703
Colin Cross7113d202019-11-20 16:39:12 -08004704 // Ensure that the platform variant ends with _shared
4705 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004706}
4707
Alex Light9670d332019-01-29 18:07:33 -08004708func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004709 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004713 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004714 multilib: {
4715 first: {
4716 native_shared_libs: ["mylib_common"],
4717 }
4718 },
4719 target: {
4720 android: {
4721 multilib: {
4722 first: {
4723 native_shared_libs: ["mylib"],
4724 }
4725 }
4726 },
4727 host: {
4728 multilib: {
4729 first: {
4730 native_shared_libs: ["mylib2"],
4731 }
4732 }
4733 }
4734 }
4735 }
4736
4737 apex_key {
4738 name: "myapex.key",
4739 public_key: "testkey.avbpubkey",
4740 private_key: "testkey.pem",
4741 }
4742
4743 cc_library {
4744 name: "mylib",
4745 srcs: ["mylib.cpp"],
4746 system_shared_libs: [],
4747 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004748 // TODO: remove //apex_available:platform
4749 apex_available: [
4750 "//apex_available:platform",
4751 "myapex",
4752 ],
Alex Light9670d332019-01-29 18:07:33 -08004753 }
4754
4755 cc_library {
4756 name: "mylib_common",
4757 srcs: ["mylib.cpp"],
4758 system_shared_libs: [],
4759 stl: "none",
4760 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004761 // TODO: remove //apex_available:platform
4762 apex_available: [
4763 "//apex_available:platform",
4764 "myapex",
4765 ],
Alex Light9670d332019-01-29 18:07:33 -08004766 }
4767
4768 cc_library {
4769 name: "mylib2",
4770 srcs: ["mylib.cpp"],
4771 system_shared_libs: [],
4772 stl: "none",
4773 compile_multilib: "first",
4774 }
4775 `)
4776
Jooyung Hana0503a52023-08-23 13:12:50 +09004777 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004778 copyCmds := apexRule.Args["copy_commands"]
4779
4780 // Ensure that main rule creates an output
4781 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4782
4783 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004784 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4785 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4786 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004787
4788 // Ensure that both direct and indirect deps are copied into apex
4789 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4790 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4791 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4792
Colin Cross7113d202019-11-20 16:39:12 -08004793 // Ensure that the platform variant ends with _shared
4794 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4795 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4796 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004797}
Jiyong Park04480cf2019-02-06 00:16:29 +09004798
Jiyong Park59140302020-12-14 18:44:04 +09004799func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004800 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004801 apex {
4802 name: "myapex",
4803 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004804 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004805 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004806 arch: {
4807 arm64: {
4808 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004809 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004810 },
4811 x86_64: {
4812 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004813 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004814 },
4815 }
4816 }
4817
4818 apex_key {
4819 name: "myapex.key",
4820 public_key: "testkey.avbpubkey",
4821 private_key: "testkey.pem",
4822 }
4823
4824 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004825 name: "mylib.generic",
4826 srcs: ["mylib.cpp"],
4827 system_shared_libs: [],
4828 stl: "none",
4829 // TODO: remove //apex_available:platform
4830 apex_available: [
4831 "//apex_available:platform",
4832 "myapex",
4833 ],
4834 }
4835
4836 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004837 name: "mylib.arm64",
4838 srcs: ["mylib.cpp"],
4839 system_shared_libs: [],
4840 stl: "none",
4841 // TODO: remove //apex_available:platform
4842 apex_available: [
4843 "//apex_available:platform",
4844 "myapex",
4845 ],
4846 }
4847
4848 cc_library {
4849 name: "mylib.x64",
4850 srcs: ["mylib.cpp"],
4851 system_shared_libs: [],
4852 stl: "none",
4853 // TODO: remove //apex_available:platform
4854 apex_available: [
4855 "//apex_available:platform",
4856 "myapex",
4857 ],
4858 }
4859 `)
4860
Jooyung Hana0503a52023-08-23 13:12:50 +09004861 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004862 copyCmds := apexRule.Args["copy_commands"]
4863
4864 // Ensure that apex variant is created for the direct dep
4865 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004866 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004867 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4868
4869 // Ensure that both direct and indirect deps are copied into apex
4870 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4871 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4872}
4873
Jiyong Park04480cf2019-02-06 00:16:29 +09004874func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004875 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004876 apex {
4877 name: "myapex",
4878 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004879 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004880 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004881 }
4882
4883 apex_key {
4884 name: "myapex.key",
4885 public_key: "testkey.avbpubkey",
4886 private_key: "testkey.pem",
4887 }
4888
4889 sh_binary {
4890 name: "myscript",
4891 src: "mylib.cpp",
4892 filename: "myscript.sh",
4893 sub_dir: "script",
4894 }
4895 `)
4896
Jooyung Hana0503a52023-08-23 13:12:50 +09004897 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004898 copyCmds := apexRule.Args["copy_commands"]
4899
4900 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4901}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004902
Jooyung Han91df2082019-11-20 01:49:42 +09004903func TestApexInVariousPartition(t *testing.T) {
4904 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004905 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004906 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004907 {"", "system"},
4908 {"product_specific: true", "product"},
4909 {"soc_specific: true", "vendor"},
4910 {"proprietary: true", "vendor"},
4911 {"vendor: true", "vendor"},
4912 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004913 }
4914 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004915 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004916 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004917 apex {
4918 name: "myapex",
4919 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004920 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004921 `+tc.propName+`
4922 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004923
Jooyung Han91df2082019-11-20 01:49:42 +09004924 apex_key {
4925 name: "myapex.key",
4926 public_key: "testkey.avbpubkey",
4927 private_key: "testkey.pem",
4928 }
4929 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004930
Jooyung Hana0503a52023-08-23 13:12:50 +09004931 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004932 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004933 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004934 if actual != expected {
4935 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4936 }
Jooyung Han91df2082019-11-20 01:49:42 +09004937 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004938 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004939}
Jiyong Park67882562019-03-21 01:11:21 +09004940
Jooyung Han580eb4f2020-06-24 19:33:06 +09004941func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004942 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004943 apex {
4944 name: "myapex",
4945 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004946 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004947 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004948
Jooyung Han580eb4f2020-06-24 19:33:06 +09004949 apex_key {
4950 name: "myapex.key",
4951 public_key: "testkey.avbpubkey",
4952 private_key: "testkey.pem",
4953 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004954 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004955 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004956 rule := module.Output("file_contexts")
4957 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4958}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004959
Jooyung Han580eb4f2020-06-24 19:33:06 +09004960func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004961 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004962 apex {
4963 name: "myapex",
4964 key: "myapex.key",
4965 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004966 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004968
Jooyung Han580eb4f2020-06-24 19:33:06 +09004969 apex_key {
4970 name: "myapex.key",
4971 public_key: "testkey.avbpubkey",
4972 private_key: "testkey.pem",
4973 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004974 `, withFiles(map[string][]byte{
4975 "my_own_file_contexts": nil,
4976 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004977}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004978
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004980 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004981 apex {
4982 name: "myapex",
4983 key: "myapex.key",
4984 product_specific: true,
4985 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004986 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004987 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004988
Jooyung Han580eb4f2020-06-24 19:33:06 +09004989 apex_key {
4990 name: "myapex.key",
4991 public_key: "testkey.avbpubkey",
4992 private_key: "testkey.pem",
4993 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004994 `)
4995
Colin Cross1c460562021-02-16 17:55:47 -08004996 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004997 apex {
4998 name: "myapex",
4999 key: "myapex.key",
5000 product_specific: true,
5001 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005002 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005003 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005004
Jooyung Han580eb4f2020-06-24 19:33:06 +09005005 apex_key {
5006 name: "myapex.key",
5007 public_key: "testkey.avbpubkey",
5008 private_key: "testkey.pem",
5009 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005010 `, withFiles(map[string][]byte{
5011 "product_specific_file_contexts": nil,
5012 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005013 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005014 rule := module.Output("file_contexts")
5015 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5016}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005017
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005019 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005020 apex {
5021 name: "myapex",
5022 key: "myapex.key",
5023 product_specific: true,
5024 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005025 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005027
Jooyung Han580eb4f2020-06-24 19:33:06 +09005028 apex_key {
5029 name: "myapex.key",
5030 public_key: "testkey.avbpubkey",
5031 private_key: "testkey.pem",
5032 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005033
Jooyung Han580eb4f2020-06-24 19:33:06 +09005034 filegroup {
5035 name: "my-file-contexts",
5036 srcs: ["product_specific_file_contexts"],
5037 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005038 `, withFiles(map[string][]byte{
5039 "product_specific_file_contexts": nil,
5040 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005041 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005042 rule := module.Output("file_contexts")
5043 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044}
5045
Jiyong Park67882562019-03-21 01:11:21 +09005046func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005047 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005048 apex_key {
5049 name: "myapex.key",
5050 public_key: ":my.avbpubkey",
5051 private_key: ":my.pem",
5052 product_specific: true,
5053 }
5054
5055 filegroup {
5056 name: "my.avbpubkey",
5057 srcs: ["testkey2.avbpubkey"],
5058 }
5059
5060 filegroup {
5061 name: "my.pem",
5062 srcs: ["testkey2.pem"],
5063 }
5064 `)
5065
5066 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5067 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005068 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005069 if actual_pubkey != expected_pubkey {
5070 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5071 }
5072 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005073 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005074 if actual_privkey != expected_privkey {
5075 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5076 }
5077}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005078
5079func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005080 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005081 prebuilt_apex {
5082 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005083 arch: {
5084 arm64: {
5085 src: "myapex-arm64.apex",
5086 },
5087 arm: {
5088 src: "myapex-arm.apex",
5089 },
5090 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005091 }
5092 `)
5093
Wei Li340ee8e2022-03-18 17:33:24 -07005094 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5095 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005096
Jiyong Parkc95714e2019-03-29 14:23:10 +09005097 expectedInput := "myapex-arm64.apex"
5098 if prebuilt.inputApex.String() != expectedInput {
5099 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5100 }
Wei Li340ee8e2022-03-18 17:33:24 -07005101 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5102 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5103 rule := testingModule.Rule("genProvenanceMetaData")
5104 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5105 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5106 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5107 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005108
5109 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5110 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005111}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005112
Paul Duffinc0609c62021-03-01 17:27:16 +00005113func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005114 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005115 prebuilt_apex {
5116 name: "myapex",
5117 }
5118 `)
5119}
5120
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005121func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005122 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005123 prebuilt_apex {
5124 name: "myapex",
5125 src: "myapex-arm.apex",
5126 filename: "notmyapex.apex",
5127 }
5128 `)
5129
Wei Li340ee8e2022-03-18 17:33:24 -07005130 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5131 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005132
5133 expected := "notmyapex.apex"
5134 if p.installFilename != expected {
5135 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5136 }
Wei Li340ee8e2022-03-18 17:33:24 -07005137 rule := testingModule.Rule("genProvenanceMetaData")
5138 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5139 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5140 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5141 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005142}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005143
Samiul Islam7c02e262021-09-08 17:48:28 +01005144func TestApexSetFilenameOverride(t *testing.T) {
5145 testApex(t, `
5146 apex_set {
5147 name: "com.company.android.myapex",
5148 apex_name: "com.android.myapex",
5149 set: "company-myapex.apks",
5150 filename: "com.company.android.myapex.apex"
5151 }
5152 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5153
5154 testApex(t, `
5155 apex_set {
5156 name: "com.company.android.myapex",
5157 apex_name: "com.android.myapex",
5158 set: "company-myapex.apks",
5159 filename: "com.company.android.myapex.capex"
5160 }
5161 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5162
5163 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5164 apex_set {
5165 name: "com.company.android.myapex",
5166 apex_name: "com.android.myapex",
5167 set: "company-myapex.apks",
5168 filename: "some-random-suffix"
5169 }
5170 `)
5171}
5172
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005173func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005174 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005175 prebuilt_apex {
5176 name: "myapex.prebuilt",
5177 src: "myapex-arm.apex",
5178 overrides: [
5179 "myapex",
5180 ],
5181 }
5182 `)
5183
Wei Li340ee8e2022-03-18 17:33:24 -07005184 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5185 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005186
5187 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005188 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005189 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005190 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005191 }
Wei Li340ee8e2022-03-18 17:33:24 -07005192 rule := testingModule.Rule("genProvenanceMetaData")
5193 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5194 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5195 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5196 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005197}
5198
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005199func TestPrebuiltApexName(t *testing.T) {
5200 testApex(t, `
5201 prebuilt_apex {
5202 name: "com.company.android.myapex",
5203 apex_name: "com.android.myapex",
5204 src: "company-myapex-arm.apex",
5205 }
5206 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5207
5208 testApex(t, `
5209 apex_set {
5210 name: "com.company.android.myapex",
5211 apex_name: "com.android.myapex",
5212 set: "company-myapex.apks",
5213 }
5214 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5215}
5216
5217func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5218 _ = android.GroupFixturePreparers(
5219 java.PrepareForTestWithJavaDefaultModules,
5220 PrepareForTestWithApexBuildComponents,
5221 android.FixtureWithRootAndroidBp(`
5222 platform_bootclasspath {
5223 name: "platform-bootclasspath",
5224 fragments: [
5225 {
5226 apex: "com.android.art",
5227 module: "art-bootclasspath-fragment",
5228 },
5229 ],
5230 }
5231
5232 prebuilt_apex {
5233 name: "com.company.android.art",
5234 apex_name: "com.android.art",
5235 src: "com.company.android.art-arm.apex",
5236 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5237 }
5238
5239 prebuilt_bootclasspath_fragment {
5240 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005241 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005242 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005243 hidden_api: {
5244 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5245 metadata: "my-bootclasspath-fragment/metadata.csv",
5246 index: "my-bootclasspath-fragment/index.csv",
5247 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5248 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5249 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005250 }
5251
5252 java_import {
5253 name: "core-oj",
5254 jars: ["prebuilt.jar"],
5255 }
5256 `),
5257 ).RunTest(t)
5258}
5259
Paul Duffin092153d2021-01-26 11:42:39 +00005260// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5261// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005262func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005263 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005264
Paul Duffin89886cb2021-02-05 16:44:03 +00005265 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005266 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005267 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005268 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005269 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005270 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005271 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5272 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5273 android.NormalizePathForTesting(dexJarBuildPath))
5274 }
5275
5276 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005277 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005278 // Make sure the import has been given the correct path to the dex jar.
5279 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5280 dexJarBuildPath := p.DexJarInstallPath()
5281 stem := android.RemoveOptionalPrebuiltPrefix(name)
5282 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5283 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5284 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005285 }
5286
Paul Duffin39853512021-02-26 11:09:39 +00005287 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005288 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005289 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005290 android.AssertArrayString(t, "Check if there is no source variant",
5291 []string{"android_common"},
5292 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005293 }
5294
5295 t.Run("prebuilt only", func(t *testing.T) {
5296 bp := `
5297 prebuilt_apex {
5298 name: "myapex",
5299 arch: {
5300 arm64: {
5301 src: "myapex-arm64.apex",
5302 },
5303 arm: {
5304 src: "myapex-arm.apex",
5305 },
5306 },
Paul Duffin39853512021-02-26 11:09:39 +00005307 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005308 }
5309
5310 java_import {
5311 name: "libfoo",
5312 jars: ["libfoo.jar"],
5313 }
Paul Duffin39853512021-02-26 11:09:39 +00005314
5315 java_sdk_library_import {
5316 name: "libbar",
5317 public: {
5318 jars: ["libbar.jar"],
5319 },
5320 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005321 `
5322
5323 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5324 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5325
Martin Stjernholm44825602021-09-17 01:44:12 +01005326 deapexerName := deapexerModuleName("myapex")
5327 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5328
Paul Duffinf6932af2021-02-26 18:21:56 +00005329 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005330 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005331 rule := deapexer.Rule("deapexer")
5332 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5333 t.Errorf("expected: %q, found: %q", expected, actual)
5334 }
5335
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005336 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005337 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005338 rule = prebuiltApex.Rule("android/soong/android.Cp")
5339 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5340 t.Errorf("expected: %q, found: %q", expected, actual)
5341 }
5342
Paul Duffin89886cb2021-02-05 16:44:03 +00005343 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005344 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005345
5346 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005347 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005348 })
5349
5350 t.Run("prebuilt with source preferred", func(t *testing.T) {
5351
5352 bp := `
5353 prebuilt_apex {
5354 name: "myapex",
5355 arch: {
5356 arm64: {
5357 src: "myapex-arm64.apex",
5358 },
5359 arm: {
5360 src: "myapex-arm.apex",
5361 },
5362 },
Paul Duffin39853512021-02-26 11:09:39 +00005363 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005364 }
5365
5366 java_import {
5367 name: "libfoo",
5368 jars: ["libfoo.jar"],
5369 }
5370
5371 java_library {
5372 name: "libfoo",
5373 }
Paul Duffin39853512021-02-26 11:09:39 +00005374
5375 java_sdk_library_import {
5376 name: "libbar",
5377 public: {
5378 jars: ["libbar.jar"],
5379 },
5380 }
5381
5382 java_sdk_library {
5383 name: "libbar",
5384 srcs: ["foo/bar/MyClass.java"],
5385 unsafe_ignore_missing_latest_api: true,
5386 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005387 `
5388
5389 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5390 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5391
Paul Duffin89886cb2021-02-05 16:44:03 +00005392 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005393 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005394 ensureNoSourceVariant(t, ctx, "libfoo")
5395
5396 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005397 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005398 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005399 })
5400
5401 t.Run("prebuilt preferred with source", func(t *testing.T) {
5402 bp := `
5403 prebuilt_apex {
5404 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005405 arch: {
5406 arm64: {
5407 src: "myapex-arm64.apex",
5408 },
5409 arm: {
5410 src: "myapex-arm.apex",
5411 },
5412 },
Paul Duffin39853512021-02-26 11:09:39 +00005413 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005414 }
5415
5416 java_import {
5417 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005418 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005419 jars: ["libfoo.jar"],
5420 }
5421
5422 java_library {
5423 name: "libfoo",
5424 }
Paul Duffin39853512021-02-26 11:09:39 +00005425
5426 java_sdk_library_import {
5427 name: "libbar",
5428 prefer: true,
5429 public: {
5430 jars: ["libbar.jar"],
5431 },
5432 }
5433
5434 java_sdk_library {
5435 name: "libbar",
5436 srcs: ["foo/bar/MyClass.java"],
5437 unsafe_ignore_missing_latest_api: true,
5438 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005439 `
5440
5441 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5442 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5443
Paul Duffin89886cb2021-02-05 16:44:03 +00005444 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005445 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005446 ensureNoSourceVariant(t, ctx, "libfoo")
5447
5448 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005449 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005450 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005451 })
5452}
5453
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005454func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005455 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005456 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005457 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5458 // is disabled.
5459 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5460 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005461
Paul Duffin37856732021-02-26 14:24:15 +00005462 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5463 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005464 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005465 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005466 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005467 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005468 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 foundLibfooJar = true
5470 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005471 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005472 }
5473 }
5474 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005475 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 +00005476 }
5477 }
5478
Paul Duffin40a3f652021-07-19 13:11:24 +01005479 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005480 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005481 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005482 var rule android.TestingBuildParams
5483
5484 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5485 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005486 }
5487
Paul Duffin40a3f652021-07-19 13:11:24 +01005488 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5489 t.Helper()
5490 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5491 var rule android.TestingBuildParams
5492
5493 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5494 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5495 }
5496
Paul Duffin89f570a2021-06-16 01:42:33 +01005497 fragment := java.ApexVariantReference{
5498 Apex: proptools.StringPtr("myapex"),
5499 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5500 }
5501
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005502 t.Run("prebuilt only", func(t *testing.T) {
5503 bp := `
5504 prebuilt_apex {
5505 name: "myapex",
5506 arch: {
5507 arm64: {
5508 src: "myapex-arm64.apex",
5509 },
5510 arm: {
5511 src: "myapex-arm.apex",
5512 },
5513 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005514 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5515 }
5516
5517 prebuilt_bootclasspath_fragment {
5518 name: "my-bootclasspath-fragment",
5519 contents: ["libfoo", "libbar"],
5520 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005521 hidden_api: {
5522 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5523 metadata: "my-bootclasspath-fragment/metadata.csv",
5524 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005525 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5526 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5527 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005528 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005529 }
5530
5531 java_import {
5532 name: "libfoo",
5533 jars: ["libfoo.jar"],
5534 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005535 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005536 }
Paul Duffin37856732021-02-26 14:24:15 +00005537
5538 java_sdk_library_import {
5539 name: "libbar",
5540 public: {
5541 jars: ["libbar.jar"],
5542 },
5543 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005544 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005545 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005546 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 `
5548
Paul Duffin89f570a2021-06-16 01:42:33 +01005549 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005550 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5551 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005552
Paul Duffin537ea3d2021-05-14 10:38:00 +01005553 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005554 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005555 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005556 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005557 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005558 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005559 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005560 })
5561
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005562 t.Run("apex_set only", func(t *testing.T) {
5563 bp := `
5564 apex_set {
5565 name: "myapex",
5566 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005567 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005568 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005569 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5570 }
5571
5572 java_import {
5573 name: "myjavalib",
5574 jars: ["myjavalib.jar"],
5575 apex_available: ["myapex"],
5576 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005577 }
5578
5579 prebuilt_bootclasspath_fragment {
5580 name: "my-bootclasspath-fragment",
5581 contents: ["libfoo", "libbar"],
5582 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005583 hidden_api: {
5584 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5585 metadata: "my-bootclasspath-fragment/metadata.csv",
5586 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005587 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5588 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5589 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005590 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005591 }
5592
Liz Kammer2dc72442023-04-20 10:10:48 -04005593 prebuilt_systemserverclasspath_fragment {
5594 name: "my-systemserverclasspath-fragment",
5595 contents: ["libbaz"],
5596 apex_available: ["myapex"],
5597 }
5598
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005599 java_import {
5600 name: "libfoo",
5601 jars: ["libfoo.jar"],
5602 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005603 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005604 }
5605
5606 java_sdk_library_import {
5607 name: "libbar",
5608 public: {
5609 jars: ["libbar.jar"],
5610 },
5611 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005612 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005613 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005614 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005615
5616 java_sdk_library_import {
5617 name: "libbaz",
5618 public: {
5619 jars: ["libbaz.jar"],
5620 },
5621 apex_available: ["myapex"],
5622 shared_library: false,
5623 permitted_packages: ["baz"],
5624 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005625 `
5626
Paul Duffin89f570a2021-06-16 01:42:33 +01005627 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005628 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5629 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5630
Paul Duffin537ea3d2021-05-14 10:38:00 +01005631 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005632 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005633 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005634 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005635 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005636 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005637 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005638
5639 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5640
5641 overrideNames := []string{
5642 "",
5643 "myjavalib.myapex",
5644 "libfoo.myapex",
5645 "libbar.myapex",
5646 "libbaz.myapex",
5647 }
5648 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5649 for i, e := range mkEntries {
5650 g := e.OverrideName
5651 if w := overrideNames[i]; w != g {
5652 t.Errorf("Expected override name %q, got %q", w, g)
5653 }
5654 }
5655
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005656 })
5657
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005658 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5659 bp := `
5660 prebuilt_apex {
5661 name: "myapex",
5662 arch: {
5663 arm64: {
5664 src: "myapex-arm64.apex",
5665 },
5666 arm: {
5667 src: "myapex-arm.apex",
5668 },
5669 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005670 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5671 }
5672
5673 prebuilt_bootclasspath_fragment {
5674 name: "my-bootclasspath-fragment",
5675 contents: ["libfoo", "libbar"],
5676 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005677 hidden_api: {
5678 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5679 metadata: "my-bootclasspath-fragment/metadata.csv",
5680 index: "my-bootclasspath-fragment/index.csv",
5681 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5682 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5683 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005684 }
5685
5686 java_import {
5687 name: "libfoo",
5688 jars: ["libfoo.jar"],
5689 apex_available: ["myapex"],
5690 }
5691
5692 java_library {
5693 name: "libfoo",
5694 srcs: ["foo/bar/MyClass.java"],
5695 apex_available: ["myapex"],
5696 }
Paul Duffin37856732021-02-26 14:24:15 +00005697
5698 java_sdk_library_import {
5699 name: "libbar",
5700 public: {
5701 jars: ["libbar.jar"],
5702 },
5703 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005704 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005705 }
5706
5707 java_sdk_library {
5708 name: "libbar",
5709 srcs: ["foo/bar/MyClass.java"],
5710 unsafe_ignore_missing_latest_api: true,
5711 apex_available: ["myapex"],
5712 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005713 `
5714
5715 // In this test the source (java_library) libfoo is active since the
5716 // prebuilt (java_import) defaults to prefer:false. However the
5717 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5718 // find the dex boot jar in it. We either need to disable the source libfoo
5719 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005720 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005721 // dexbootjar check is skipped if AllowMissingDependencies is true
5722 preparerAllowMissingDeps := android.GroupFixturePreparers(
5723 preparer,
5724 android.PrepareForTestWithAllowMissingDependencies,
5725 )
5726 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005727 })
5728
5729 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5730 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005731 apex {
5732 name: "myapex",
5733 key: "myapex.key",
5734 updatable: false,
5735 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5736 }
5737
5738 apex_key {
5739 name: "myapex.key",
5740 public_key: "testkey.avbpubkey",
5741 private_key: "testkey.pem",
5742 }
5743
5744 bootclasspath_fragment {
5745 name: "my-bootclasspath-fragment",
5746 contents: ["libfoo", "libbar"],
5747 apex_available: ["myapex"],
5748 hidden_api: {
5749 split_packages: ["*"],
5750 },
5751 }
5752
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005753 prebuilt_apex {
5754 name: "myapex",
5755 arch: {
5756 arm64: {
5757 src: "myapex-arm64.apex",
5758 },
5759 arm: {
5760 src: "myapex-arm.apex",
5761 },
5762 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005763 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5764 }
5765
5766 prebuilt_bootclasspath_fragment {
5767 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005768 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005769 contents: ["libfoo", "libbar"],
5770 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005771 hidden_api: {
5772 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5773 metadata: "my-bootclasspath-fragment/metadata.csv",
5774 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005775 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5776 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5777 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005778 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005779 }
5780
5781 java_import {
5782 name: "libfoo",
5783 prefer: true,
5784 jars: ["libfoo.jar"],
5785 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005786 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005787 }
5788
5789 java_library {
5790 name: "libfoo",
5791 srcs: ["foo/bar/MyClass.java"],
5792 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005793 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005794 }
Paul Duffin37856732021-02-26 14:24:15 +00005795
5796 java_sdk_library_import {
5797 name: "libbar",
5798 prefer: true,
5799 public: {
5800 jars: ["libbar.jar"],
5801 },
5802 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005803 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005804 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005805 }
5806
5807 java_sdk_library {
5808 name: "libbar",
5809 srcs: ["foo/bar/MyClass.java"],
5810 unsafe_ignore_missing_latest_api: true,
5811 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005812 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005813 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005814 `
5815
Paul Duffin89f570a2021-06-16 01:42:33 +01005816 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005817 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5818 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005819
Paul Duffin537ea3d2021-05-14 10:38:00 +01005820 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005821 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005822 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005823 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005824 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005825 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005826 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005827 })
5828
5829 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5830 bp := `
5831 apex {
5832 name: "myapex",
5833 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005834 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005835 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005836 }
5837
5838 apex_key {
5839 name: "myapex.key",
5840 public_key: "testkey.avbpubkey",
5841 private_key: "testkey.pem",
5842 }
5843
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005844 bootclasspath_fragment {
5845 name: "my-bootclasspath-fragment",
5846 contents: ["libfoo", "libbar"],
5847 apex_available: ["myapex"],
5848 hidden_api: {
5849 split_packages: ["*"],
5850 },
5851 }
5852
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005853 prebuilt_apex {
5854 name: "myapex",
5855 arch: {
5856 arm64: {
5857 src: "myapex-arm64.apex",
5858 },
5859 arm: {
5860 src: "myapex-arm.apex",
5861 },
5862 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005863 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5864 }
5865
5866 prebuilt_bootclasspath_fragment {
5867 name: "my-bootclasspath-fragment",
5868 contents: ["libfoo", "libbar"],
5869 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005870 hidden_api: {
5871 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5872 metadata: "my-bootclasspath-fragment/metadata.csv",
5873 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005874 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5875 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5876 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005877 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005878 }
5879
5880 java_import {
5881 name: "libfoo",
5882 jars: ["libfoo.jar"],
5883 apex_available: ["myapex"],
5884 }
5885
5886 java_library {
5887 name: "libfoo",
5888 srcs: ["foo/bar/MyClass.java"],
5889 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005890 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005891 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005892 }
Paul Duffin37856732021-02-26 14:24:15 +00005893
5894 java_sdk_library_import {
5895 name: "libbar",
5896 public: {
5897 jars: ["libbar.jar"],
5898 },
5899 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005900 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005901 }
5902
5903 java_sdk_library {
5904 name: "libbar",
5905 srcs: ["foo/bar/MyClass.java"],
5906 unsafe_ignore_missing_latest_api: true,
5907 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005908 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005909 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005910 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005911 `
5912
Paul Duffin89f570a2021-06-16 01:42:33 +01005913 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005914 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5915 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005916
Paul Duffin537ea3d2021-05-14 10:38:00 +01005917 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005918 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005919 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5920 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005921 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5922 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005923 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005924 })
5925
5926 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5927 bp := `
5928 apex {
5929 name: "myapex",
5930 enabled: false,
5931 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005932 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005933 }
5934
5935 apex_key {
5936 name: "myapex.key",
5937 public_key: "testkey.avbpubkey",
5938 private_key: "testkey.pem",
5939 }
5940
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005941 bootclasspath_fragment {
5942 name: "my-bootclasspath-fragment",
5943 enabled: false,
5944 contents: ["libfoo", "libbar"],
5945 apex_available: ["myapex"],
5946 hidden_api: {
5947 split_packages: ["*"],
5948 },
5949 }
5950
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005951 prebuilt_apex {
5952 name: "myapex",
5953 arch: {
5954 arm64: {
5955 src: "myapex-arm64.apex",
5956 },
5957 arm: {
5958 src: "myapex-arm.apex",
5959 },
5960 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005961 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5962 }
5963
5964 prebuilt_bootclasspath_fragment {
5965 name: "my-bootclasspath-fragment",
5966 contents: ["libfoo", "libbar"],
5967 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005968 hidden_api: {
5969 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5970 metadata: "my-bootclasspath-fragment/metadata.csv",
5971 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005972 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5973 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5974 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005975 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005976 }
5977
5978 java_import {
5979 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005980 jars: ["libfoo.jar"],
5981 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005982 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005983 }
5984
5985 java_library {
5986 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005987 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005988 srcs: ["foo/bar/MyClass.java"],
5989 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005990 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005991 }
Paul Duffin37856732021-02-26 14:24:15 +00005992
5993 java_sdk_library_import {
5994 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005995 public: {
5996 jars: ["libbar.jar"],
5997 },
5998 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005999 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006000 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006001 }
6002
6003 java_sdk_library {
6004 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006005 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006006 srcs: ["foo/bar/MyClass.java"],
6007 unsafe_ignore_missing_latest_api: true,
6008 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006009 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006010 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006011 `
6012
Paul Duffin89f570a2021-06-16 01:42:33 +01006013 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006014 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6015 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006016
Paul Duffin537ea3d2021-05-14 10:38:00 +01006017 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006018 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006019 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006020 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006021 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006022 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006023 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006024 })
6025}
6026
Roland Levillain630846d2019-06-26 12:48:34 +01006027func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006028 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006029 apex_test {
6030 name: "myapex",
6031 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006032 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006033 tests: [
6034 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006035 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006036 ],
6037 }
6038
6039 apex_key {
6040 name: "myapex.key",
6041 public_key: "testkey.avbpubkey",
6042 private_key: "testkey.pem",
6043 }
6044
Liz Kammer1c14a212020-05-12 15:26:55 -07006045 filegroup {
6046 name: "fg",
6047 srcs: [
6048 "baz",
6049 "bar/baz"
6050 ],
6051 }
6052
Roland Levillain630846d2019-06-26 12:48:34 +01006053 cc_test {
6054 name: "mytest",
6055 gtest: false,
6056 srcs: ["mytest.cpp"],
6057 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006058 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006059 system_shared_libs: [],
6060 static_executable: true,
6061 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006062 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006063 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006064
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006065 cc_library {
6066 name: "mylib",
6067 srcs: ["mylib.cpp"],
6068 system_shared_libs: [],
6069 stl: "none",
6070 }
6071
Liz Kammer5bd365f2020-05-27 15:15:11 -07006072 filegroup {
6073 name: "fg2",
6074 srcs: [
6075 "testdata/baz"
6076 ],
6077 }
6078
Roland Levillain9b5fde92019-06-28 15:41:19 +01006079 cc_test {
6080 name: "mytests",
6081 gtest: false,
6082 srcs: [
6083 "mytest1.cpp",
6084 "mytest2.cpp",
6085 "mytest3.cpp",
6086 ],
6087 test_per_src: true,
6088 relative_install_path: "test",
6089 system_shared_libs: [],
6090 static_executable: true,
6091 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006092 data: [
6093 ":fg",
6094 ":fg2",
6095 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006096 }
Roland Levillain630846d2019-06-26 12:48:34 +01006097 `)
6098
Jooyung Hana0503a52023-08-23 13:12:50 +09006099 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006100 copyCmds := apexRule.Args["copy_commands"]
6101
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006102 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006103 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006104 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006105
Liz Kammer1c14a212020-05-12 15:26:55 -07006106 //Ensure that test data are copied into apex.
6107 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6108 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6109
Roland Levillain9b5fde92019-06-28 15:41:19 +01006110 // Ensure that test deps built with `test_per_src` are copied into apex.
6111 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6112 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6113 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006114
6115 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006116 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006117 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006118 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006119 prefix := "TARGET_"
6120 var builder strings.Builder
6121 data.Custom(&builder, name, prefix, "", data)
6122 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006123 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6124 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6125 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6126 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006127 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006128}
6129
Jooyung Hand48f3c32019-08-23 11:18:57 +09006130func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6131 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6132 apex {
6133 name: "myapex",
6134 key: "myapex.key",
6135 native_shared_libs: ["libfoo"],
6136 }
6137
6138 apex_key {
6139 name: "myapex.key",
6140 public_key: "testkey.avbpubkey",
6141 private_key: "testkey.pem",
6142 }
6143
6144 cc_library {
6145 name: "libfoo",
6146 stl: "none",
6147 system_shared_libs: [],
6148 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006149 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006150 }
6151 `)
6152 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6153 apex {
6154 name: "myapex",
6155 key: "myapex.key",
6156 java_libs: ["myjar"],
6157 }
6158
6159 apex_key {
6160 name: "myapex.key",
6161 public_key: "testkey.avbpubkey",
6162 private_key: "testkey.pem",
6163 }
6164
6165 java_library {
6166 name: "myjar",
6167 srcs: ["foo/bar/MyClass.java"],
6168 sdk_version: "none",
6169 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006170 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006171 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006172 }
6173 `)
6174}
6175
Bill Peckhama41a6962021-01-11 10:58:54 -08006176func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006177 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006178 apex {
6179 name: "myapex",
6180 key: "myapex.key",
6181 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006182 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006183 }
6184
6185 apex_key {
6186 name: "myapex.key",
6187 public_key: "testkey.avbpubkey",
6188 private_key: "testkey.pem",
6189 }
6190
6191 java_import {
6192 name: "myjavaimport",
6193 apex_available: ["myapex"],
6194 jars: ["my.jar"],
6195 compile_dex: true,
6196 }
6197 `)
6198
Jooyung Hana0503a52023-08-23 13:12:50 +09006199 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006200 apexRule := module.Rule("apexRule")
6201 copyCmds := apexRule.Args["copy_commands"]
6202 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6203}
6204
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006205func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006206 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006207 apex {
6208 name: "myapex",
6209 key: "myapex.key",
6210 apps: [
6211 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006212 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006213 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006214 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006215 }
6216
6217 apex_key {
6218 name: "myapex.key",
6219 public_key: "testkey.avbpubkey",
6220 private_key: "testkey.pem",
6221 }
6222
6223 android_app {
6224 name: "AppFoo",
6225 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006226 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006227 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006228 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006229 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006230 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006231 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006232
6233 android_app {
6234 name: "AppFooPriv",
6235 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006236 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006237 system_modules: "none",
6238 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006239 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006240 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006241 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006242 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006243
6244 cc_library_shared {
6245 name: "libjni",
6246 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006247 shared_libs: ["libfoo"],
6248 stl: "none",
6249 system_shared_libs: [],
6250 apex_available: [ "myapex" ],
6251 sdk_version: "current",
6252 }
6253
6254 cc_library_shared {
6255 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006256 stl: "none",
6257 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006258 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006259 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006260 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006261 `)
6262
Jooyung Hana0503a52023-08-23 13:12:50 +09006263 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006264 apexRule := module.Rule("apexRule")
6265 copyCmds := apexRule.Args["copy_commands"]
6266
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006267 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6268 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006269 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006270
Colin Crossaede88c2020-08-11 12:17:01 -07006271 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006272 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006273 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006274 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006275 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006276 // JNI libraries including transitive deps are
6277 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006278 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006279 // ... embedded inside APK (jnilibs.zip)
6280 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6281 // ... and not directly inside the APEX
6282 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6283 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006284
6285 apexBundle := module.Module().(*apexBundle)
6286 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6287 var builder strings.Builder
6288 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6289 androidMk := builder.String()
6290 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6291 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6292 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6293 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6294 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6295 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006296}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006297
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006298func TestApexWithAppImportBuildId(t *testing.T) {
6299 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6300 for _, id := range invalidBuildIds {
6301 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6302 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6303 variables.BuildId = proptools.StringPtr(id)
6304 })
6305 testApexError(t, message, `apex {
6306 name: "myapex",
6307 key: "myapex.key",
6308 apps: ["AppFooPrebuilt"],
6309 updatable: false,
6310 }
6311
6312 apex_key {
6313 name: "myapex.key",
6314 public_key: "testkey.avbpubkey",
6315 private_key: "testkey.pem",
6316 }
6317
6318 android_app_import {
6319 name: "AppFooPrebuilt",
6320 apk: "PrebuiltAppFoo.apk",
6321 presigned: true,
6322 apex_available: ["myapex"],
6323 }
6324 `, fixture)
6325 }
6326}
6327
Dario Frenicde2a032019-10-27 00:29:22 +01006328func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006329 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006330 apex {
6331 name: "myapex",
6332 key: "myapex.key",
6333 apps: [
6334 "AppFooPrebuilt",
6335 "AppFooPrivPrebuilt",
6336 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006337 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006338 }
6339
6340 apex_key {
6341 name: "myapex.key",
6342 public_key: "testkey.avbpubkey",
6343 private_key: "testkey.pem",
6344 }
6345
6346 android_app_import {
6347 name: "AppFooPrebuilt",
6348 apk: "PrebuiltAppFoo.apk",
6349 presigned: true,
6350 dex_preopt: {
6351 enabled: false,
6352 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006353 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006354 }
6355
6356 android_app_import {
6357 name: "AppFooPrivPrebuilt",
6358 apk: "PrebuiltAppFooPriv.apk",
6359 privileged: true,
6360 presigned: true,
6361 dex_preopt: {
6362 enabled: false,
6363 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006364 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006365 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006366 }
6367 `)
6368
Jooyung Hana0503a52023-08-23 13:12:50 +09006369 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006370 apexRule := module.Rule("apexRule")
6371 copyCmds := apexRule.Args["copy_commands"]
6372
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006373 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6374 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006375}
6376
6377func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006378 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006379 apex {
6380 name: "myapex",
6381 key: "myapex.key",
6382 apps: [
6383 "AppFoo",
6384 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006385 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006386 }
6387
6388 apex_key {
6389 name: "myapex.key",
6390 public_key: "testkey.avbpubkey",
6391 private_key: "testkey.pem",
6392 }
6393
6394 android_app {
6395 name: "AppFoo",
6396 srcs: ["foo/bar/MyClass.java"],
6397 sdk_version: "none",
6398 system_modules: "none",
6399 apex_available: [ "myapex" ],
6400 }
6401
6402 android_app_import {
6403 name: "AppFoo",
6404 apk: "AppFooPrebuilt.apk",
6405 filename: "AppFooPrebuilt.apk",
6406 presigned: true,
6407 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006408 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006409 }
6410 `, withFiles(map[string][]byte{
6411 "AppFooPrebuilt.apk": nil,
6412 }))
6413
Jooyung Hana0503a52023-08-23 13:12:50 +09006414 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006415 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006416 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006417}
6418
Dario Freni6f3937c2019-12-20 22:58:03 +00006419func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006420 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006421 apex {
6422 name: "myapex",
6423 key: "myapex.key",
6424 apps: [
6425 "TesterHelpAppFoo",
6426 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006427 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006428 }
6429
6430 apex_key {
6431 name: "myapex.key",
6432 public_key: "testkey.avbpubkey",
6433 private_key: "testkey.pem",
6434 }
6435
6436 android_test_helper_app {
6437 name: "TesterHelpAppFoo",
6438 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006439 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006440 }
6441
6442 `)
6443
Jooyung Hana0503a52023-08-23 13:12:50 +09006444 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 apexRule := module.Rule("apexRule")
6446 copyCmds := apexRule.Args["copy_commands"]
6447
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006448 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006449}
6450
Jooyung Han18020ea2019-11-13 10:50:48 +09006451func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6452 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006453 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006454 apex {
6455 name: "myapex",
6456 key: "myapex.key",
6457 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006458 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006459 }
6460
6461 apex_key {
6462 name: "myapex.key",
6463 public_key: "testkey.avbpubkey",
6464 private_key: "testkey.pem",
6465 }
6466
6467 apex {
6468 name: "otherapex",
6469 key: "myapex.key",
6470 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006471 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006472 }
6473
6474 cc_defaults {
6475 name: "libfoo-defaults",
6476 apex_available: ["otherapex"],
6477 }
6478
6479 cc_library {
6480 name: "libfoo",
6481 defaults: ["libfoo-defaults"],
6482 stl: "none",
6483 system_shared_libs: [],
6484 }`)
6485}
6486
Paul Duffine52e66f2020-03-30 17:54:29 +01006487func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006488 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006489 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006490 apex {
6491 name: "myapex",
6492 key: "myapex.key",
6493 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006494 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 }
6496
6497 apex_key {
6498 name: "myapex.key",
6499 public_key: "testkey.avbpubkey",
6500 private_key: "testkey.pem",
6501 }
6502
6503 apex {
6504 name: "otherapex",
6505 key: "otherapex.key",
6506 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006507 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006508 }
6509
6510 apex_key {
6511 name: "otherapex.key",
6512 public_key: "testkey.avbpubkey",
6513 private_key: "testkey.pem",
6514 }
6515
6516 cc_library {
6517 name: "libfoo",
6518 stl: "none",
6519 system_shared_libs: [],
6520 apex_available: ["otherapex"],
6521 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006522}
Jiyong Park127b40b2019-09-30 16:04:35 +09006523
Paul Duffine52e66f2020-03-30 17:54:29 +01006524func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006525 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006526 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006527.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006528.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006529.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006530.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006531.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006532.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006533 apex {
6534 name: "myapex",
6535 key: "myapex.key",
6536 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006538 }
6539
6540 apex_key {
6541 name: "myapex.key",
6542 public_key: "testkey.avbpubkey",
6543 private_key: "testkey.pem",
6544 }
6545
Jiyong Park127b40b2019-09-30 16:04:35 +09006546 cc_library {
6547 name: "libfoo",
6548 stl: "none",
6549 shared_libs: ["libbar"],
6550 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006551 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006552 }
6553
6554 cc_library {
6555 name: "libbar",
6556 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006557 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006558 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006559 apex_available: ["myapex"],
6560 }
6561
6562 cc_library {
6563 name: "libbaz",
6564 stl: "none",
6565 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006566 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006567}
Jiyong Park127b40b2019-09-30 16:04:35 +09006568
Liz Kammer5f108fa2023-05-11 14:33:17 -04006569func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6570 testApex(t, `
6571 apex {
6572 name: "myapex",
6573 key: "myapex.key",
6574 native_shared_libs: ["libfoo"],
6575 updatable: false,
6576 }
6577
6578 apex_key {
6579 name: "myapex.key",
6580 public_key: "testkey.avbpubkey",
6581 private_key: "testkey.pem",
6582 }
6583
6584 cc_library {
6585 name: "libfoo",
6586 stl: "none",
6587 static_libs: ["libbar"],
6588 system_shared_libs: [],
6589 apex_available: ["myapex"],
6590 }
6591
6592 cc_library {
6593 name: "libbar",
6594 stl: "none",
6595 shared_libs: ["libbaz"],
6596 system_shared_libs: [],
6597 apex_available: ["myapex"],
6598 }
6599
6600 cc_library {
6601 name: "libbaz",
6602 stl: "none",
6603 system_shared_libs: [],
6604 }`)
6605
6606 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6607 apex {
6608 name: "myapex",
6609 key: "myapex.key",
6610 native_shared_libs: ["libfoo"],
6611 updatable: false,
6612 }
6613
6614 apex_key {
6615 name: "myapex.key",
6616 public_key: "testkey.avbpubkey",
6617 private_key: "testkey.pem",
6618 }
6619
6620 cc_library {
6621 name: "libfoo",
6622 stl: "none",
6623 static_libs: ["libbar"],
6624 system_shared_libs: [],
6625 apex_available: ["myapex"],
6626 }
6627
6628 cc_library {
6629 name: "libbar",
6630 stl: "none",
6631 system_shared_libs: [],
6632 }`)
6633}
6634
Paul Duffine52e66f2020-03-30 17:54:29 +01006635func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006636 testApexError(t, "\"otherapex\" is not a valid module name", `
6637 apex {
6638 name: "myapex",
6639 key: "myapex.key",
6640 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006641 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006642 }
6643
6644 apex_key {
6645 name: "myapex.key",
6646 public_key: "testkey.avbpubkey",
6647 private_key: "testkey.pem",
6648 }
6649
6650 cc_library {
6651 name: "libfoo",
6652 stl: "none",
6653 system_shared_libs: [],
6654 apex_available: ["otherapex"],
6655 }`)
6656
Paul Duffine52e66f2020-03-30 17:54:29 +01006657 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006658 apex {
6659 name: "myapex",
6660 key: "myapex.key",
6661 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006662 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006663 }
6664
6665 apex_key {
6666 name: "myapex.key",
6667 public_key: "testkey.avbpubkey",
6668 private_key: "testkey.pem",
6669 }
6670
6671 cc_library {
6672 name: "libfoo",
6673 stl: "none",
6674 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006675 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006676 apex_available: ["myapex"],
6677 }
6678
6679 cc_library {
6680 name: "libbar",
6681 stl: "none",
6682 system_shared_libs: [],
6683 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006684 }
6685
6686 cc_library {
6687 name: "libbaz",
6688 stl: "none",
6689 system_shared_libs: [],
6690 stubs: {
6691 versions: ["10", "20", "30"],
6692 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006693 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006694}
Jiyong Park127b40b2019-09-30 16:04:35 +09006695
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006696func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6697 t.Run("negative variant_version produces error", func(t *testing.T) {
6698 testApexError(t, "expected an integer between 0-9; got -1", `
6699 apex {
6700 name: "myapex",
6701 key: "myapex.key",
6702 apex_available_name: "com.android.foo",
6703 variant_version: "-1",
6704 updatable: false,
6705 }
6706 apex_key {
6707 name: "myapex.key",
6708 public_key: "testkey.avbpubkey",
6709 private_key: "testkey.pem",
6710 }
6711 `)
6712 })
6713
6714 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6715 testApexError(t, "expected an integer between 0-9; got 10", `
6716 apex {
6717 name: "myapex",
6718 key: "myapex.key",
6719 apex_available_name: "com.android.foo",
6720 variant_version: "10",
6721 updatable: false,
6722 }
6723 apex_key {
6724 name: "myapex.key",
6725 public_key: "testkey.avbpubkey",
6726 private_key: "testkey.pem",
6727 }
6728 `)
6729 })
6730}
6731
6732func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6733 context := android.GroupFixturePreparers(
6734 android.PrepareForIntegrationTestWithAndroid,
6735 PrepareForTestWithApexBuildComponents,
6736 android.FixtureMergeMockFs(android.MockFS{
6737 "system/sepolicy/apex/foo-file_contexts": nil,
6738 "system/sepolicy/apex/bar-file_contexts": nil,
6739 }),
6740 )
6741 result := context.RunTestWithBp(t, `
6742 apex {
6743 name: "foo",
6744 key: "myapex.key",
6745 apex_available_name: "com.android.foo",
6746 variant_version: "0",
6747 updatable: false,
6748 }
6749 apex {
6750 name: "bar",
6751 key: "myapex.key",
6752 apex_available_name: "com.android.foo",
6753 variant_version: "3",
6754 updatable: false,
6755 }
6756 apex_key {
6757 name: "myapex.key",
6758 public_key: "testkey.avbpubkey",
6759 private_key: "testkey.pem",
6760 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006761 override_apex {
6762 name: "myoverrideapex",
6763 base: "bar",
6764 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006765 `)
6766
Jooyung Hana0503a52023-08-23 13:12:50 +09006767 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006768 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6769 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6770 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6771 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6772 }
6773
Jooyung Hana0503a52023-08-23 13:12:50 +09006774 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006775 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6776 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6777 barActualDefaultVersion := barManifestRule.Args["default_version"]
6778 if barActualDefaultVersion != barExpectedDefaultVersion {
6779 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6780 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006781
Jooyung Hana0503a52023-08-23 13:12:50 +09006782 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006783 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6784 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6785 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6786 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006787}
6788
Sam Delmericoca816532023-06-02 14:09:50 -04006789func TestApexAvailable_ApexAvailableName(t *testing.T) {
6790 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6791 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6792 apex {
6793 name: "myapex_sminus",
6794 key: "myapex.key",
6795 apps: ["AppFoo"],
6796 apex_available_name: "myapex",
6797 updatable: false,
6798 }
6799 apex {
6800 name: "myapex",
6801 key: "myapex.key",
6802 apps: ["AppFoo"],
6803 updatable: false,
6804 }
6805 apex_key {
6806 name: "myapex.key",
6807 public_key: "testkey.avbpubkey",
6808 private_key: "testkey.pem",
6809 }
6810 android_app {
6811 name: "AppFoo",
6812 srcs: ["foo/bar/MyClass.java"],
6813 sdk_version: "none",
6814 system_modules: "none",
6815 apex_available: [ "myapex_sminus" ],
6816 }`,
6817 android.FixtureMergeMockFs(android.MockFS{
6818 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6819 }),
6820 )
6821 })
6822
6823 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6824 testApex(t, `
6825 apex {
6826 name: "myapex_sminus",
6827 key: "myapex.key",
6828 apps: ["AppFoo"],
6829 apex_available_name: "myapex",
6830 updatable: false,
6831 }
6832 apex {
6833 name: "myapex",
6834 key: "myapex.key",
6835 apps: ["AppFoo"],
6836 updatable: false,
6837 }
6838 apex_key {
6839 name: "myapex.key",
6840 public_key: "testkey.avbpubkey",
6841 private_key: "testkey.pem",
6842 }
6843 android_app {
6844 name: "AppFoo",
6845 srcs: ["foo/bar/MyClass.java"],
6846 sdk_version: "none",
6847 system_modules: "none",
6848 apex_available: [ "myapex" ],
6849 }`,
6850 android.FixtureMergeMockFs(android.MockFS{
6851 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6852 }),
6853 )
6854 })
6855
6856 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6857 testApex(t, `
6858 override_apex {
6859 name: "myoverrideapex_sminus",
6860 base: "myapex_sminus",
6861 key: "myapex.key",
6862 apps: ["AppFooOverride"],
6863 }
6864 override_apex {
6865 name: "myoverrideapex",
6866 base: "myapex",
6867 key: "myapex.key",
6868 apps: ["AppFooOverride"],
6869 }
6870 apex {
6871 name: "myapex_sminus",
6872 key: "myapex.key",
6873 apps: ["AppFoo"],
6874 apex_available_name: "myapex",
6875 updatable: false,
6876 }
6877 apex {
6878 name: "myapex",
6879 key: "myapex.key",
6880 apps: ["AppFoo"],
6881 updatable: false,
6882 }
6883 apex_key {
6884 name: "myapex.key",
6885 public_key: "testkey.avbpubkey",
6886 private_key: "testkey.pem",
6887 }
6888 android_app {
6889 name: "AppFooOverride",
6890 srcs: ["foo/bar/MyClass.java"],
6891 sdk_version: "none",
6892 system_modules: "none",
6893 apex_available: [ "myapex" ],
6894 }
6895 android_app {
6896 name: "AppFoo",
6897 srcs: ["foo/bar/MyClass.java"],
6898 sdk_version: "none",
6899 system_modules: "none",
6900 apex_available: [ "myapex" ],
6901 }`,
6902 android.FixtureMergeMockFs(android.MockFS{
6903 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6904 }),
6905 )
6906 })
6907}
6908
6909func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6910 context := android.GroupFixturePreparers(
6911 android.PrepareForIntegrationTestWithAndroid,
6912 PrepareForTestWithApexBuildComponents,
6913 java.PrepareForTestWithDexpreopt,
6914 android.FixtureMergeMockFs(android.MockFS{
6915 "system/sepolicy/apex/myapex-file_contexts": nil,
6916 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6917 }),
6918 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6919 variables.BuildId = proptools.StringPtr("buildid")
6920 }),
6921 )
6922 context.RunTestWithBp(t, `
6923 override_apex {
6924 name: "myoverrideapex_sminus",
6925 base: "myapex_sminus",
6926 }
6927 override_apex {
6928 name: "myoverrideapex",
6929 base: "myapex",
6930 }
6931 apex {
6932 name: "myapex",
6933 key: "myapex.key",
6934 apps: ["AppFoo"],
6935 updatable: false,
6936 }
6937 apex {
6938 name: "myapex_sminus",
6939 apex_available_name: "myapex",
6940 key: "myapex.key",
6941 apps: ["AppFoo_sminus"],
6942 updatable: false,
6943 }
6944 apex_key {
6945 name: "myapex.key",
6946 public_key: "testkey.avbpubkey",
6947 private_key: "testkey.pem",
6948 }
6949 android_app {
6950 name: "AppFoo",
6951 srcs: ["foo/bar/MyClass.java"],
6952 sdk_version: "none",
6953 system_modules: "none",
6954 apex_available: [ "myapex" ],
6955 }
6956 android_app {
6957 name: "AppFoo_sminus",
6958 srcs: ["foo/bar/MyClass.java"],
6959 sdk_version: "none",
6960 min_sdk_version: "29",
6961 system_modules: "none",
6962 apex_available: [ "myapex" ],
6963 }`)
6964}
6965
Jiyong Park89e850a2020-04-07 16:37:39 +09006966func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006967 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006968 apex {
6969 name: "myapex",
6970 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006971 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006972 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006973 }
6974
6975 apex_key {
6976 name: "myapex.key",
6977 public_key: "testkey.avbpubkey",
6978 private_key: "testkey.pem",
6979 }
6980
6981 cc_library {
6982 name: "libfoo",
6983 stl: "none",
6984 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006985 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006986 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006987 }
6988
6989 cc_library {
6990 name: "libfoo2",
6991 stl: "none",
6992 system_shared_libs: [],
6993 shared_libs: ["libbaz"],
6994 apex_available: ["//apex_available:platform"],
6995 }
6996
6997 cc_library {
6998 name: "libbar",
6999 stl: "none",
7000 system_shared_libs: [],
7001 apex_available: ["myapex"],
7002 }
7003
7004 cc_library {
7005 name: "libbaz",
7006 stl: "none",
7007 system_shared_libs: [],
7008 apex_available: ["myapex"],
7009 stubs: {
7010 versions: ["1"],
7011 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007012 }`)
7013
Jiyong Park89e850a2020-04-07 16:37:39 +09007014 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7015 // because it depends on libbar which isn't available to platform
7016 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7017 if libfoo.NotAvailableForPlatform() != true {
7018 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7019 }
7020
7021 // libfoo2 however can be available to platform because it depends on libbaz which provides
7022 // stubs
7023 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7024 if libfoo2.NotAvailableForPlatform() == true {
7025 t.Errorf("%q should be available to platform", libfoo2.String())
7026 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007027}
Jiyong Parka90ca002019-10-07 15:47:24 +09007028
Paul Duffine52e66f2020-03-30 17:54:29 +01007029func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007030 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007031 apex {
7032 name: "myapex",
7033 key: "myapex.key",
7034 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007035 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007036 }
7037
7038 apex_key {
7039 name: "myapex.key",
7040 public_key: "testkey.avbpubkey",
7041 private_key: "testkey.pem",
7042 }
7043
7044 cc_library {
7045 name: "libfoo",
7046 stl: "none",
7047 system_shared_libs: [],
7048 apex_available: ["myapex"],
7049 static: {
7050 apex_available: ["//apex_available:platform"],
7051 },
7052 }`)
7053
Jiyong Park89e850a2020-04-07 16:37:39 +09007054 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7055 if libfooShared.NotAvailableForPlatform() != true {
7056 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7057 }
7058 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7059 if libfooStatic.NotAvailableForPlatform() != false {
7060 t.Errorf("%q should be available to platform", libfooStatic.String())
7061 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007062}
7063
Jiyong Park5d790c32019-11-15 18:40:32 +09007064func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007065 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007066 apex {
7067 name: "myapex",
7068 key: "myapex.key",
7069 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007070 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007071 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007072 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007073 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007074 }
7075
7076 override_apex {
7077 name: "override_myapex",
7078 base: "myapex",
7079 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007080 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007081 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007082 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007083 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007084 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007085 key: "mynewapex.key",
7086 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007087 }
7088
7089 apex_key {
7090 name: "myapex.key",
7091 public_key: "testkey.avbpubkey",
7092 private_key: "testkey.pem",
7093 }
7094
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007095 apex_key {
7096 name: "mynewapex.key",
7097 public_key: "testkey2.avbpubkey",
7098 private_key: "testkey2.pem",
7099 }
7100
7101 android_app_certificate {
7102 name: "myapex.certificate",
7103 certificate: "testkey",
7104 }
7105
Jiyong Park5d790c32019-11-15 18:40:32 +09007106 android_app {
7107 name: "app",
7108 srcs: ["foo/bar/MyClass.java"],
7109 package_name: "foo",
7110 sdk_version: "none",
7111 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007112 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007113 }
7114
7115 override_android_app {
7116 name: "override_app",
7117 base: "app",
7118 package_name: "bar",
7119 }
markchien7c803b82021-08-26 22:10:06 +08007120
7121 bpf {
7122 name: "bpf",
7123 srcs: ["bpf.c"],
7124 }
7125
7126 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007127 name: "overrideBpf",
7128 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007129 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007130
7131 prebuilt_etc {
7132 name: "myetc",
7133 src: "myprebuilt",
7134 }
7135
7136 prebuilt_etc {
7137 name: "override_myetc",
7138 src: "override_myprebuilt",
7139 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007140 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007141
Jooyung Hana0503a52023-08-23 13:12:50 +09007142 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7143 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007144 if originalVariant.GetOverriddenBy() != "" {
7145 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7146 }
7147 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7148 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7149 }
7150
Jooyung Hana0503a52023-08-23 13:12:50 +09007151 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007152 apexRule := module.Rule("apexRule")
7153 copyCmds := apexRule.Args["copy_commands"]
7154
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007155 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7156 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007157
markchien7c803b82021-08-26 22:10:06 +08007158 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007159 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007160
Daniel Norman5a3ce132021-08-26 15:44:43 -07007161 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7162 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7163
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007164 apexBundle := module.Module().(*apexBundle)
7165 name := apexBundle.Name()
7166 if name != "override_myapex" {
7167 t.Errorf("name should be \"override_myapex\", but was %q", name)
7168 }
7169
Baligh Uddin004d7172020-02-19 21:29:28 -08007170 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7171 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7172 }
7173
Jiyong Park20bacab2020-03-03 11:45:41 +09007174 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007175 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007176 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7177
7178 signApkRule := module.Rule("signapk")
7179 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007180
Colin Crossaa255532020-07-03 13:18:24 -07007181 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007182 var builder strings.Builder
7183 data.Custom(&builder, name, "TARGET_", "", data)
7184 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007185 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7186 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007187 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007188 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007189 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007190 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007191 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007192 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007193}
7194
Albert Martineefabcf2022-03-21 20:11:16 +00007195func TestMinSdkVersionOverride(t *testing.T) {
7196 // Override from 29 to 31
7197 minSdkOverride31 := "31"
7198 ctx := testApex(t, `
7199 apex {
7200 name: "myapex",
7201 key: "myapex.key",
7202 native_shared_libs: ["mylib"],
7203 updatable: true,
7204 min_sdk_version: "29"
7205 }
7206
7207 override_apex {
7208 name: "override_myapex",
7209 base: "myapex",
7210 logging_parent: "com.foo.bar",
7211 package_name: "test.overridden.package"
7212 }
7213
7214 apex_key {
7215 name: "myapex.key",
7216 public_key: "testkey.avbpubkey",
7217 private_key: "testkey.pem",
7218 }
7219
7220 cc_library {
7221 name: "mylib",
7222 srcs: ["mylib.cpp"],
7223 runtime_libs: ["libbar"],
7224 system_shared_libs: [],
7225 stl: "none",
7226 apex_available: [ "myapex" ],
7227 min_sdk_version: "apex_inherit"
7228 }
7229
7230 cc_library {
7231 name: "libbar",
7232 srcs: ["mylib.cpp"],
7233 system_shared_libs: [],
7234 stl: "none",
7235 apex_available: [ "myapex" ],
7236 min_sdk_version: "apex_inherit"
7237 }
7238
7239 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7240
Jooyung Hana0503a52023-08-23 13:12:50 +09007241 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007242 copyCmds := apexRule.Args["copy_commands"]
7243
7244 // Ensure that direct non-stubs dep is always included
7245 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7246
7247 // Ensure that runtime_libs dep in included
7248 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7249
7250 // Ensure libraries target overridden min_sdk_version value
7251 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7252}
7253
7254func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7255 // Attempt to override from 31 to 29, should be a NOOP
7256 minSdkOverride29 := "29"
7257 ctx := testApex(t, `
7258 apex {
7259 name: "myapex",
7260 key: "myapex.key",
7261 native_shared_libs: ["mylib"],
7262 updatable: true,
7263 min_sdk_version: "31"
7264 }
7265
7266 override_apex {
7267 name: "override_myapex",
7268 base: "myapex",
7269 logging_parent: "com.foo.bar",
7270 package_name: "test.overridden.package"
7271 }
7272
7273 apex_key {
7274 name: "myapex.key",
7275 public_key: "testkey.avbpubkey",
7276 private_key: "testkey.pem",
7277 }
7278
7279 cc_library {
7280 name: "mylib",
7281 srcs: ["mylib.cpp"],
7282 runtime_libs: ["libbar"],
7283 system_shared_libs: [],
7284 stl: "none",
7285 apex_available: [ "myapex" ],
7286 min_sdk_version: "apex_inherit"
7287 }
7288
7289 cc_library {
7290 name: "libbar",
7291 srcs: ["mylib.cpp"],
7292 system_shared_libs: [],
7293 stl: "none",
7294 apex_available: [ "myapex" ],
7295 min_sdk_version: "apex_inherit"
7296 }
7297
7298 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7299
Jooyung Hana0503a52023-08-23 13:12:50 +09007300 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007301 copyCmds := apexRule.Args["copy_commands"]
7302
7303 // Ensure that direct non-stubs dep is always included
7304 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7305
7306 // Ensure that runtime_libs dep in included
7307 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7308
7309 // Ensure libraries target the original min_sdk_version value rather than the overridden
7310 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7311}
7312
Jooyung Han214bf372019-11-12 13:03:50 +09007313func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007314 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007315 apex {
7316 name: "myapex",
7317 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007318 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007319 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007320 }
7321
7322 apex_key {
7323 name: "myapex.key",
7324 public_key: "testkey.avbpubkey",
7325 private_key: "testkey.pem",
7326 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007327
7328 cc_library {
7329 name: "mylib",
7330 srcs: ["mylib.cpp"],
7331 stl: "libc++",
7332 system_shared_libs: [],
7333 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007334 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007335 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007336 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007337
Jooyung Hana0503a52023-08-23 13:12:50 +09007338 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007339 args := module.Rule("apexRule").Args
7340 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007341 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007342
7343 // The copies of the libraries in the apex should have one more dependency than
7344 // the ones outside the apex, namely the unwinder. Ideally we should check
7345 // the dependency names directly here but for some reason the names are blank in
7346 // this test.
7347 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007348 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007349 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7350 if len(apexImplicits) != len(nonApexImplicits)+1 {
7351 t.Errorf("%q missing unwinder dep", lib)
7352 }
7353 }
Jooyung Han214bf372019-11-12 13:03:50 +09007354}
7355
Paul Duffine05480a2021-03-08 15:07:14 +00007356var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007357 "api/current.txt": nil,
7358 "api/removed.txt": nil,
7359 "api/system-current.txt": nil,
7360 "api/system-removed.txt": nil,
7361 "api/test-current.txt": nil,
7362 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007363
Anton Hanssondff2c782020-12-21 17:10:01 +00007364 "100/public/api/foo.txt": nil,
7365 "100/public/api/foo-removed.txt": nil,
7366 "100/system/api/foo.txt": nil,
7367 "100/system/api/foo-removed.txt": nil,
7368
Paul Duffineedc5d52020-06-12 17:46:39 +01007369 // For java_sdk_library_import
7370 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007371}
7372
Jooyung Han58f26ab2019-12-18 15:34:32 +09007373func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007374 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007375 apex {
7376 name: "myapex",
7377 key: "myapex.key",
7378 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007379 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007380 }
7381
7382 apex_key {
7383 name: "myapex.key",
7384 public_key: "testkey.avbpubkey",
7385 private_key: "testkey.pem",
7386 }
7387
7388 java_sdk_library {
7389 name: "foo",
7390 srcs: ["a.java"],
7391 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007392 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007393 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007394
7395 prebuilt_apis {
7396 name: "sdk",
7397 api_dirs: ["100"],
7398 }
Paul Duffin9b879592020-05-26 13:21:35 +01007399 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007400
7401 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007402 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007403 "javalib/foo.jar",
7404 "etc/permissions/foo.xml",
7405 })
7406 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007407 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007408 ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
Jooyung Han58f26ab2019-12-18 15:34:32 +09007409}
7410
Paul Duffin9b879592020-05-26 13:21:35 +01007411func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007412 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007413 apex {
7414 name: "myapex",
7415 key: "myapex.key",
7416 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007417 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007418 }
7419
7420 apex_key {
7421 name: "myapex.key",
7422 public_key: "testkey.avbpubkey",
7423 private_key: "testkey.pem",
7424 }
7425
7426 java_sdk_library {
7427 name: "foo",
7428 srcs: ["a.java"],
7429 api_packages: ["foo"],
7430 apex_available: ["myapex"],
7431 sdk_version: "none",
7432 system_modules: "none",
7433 }
7434
7435 java_library {
7436 name: "bar",
7437 srcs: ["a.java"],
7438 libs: ["foo"],
7439 apex_available: ["myapex"],
7440 sdk_version: "none",
7441 system_modules: "none",
7442 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007443
7444 prebuilt_apis {
7445 name: "sdk",
7446 api_dirs: ["100"],
7447 }
Paul Duffin9b879592020-05-26 13:21:35 +01007448 `, withFiles(filesForSdkLibrary))
7449
7450 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007451 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007452 "javalib/bar.jar",
7453 "javalib/foo.jar",
7454 "etc/permissions/foo.xml",
7455 })
7456
7457 // The bar library should depend on the implementation jar.
7458 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007459 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007460 t.Errorf("expected %q, found %#q", expected, actual)
7461 }
7462}
7463
7464func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007465 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007466 apex {
7467 name: "myapex",
7468 key: "myapex.key",
7469 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007470 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007471 }
7472
7473 apex_key {
7474 name: "myapex.key",
7475 public_key: "testkey.avbpubkey",
7476 private_key: "testkey.pem",
7477 }
7478
7479 java_sdk_library {
7480 name: "foo",
7481 srcs: ["a.java"],
7482 api_packages: ["foo"],
7483 apex_available: ["myapex"],
7484 sdk_version: "none",
7485 system_modules: "none",
7486 }
7487
7488 java_library {
7489 name: "bar",
7490 srcs: ["a.java"],
7491 libs: ["foo"],
7492 sdk_version: "none",
7493 system_modules: "none",
7494 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007495
7496 prebuilt_apis {
7497 name: "sdk",
7498 api_dirs: ["100"],
7499 }
Paul Duffin9b879592020-05-26 13:21:35 +01007500 `, withFiles(filesForSdkLibrary))
7501
7502 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007503 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007504 "javalib/foo.jar",
7505 "etc/permissions/foo.xml",
7506 })
7507
7508 // The bar library should depend on the stubs jar.
7509 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007510 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007511 t.Errorf("expected %q, found %#q", expected, actual)
7512 }
7513}
7514
Paul Duffineedc5d52020-06-12 17:46:39 +01007515func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007516 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007517 prebuilt_apis {
7518 name: "sdk",
7519 api_dirs: ["100"],
7520 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007521 withFiles(map[string][]byte{
7522 "apex/a.java": nil,
7523 "apex/apex_manifest.json": nil,
7524 "apex/Android.bp": []byte(`
7525 package {
7526 default_visibility: ["//visibility:private"],
7527 }
7528
7529 apex {
7530 name: "myapex",
7531 key: "myapex.key",
7532 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007533 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007534 }
7535
7536 apex_key {
7537 name: "myapex.key",
7538 public_key: "testkey.avbpubkey",
7539 private_key: "testkey.pem",
7540 }
7541
7542 java_library {
7543 name: "bar",
7544 srcs: ["a.java"],
7545 libs: ["foo"],
7546 apex_available: ["myapex"],
7547 sdk_version: "none",
7548 system_modules: "none",
7549 }
7550`),
7551 "source/a.java": nil,
7552 "source/api/current.txt": nil,
7553 "source/api/removed.txt": nil,
7554 "source/Android.bp": []byte(`
7555 package {
7556 default_visibility: ["//visibility:private"],
7557 }
7558
7559 java_sdk_library {
7560 name: "foo",
7561 visibility: ["//apex"],
7562 srcs: ["a.java"],
7563 api_packages: ["foo"],
7564 apex_available: ["myapex"],
7565 sdk_version: "none",
7566 system_modules: "none",
7567 public: {
7568 enabled: true,
7569 },
7570 }
7571`),
7572 "prebuilt/a.jar": nil,
7573 "prebuilt/Android.bp": []byte(`
7574 package {
7575 default_visibility: ["//visibility:private"],
7576 }
7577
7578 java_sdk_library_import {
7579 name: "foo",
7580 visibility: ["//apex", "//source"],
7581 apex_available: ["myapex"],
7582 prefer: true,
7583 public: {
7584 jars: ["a.jar"],
7585 },
7586 }
7587`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007588 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007589 )
7590
7591 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007592 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007593 "javalib/bar.jar",
7594 "javalib/foo.jar",
7595 "etc/permissions/foo.xml",
7596 })
7597
7598 // The bar library should depend on the implementation jar.
7599 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007600 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007601 t.Errorf("expected %q, found %#q", expected, actual)
7602 }
7603}
7604
7605func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7606 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7607 apex {
7608 name: "myapex",
7609 key: "myapex.key",
7610 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007611 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007612 }
7613
7614 apex_key {
7615 name: "myapex.key",
7616 public_key: "testkey.avbpubkey",
7617 private_key: "testkey.pem",
7618 }
7619
7620 java_sdk_library_import {
7621 name: "foo",
7622 apex_available: ["myapex"],
7623 prefer: true,
7624 public: {
7625 jars: ["a.jar"],
7626 },
7627 }
7628
7629 `, withFiles(filesForSdkLibrary))
7630}
7631
atrost6e126252020-01-27 17:01:16 +00007632func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007633 result := android.GroupFixturePreparers(
7634 prepareForApexTest,
7635 java.PrepareForTestWithPlatformCompatConfig,
7636 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007637 apex {
7638 name: "myapex",
7639 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007640 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007641 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007642 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007643 }
7644
7645 apex_key {
7646 name: "myapex.key",
7647 public_key: "testkey.avbpubkey",
7648 private_key: "testkey.pem",
7649 }
7650
7651 platform_compat_config {
7652 name: "myjar-platform-compat-config",
7653 src: ":myjar",
7654 }
7655
7656 java_library {
7657 name: "myjar",
7658 srcs: ["foo/bar/MyClass.java"],
7659 sdk_version: "none",
7660 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007661 apex_available: [ "myapex" ],
7662 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007663
7664 // Make sure that a preferred prebuilt does not affect the apex contents.
7665 prebuilt_platform_compat_config {
7666 name: "myjar-platform-compat-config",
7667 metadata: "compat-config/metadata.xml",
7668 prefer: true,
7669 }
atrost6e126252020-01-27 17:01:16 +00007670 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007671 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007672 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007673 "etc/compatconfig/myjar-platform-compat-config.xml",
7674 "javalib/myjar.jar",
7675 })
7676}
7677
Jooyung Han862c0d62022-12-21 10:15:37 +09007678func TestNoDupeApexFiles(t *testing.T) {
7679 android.GroupFixturePreparers(
7680 android.PrepareForTestWithAndroidBuildComponents,
7681 PrepareForTestWithApexBuildComponents,
7682 prepareForTestWithMyapex,
7683 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7684 ).
7685 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7686 RunTestWithBp(t, `
7687 apex {
7688 name: "myapex",
7689 key: "myapex.key",
7690 prebuilts: ["foo", "bar"],
7691 updatable: false,
7692 }
7693
7694 apex_key {
7695 name: "myapex.key",
7696 public_key: "testkey.avbpubkey",
7697 private_key: "testkey.pem",
7698 }
7699
7700 prebuilt_etc {
7701 name: "foo",
7702 src: "myprebuilt",
7703 filename_from_src: true,
7704 }
7705
7706 prebuilt_etc {
7707 name: "bar",
7708 src: "myprebuilt",
7709 filename_from_src: true,
7710 }
7711 `)
7712}
7713
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007714func TestApexUnwantedTransitiveDeps(t *testing.T) {
7715 bp := `
7716 apex {
7717 name: "myapex",
7718 key: "myapex.key",
7719 native_shared_libs: ["libfoo"],
7720 updatable: false,
7721 unwanted_transitive_deps: ["libbar"],
7722 }
7723
7724 apex_key {
7725 name: "myapex.key",
7726 public_key: "testkey.avbpubkey",
7727 private_key: "testkey.pem",
7728 }
7729
7730 cc_library {
7731 name: "libfoo",
7732 srcs: ["foo.cpp"],
7733 shared_libs: ["libbar"],
7734 apex_available: ["myapex"],
7735 }
7736
7737 cc_library {
7738 name: "libbar",
7739 srcs: ["bar.cpp"],
7740 apex_available: ["myapex"],
7741 }`
7742 ctx := testApex(t, bp)
7743 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7744 "*/libc++.so",
7745 "*/libfoo.so",
7746 // not libbar.so
7747 })
7748}
7749
Jiyong Park479321d2019-12-16 11:47:12 +09007750func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7751 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7752 apex {
7753 name: "myapex",
7754 key: "myapex.key",
7755 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007756 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007757 }
7758
7759 apex_key {
7760 name: "myapex.key",
7761 public_key: "testkey.avbpubkey",
7762 private_key: "testkey.pem",
7763 }
7764
7765 java_library {
7766 name: "myjar",
7767 srcs: ["foo/bar/MyClass.java"],
7768 sdk_version: "none",
7769 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007770 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007771 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007772 }
7773 `)
7774}
7775
Jiyong Park7afd1072019-12-30 16:56:33 +09007776func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007777 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007778 apex {
7779 name: "myapex",
7780 key: "myapex.key",
7781 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007782 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007783 }
7784
7785 apex_key {
7786 name: "myapex.key",
7787 public_key: "testkey.avbpubkey",
7788 private_key: "testkey.pem",
7789 }
7790
7791 cc_library {
7792 name: "mylib",
7793 srcs: ["mylib.cpp"],
7794 system_shared_libs: [],
7795 stl: "none",
7796 required: ["a", "b"],
7797 host_required: ["c", "d"],
7798 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007799 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007800 }
7801 `)
7802
Jooyung Hana0503a52023-08-23 13:12:50 +09007803 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007804 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007805 name := apexBundle.BaseModuleName()
7806 prefix := "TARGET_"
7807 var builder strings.Builder
7808 data.Custom(&builder, name, prefix, "", data)
7809 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007810 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007811 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7812 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007813}
7814
Jiyong Park7cd10e32020-01-14 09:22:18 +09007815func TestSymlinksFromApexToSystem(t *testing.T) {
7816 bp := `
7817 apex {
7818 name: "myapex",
7819 key: "myapex.key",
7820 native_shared_libs: ["mylib"],
7821 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007822 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007823 }
7824
Jiyong Park9d677202020-02-19 16:29:35 +09007825 apex {
7826 name: "myapex.updatable",
7827 key: "myapex.key",
7828 native_shared_libs: ["mylib"],
7829 java_libs: ["myjar"],
7830 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007831 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007832 }
7833
Jiyong Park7cd10e32020-01-14 09:22:18 +09007834 apex_key {
7835 name: "myapex.key",
7836 public_key: "testkey.avbpubkey",
7837 private_key: "testkey.pem",
7838 }
7839
7840 cc_library {
7841 name: "mylib",
7842 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007843 shared_libs: [
7844 "myotherlib",
7845 "myotherlib_ext",
7846 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007847 system_shared_libs: [],
7848 stl: "none",
7849 apex_available: [
7850 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007851 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 "//apex_available:platform",
7853 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007854 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007855 }
7856
7857 cc_library {
7858 name: "myotherlib",
7859 srcs: ["mylib.cpp"],
7860 system_shared_libs: [],
7861 stl: "none",
7862 apex_available: [
7863 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007864 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007865 "//apex_available:platform",
7866 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007867 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007868 }
7869
Jiyong Parkce243632023-02-17 18:22:25 +09007870 cc_library {
7871 name: "myotherlib_ext",
7872 srcs: ["mylib.cpp"],
7873 system_shared_libs: [],
7874 system_ext_specific: true,
7875 stl: "none",
7876 apex_available: [
7877 "myapex",
7878 "myapex.updatable",
7879 "//apex_available:platform",
7880 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007881 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007882 }
7883
Jiyong Park7cd10e32020-01-14 09:22:18 +09007884 java_library {
7885 name: "myjar",
7886 srcs: ["foo/bar/MyClass.java"],
7887 sdk_version: "none",
7888 system_modules: "none",
7889 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007890 apex_available: [
7891 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007892 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007893 "//apex_available:platform",
7894 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007895 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007896 }
7897
7898 java_library {
7899 name: "myotherjar",
7900 srcs: ["foo/bar/MyClass.java"],
7901 sdk_version: "none",
7902 system_modules: "none",
7903 apex_available: [
7904 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007905 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007906 "//apex_available:platform",
7907 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007908 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007909 }
7910 `
7911
7912 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7913 for _, f := range files {
7914 if f.path == file {
7915 if f.isLink {
7916 t.Errorf("%q is not a real file", file)
7917 }
7918 return
7919 }
7920 }
7921 t.Errorf("%q is not found", file)
7922 }
7923
Jiyong Parkce243632023-02-17 18:22:25 +09007924 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007925 for _, f := range files {
7926 if f.path == file {
7927 if !f.isLink {
7928 t.Errorf("%q is not a symlink", file)
7929 }
Jiyong Parkce243632023-02-17 18:22:25 +09007930 if f.src != target {
7931 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7932 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007933 return
7934 }
7935 }
7936 t.Errorf("%q is not found", file)
7937 }
7938
Jiyong Park9d677202020-02-19 16:29:35 +09007939 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7940 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007941 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007942 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007943 ensureRealfileExists(t, files, "javalib/myjar.jar")
7944 ensureRealfileExists(t, files, "lib64/mylib.so")
7945 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007946 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007947
Jooyung Hana0503a52023-08-23 13:12:50 +09007948 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007949 ensureRealfileExists(t, files, "javalib/myjar.jar")
7950 ensureRealfileExists(t, files, "lib64/mylib.so")
7951 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007952 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007953
7954 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007955 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007956 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007957 ensureRealfileExists(t, files, "javalib/myjar.jar")
7958 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007959 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7960 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007961
Jooyung Hana0503a52023-08-23 13:12:50 +09007962 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007963 ensureRealfileExists(t, files, "javalib/myjar.jar")
7964 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007965 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7966 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967}
7968
Yo Chiange8128052020-07-23 20:09:18 +08007969func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007970 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007971 apex {
7972 name: "myapex",
7973 key: "myapex.key",
7974 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007975 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007976 }
7977
7978 apex_key {
7979 name: "myapex.key",
7980 public_key: "testkey.avbpubkey",
7981 private_key: "testkey.pem",
7982 }
7983
7984 cc_library_shared {
7985 name: "mylib",
7986 srcs: ["mylib.cpp"],
7987 shared_libs: ["myotherlib"],
7988 system_shared_libs: [],
7989 stl: "none",
7990 apex_available: [
7991 "myapex",
7992 "//apex_available:platform",
7993 ],
7994 }
7995
7996 cc_prebuilt_library_shared {
7997 name: "myotherlib",
7998 srcs: ["prebuilt.so"],
7999 system_shared_libs: [],
8000 stl: "none",
8001 apex_available: [
8002 "myapex",
8003 "//apex_available:platform",
8004 ],
8005 }
8006 `)
8007
Jooyung Hana0503a52023-08-23 13:12:50 +09008008 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008009 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008010 var builder strings.Builder
8011 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8012 androidMk := builder.String()
8013 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008014 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008015 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8016 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8017 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008018 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008019}
8020
Jooyung Han643adc42020-02-27 13:50:06 +09008021func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008022 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008023 apex {
8024 name: "myapex",
8025 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008026 binaries: ["mybin"],
8027 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008028 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008029 }
8030
8031 apex_key {
8032 name: "myapex.key",
8033 public_key: "testkey.avbpubkey",
8034 private_key: "testkey.pem",
8035 }
8036
8037 cc_library {
8038 name: "mylib",
8039 srcs: ["mylib.cpp"],
8040 shared_libs: ["mylib2"],
8041 system_shared_libs: [],
8042 stl: "none",
8043 apex_available: [ "myapex" ],
8044 }
8045
8046 cc_library {
8047 name: "mylib2",
8048 srcs: ["mylib.cpp"],
8049 system_shared_libs: [],
8050 stl: "none",
8051 apex_available: [ "myapex" ],
8052 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008053
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008054 // Used as both a JNI library and a regular shared library.
8055 cc_library {
8056 name: "mylib3",
8057 srcs: ["mylib.cpp"],
8058 system_shared_libs: [],
8059 stl: "none",
8060 apex_available: [ "myapex" ],
8061 }
8062
8063 cc_binary {
8064 name: "mybin",
8065 srcs: ["mybin.cpp"],
8066 shared_libs: ["mylib3"],
8067 system_shared_libs: [],
8068 stl: "none",
8069 apex_available: [ "myapex" ],
8070 }
8071
Jiyong Park34d5c332022-02-24 18:02:44 +09008072 rust_ffi_shared {
8073 name: "libfoo.rust",
8074 crate_name: "foo",
8075 srcs: ["foo.rs"],
8076 shared_libs: ["libfoo.shared_from_rust"],
8077 prefer_rlib: true,
8078 apex_available: ["myapex"],
8079 }
8080
8081 cc_library_shared {
8082 name: "libfoo.shared_from_rust",
8083 srcs: ["mylib.cpp"],
8084 system_shared_libs: [],
8085 stl: "none",
8086 stubs: {
8087 versions: ["10", "11", "12"],
8088 },
8089 }
8090
Jooyung Han643adc42020-02-27 13:50:06 +09008091 `)
8092
Jooyung Hana0503a52023-08-23 13:12:50 +09008093 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008094 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008095 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008096 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008097 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008098 "lib64/mylib.so",
8099 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008100 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008101 "lib64/libfoo.rust.so",
8102 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8103 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008104 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008105
8106 // b/220397949
8107 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008108}
8109
Jooyung Han49f67012020-04-17 13:43:10 +09008110func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008111 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008112 apex {
8113 name: "myapex",
8114 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008115 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008116 }
8117 apex_key {
8118 name: "myapex.key",
8119 public_key: "testkey.avbpubkey",
8120 private_key: "testkey.pem",
8121 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008122 `,
8123 android.FixtureModifyConfig(func(config android.Config) {
8124 delete(config.Targets, android.Android)
8125 config.AndroidCommonTarget = android.Target{}
8126 }),
8127 )
Jooyung Han49f67012020-04-17 13:43:10 +09008128
8129 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8130 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8131 }
8132}
8133
Jiyong Parkbd159612020-02-28 15:22:21 +09008134func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008135 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008136 apex {
8137 name: "myapex",
8138 key: "myapex.key",
8139 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008140 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008141 }
8142
8143 apex_key {
8144 name: "myapex.key",
8145 public_key: "testkey.avbpubkey",
8146 private_key: "testkey.pem",
8147 }
8148
8149 android_app {
8150 name: "AppFoo",
8151 srcs: ["foo/bar/MyClass.java"],
8152 sdk_version: "none",
8153 system_modules: "none",
8154 apex_available: [ "myapex" ],
8155 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008156 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008157
Jooyung Hana0503a52023-08-23 13:12:50 +09008158 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008159 content := bundleConfigRule.Args["content"]
8160
8161 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008162 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09008163}
8164
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008165func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008166 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008167 apex {
8168 name: "myapex",
8169 key: "myapex.key",
8170 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008171 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008172 }
8173
8174 apex_key {
8175 name: "myapex.key",
8176 public_key: "testkey.avbpubkey",
8177 private_key: "testkey.pem",
8178 }
8179
8180 android_app_set {
8181 name: "AppSet",
8182 set: "AppSet.apks",
8183 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008184 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008185 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008186 content := bundleConfigRule.Args["content"]
8187 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8188 s := mod.Rule("apexRule").Args["copy_commands"]
8189 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008190 if len(copyCmds) != 4 {
8191 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008192 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008193 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8194 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008195 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8196 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008197
8198 // Ensure that canned_fs_config has an entry for the app set zip file
8199 generateFsRule := mod.Rule("generateFsConfig")
8200 cmd := generateFsRule.RuleParams.Command
8201 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008202}
8203
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008204func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008205 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008206 apex_set {
8207 name: "myapex",
8208 filename: "foo_v2.apex",
8209 sanitized: {
8210 none: { set: "myapex.apks", },
8211 hwaddress: { set: "myapex.hwasan.apks", },
8212 },
Paul Duffin24704672021-04-06 16:09:30 +01008213 }
8214 `
8215 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008216
Paul Duffin24704672021-04-06 16:09:30 +01008217 // Check that the extractor produces the correct output file from the correct input file.
8218 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008219
Paul Duffin24704672021-04-06 16:09:30 +01008220 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8221 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008222
Paul Duffin24704672021-04-06 16:09:30 +01008223 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8224
8225 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008226 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8227 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008228
8229 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008230}
8231
Pranav Guptaeba03b02022-09-27 00:27:08 +00008232func TestApexSetApksModuleAssignment(t *testing.T) {
8233 ctx := testApex(t, `
8234 apex_set {
8235 name: "myapex",
8236 set: ":myapex_apks_file",
8237 }
8238
8239 filegroup {
8240 name: "myapex_apks_file",
8241 srcs: ["myapex.apks"],
8242 }
8243 `)
8244
8245 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8246
8247 // Check that the extractor produces the correct apks file from the input module
8248 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8249 extractedApex := m.Output(extractorOutput)
8250
8251 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8252}
8253
Paul Duffin89f570a2021-06-16 01:42:33 +01008254func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008255 t.Helper()
8256
Paul Duffin55607122021-03-30 23:32:51 +01008257 fs := android.MockFS{
8258 "a.java": nil,
8259 "a.jar": nil,
8260 "apex_manifest.json": nil,
8261 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008262 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008263 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8264 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8265 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008266 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008267 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008268
Paul Duffin55607122021-03-30 23:32:51 +01008269 errorHandler := android.FixtureExpectsNoErrors
8270 if errmsg != "" {
8271 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008272 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008273
Paul Duffin55607122021-03-30 23:32:51 +01008274 result := android.GroupFixturePreparers(
8275 cc.PrepareForTestWithCcDefaultModules,
8276 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008277 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008278 java.PrepareForTestWithJavaSdkLibraryFiles,
8279 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008280 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008281 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008282 android.FixtureModifyMockFS(func(fs android.MockFS) {
8283 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8284 insert := ""
8285 for _, fragment := range fragments {
8286 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8287 }
8288 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8289 platform_bootclasspath {
8290 name: "platform-bootclasspath",
8291 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008292 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008293 %s
8294 ],
8295 }
8296 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008297 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008298 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008299 // Dexpreopt for boot jars requires the ART boot image profile.
8300 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8301 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008302 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008303 ).
8304 ExtendWithErrorHandler(errorHandler).
8305 RunTestWithBp(t, bp)
8306
8307 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008308}
8309
Paul Duffin5556c5f2022-06-09 17:32:21 +00008310func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008311 preparers := android.GroupFixturePreparers(
8312 java.PrepareForTestWithJavaDefaultModules,
8313 PrepareForTestWithApexBuildComponents,
8314 ).
8315 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8316 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8317
8318 bpBase := `
8319 apex_set {
8320 name: "com.android.myapex",
8321 installable: true,
8322 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8323 set: "myapex.apks",
8324 }
8325
8326 apex_set {
8327 name: "com.mycompany.android.myapex",
8328 apex_name: "com.android.myapex",
8329 installable: true,
8330 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8331 set: "company-myapex.apks",
8332 }
8333
8334 prebuilt_bootclasspath_fragment {
8335 name: "my-bootclasspath-fragment",
8336 apex_available: ["com.android.myapex"],
8337 %s
8338 }
8339 `
8340
8341 t.Run("java_import", func(t *testing.T) {
8342 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8343 java_import {
8344 name: "libfoo",
8345 jars: ["libfoo.jar"],
8346 apex_available: ["com.android.myapex"],
8347 }
8348 `)
8349 })
8350
8351 t.Run("java_sdk_library_import", func(t *testing.T) {
8352 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8353 java_sdk_library_import {
8354 name: "libfoo",
8355 public: {
8356 jars: ["libbar.jar"],
8357 },
8358 apex_available: ["com.android.myapex"],
8359 }
8360 `)
8361 })
8362
8363 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8364 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8365 image_name: "art",
8366 contents: ["libfoo"],
8367 `)+`
8368 java_sdk_library_import {
8369 name: "libfoo",
8370 public: {
8371 jars: ["libbar.jar"],
8372 },
8373 apex_available: ["com.android.myapex"],
8374 }
8375 `)
8376 })
8377}
8378
Paul Duffin5556c5f2022-06-09 17:32:21 +00008379func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8380 preparers := android.GroupFixturePreparers(
8381 java.PrepareForTestWithJavaDefaultModules,
8382 PrepareForTestWithApexBuildComponents,
8383 )
8384
8385 bpBase := `
8386 apex_set {
8387 name: "com.android.myapex",
8388 installable: true,
8389 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8390 set: "myapex.apks",
8391 }
8392
8393 apex_set {
8394 name: "com.android.myapex_compressed",
8395 apex_name: "com.android.myapex",
8396 installable: true,
8397 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8398 set: "myapex_compressed.apks",
8399 }
8400
8401 prebuilt_bootclasspath_fragment {
8402 name: "my-bootclasspath-fragment",
8403 apex_available: [
8404 "com.android.myapex",
8405 "com.android.myapex_compressed",
8406 ],
8407 hidden_api: {
8408 annotation_flags: "annotation-flags.csv",
8409 metadata: "metadata.csv",
8410 index: "index.csv",
8411 signature_patterns: "signature_patterns.csv",
8412 },
8413 %s
8414 }
8415 `
8416
8417 t.Run("java_import", func(t *testing.T) {
8418 result := preparers.RunTestWithBp(t,
8419 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8420 java_import {
8421 name: "libfoo",
8422 jars: ["libfoo.jar"],
8423 apex_available: [
8424 "com.android.myapex",
8425 "com.android.myapex_compressed",
8426 ],
8427 }
8428 `)
8429
8430 module := result.Module("libfoo", "android_common_com.android.myapex")
8431 usesLibraryDep := module.(java.UsesLibraryDependency)
8432 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8433 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8434 usesLibraryDep.DexJarBuildPath().Path())
8435 })
8436
8437 t.Run("java_sdk_library_import", func(t *testing.T) {
8438 result := preparers.RunTestWithBp(t,
8439 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8440 java_sdk_library_import {
8441 name: "libfoo",
8442 public: {
8443 jars: ["libbar.jar"],
8444 },
8445 apex_available: [
8446 "com.android.myapex",
8447 "com.android.myapex_compressed",
8448 ],
8449 compile_dex: true,
8450 }
8451 `)
8452
8453 module := result.Module("libfoo", "android_common_com.android.myapex")
8454 usesLibraryDep := module.(java.UsesLibraryDependency)
8455 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8456 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8457 usesLibraryDep.DexJarBuildPath().Path())
8458 })
8459
8460 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8461 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8462 image_name: "art",
8463 contents: ["libfoo"],
8464 `)+`
8465 java_sdk_library_import {
8466 name: "libfoo",
8467 public: {
8468 jars: ["libbar.jar"],
8469 },
8470 apex_available: [
8471 "com.android.myapex",
8472 "com.android.myapex_compressed",
8473 ],
8474 compile_dex: true,
8475 }
8476 `)
8477 })
8478}
8479
Jooyung Han548640b2020-04-27 12:10:30 +09008480func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8481 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8482 apex {
8483 name: "myapex",
8484 key: "myapex.key",
8485 updatable: true,
8486 }
8487
8488 apex_key {
8489 name: "myapex.key",
8490 public_key: "testkey.avbpubkey",
8491 private_key: "testkey.pem",
8492 }
8493 `)
8494}
8495
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008496func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8497 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8498 apex {
8499 name: "myapex",
8500 key: "myapex.key",
8501 }
8502
8503 apex_key {
8504 name: "myapex.key",
8505 public_key: "testkey.avbpubkey",
8506 private_key: "testkey.pem",
8507 }
8508 `)
8509}
8510
Jooyung Handfc864c2023-03-20 18:19:07 +09008511func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8512 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008513 apex {
8514 name: "myapex",
8515 key: "myapex.key",
8516 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008517 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008518 soc_specific: true,
8519 }
8520
8521 apex_key {
8522 name: "myapex.key",
8523 public_key: "testkey.avbpubkey",
8524 private_key: "testkey.pem",
8525 }
8526 `)
8527}
8528
Jooyung Han02873da2023-03-22 17:41:03 +09008529func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8530 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8531 apex {
8532 name: "myapex",
8533 key: "myapex.key",
8534 updatable: false,
8535 min_sdk_version: "29",
8536 use_vndk_as_stable: true,
8537 vendor: true,
8538 }
8539
8540 apex_key {
8541 name: "myapex.key",
8542 public_key: "testkey.avbpubkey",
8543 private_key: "testkey.pem",
8544 }
8545 `)
8546}
8547
Jooyung Handfc864c2023-03-20 18:19:07 +09008548func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8549 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8550 apex {
8551 name: "myapex",
8552 key: "myapex.key",
8553 updatable: false,
8554 use_vndk_as_stable: true,
8555 }
8556
8557 apex_key {
8558 name: "myapex.key",
8559 public_key: "testkey.avbpubkey",
8560 private_key: "testkey.pem",
8561 }
8562 `)
8563}
8564
satayevb98371c2021-06-15 16:49:50 +01008565func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8566 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8567 apex {
8568 name: "myapex",
8569 key: "myapex.key",
8570 systemserverclasspath_fragments: [
8571 "mysystemserverclasspathfragment",
8572 ],
8573 min_sdk_version: "29",
8574 updatable: true,
8575 }
8576
8577 apex_key {
8578 name: "myapex.key",
8579 public_key: "testkey.avbpubkey",
8580 private_key: "testkey.pem",
8581 }
8582
8583 java_library {
8584 name: "foo",
8585 srcs: ["b.java"],
8586 min_sdk_version: "29",
8587 installable: true,
8588 apex_available: [
8589 "myapex",
8590 ],
8591 }
8592
8593 systemserverclasspath_fragment {
8594 name: "mysystemserverclasspathfragment",
8595 generate_classpaths_proto: false,
8596 contents: [
8597 "foo",
8598 ],
8599 apex_available: [
8600 "myapex",
8601 ],
8602 }
satayevabcd5972021-08-06 17:49:46 +01008603 `,
8604 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8605 )
satayevb98371c2021-06-15 16:49:50 +01008606}
8607
Paul Duffin064b70c2020-11-02 17:32:38 +00008608func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008609 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008610 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008611 fragment := java.ApexVariantReference{
8612 Apex: proptools.StringPtr("myapex"),
8613 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8614 }
8615
Paul Duffin064b70c2020-11-02 17:32:38 +00008616 testDexpreoptWithApexes(t, `
8617 prebuilt_apex {
8618 name: "myapex" ,
8619 arch: {
8620 arm64: {
8621 src: "myapex-arm64.apex",
8622 },
8623 arm: {
8624 src: "myapex-arm.apex",
8625 },
8626 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008627 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8628 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008629
Paul Duffin89f570a2021-06-16 01:42:33 +01008630 prebuilt_bootclasspath_fragment {
8631 name: "my-bootclasspath-fragment",
8632 contents: ["libfoo"],
8633 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008634 hidden_api: {
8635 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8636 metadata: "my-bootclasspath-fragment/metadata.csv",
8637 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008638 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8639 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8640 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008641 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008642 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008643
Paul Duffin89f570a2021-06-16 01:42:33 +01008644 java_import {
8645 name: "libfoo",
8646 jars: ["libfoo.jar"],
8647 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008648 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008649 }
8650 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008651 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008652}
8653
Spandan Dasf14e2542021-11-12 00:01:37 +00008654func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008655 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008656 bp += `
8657 apex_key {
8658 name: "myapex.key",
8659 public_key: "testkey.avbpubkey",
8660 private_key: "testkey.pem",
8661 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008662 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008663 "lib1/src/A.java": nil,
8664 "lib2/src/B.java": nil,
8665 "system/sepolicy/apex/myapex-file_contexts": nil,
8666 }
8667
Paul Duffin45338f02021-03-30 23:07:52 +01008668 errorHandler := android.FixtureExpectsNoErrors
8669 if errmsg != "" {
8670 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008671 }
Colin Crossae8600b2020-10-29 17:09:13 -07008672
Paul Duffin45338f02021-03-30 23:07:52 +01008673 android.GroupFixturePreparers(
8674 android.PrepareForTestWithAndroidBuildComponents,
8675 java.PrepareForTestWithJavaBuildComponents,
8676 PrepareForTestWithApexBuildComponents,
8677 android.PrepareForTestWithNeverallowRules(rules),
8678 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008679 apexBootJars := make([]string, 0, len(bootJars))
8680 for _, apexBootJar := range bootJars {
8681 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008682 }
satayevd604b212021-07-21 14:23:52 +01008683 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008684 }),
8685 fs.AddToFixture(),
8686 ).
8687 ExtendWithErrorHandler(errorHandler).
8688 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008689}
8690
8691func TestApexPermittedPackagesRules(t *testing.T) {
8692 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008693 name string
8694 expectedError string
8695 bp string
8696 bootJars []string
8697 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008698 }{
8699
8700 {
8701 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8702 expectedError: "",
8703 bp: `
8704 java_library {
8705 name: "bcp_lib1",
8706 srcs: ["lib1/src/*.java"],
8707 permitted_packages: ["foo.bar"],
8708 apex_available: ["myapex"],
8709 sdk_version: "none",
8710 system_modules: "none",
8711 }
8712 java_library {
8713 name: "nonbcp_lib2",
8714 srcs: ["lib2/src/*.java"],
8715 apex_available: ["myapex"],
8716 permitted_packages: ["a.b"],
8717 sdk_version: "none",
8718 system_modules: "none",
8719 }
8720 apex {
8721 name: "myapex",
8722 key: "myapex.key",
8723 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008725 }`,
8726 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008727 bcpPermittedPackages: map[string][]string{
8728 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008729 "foo.bar",
8730 },
8731 },
8732 },
8733 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008734 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008735 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01008736 bp: `
8737 java_library {
8738 name: "bcp_lib1",
8739 srcs: ["lib1/src/*.java"],
8740 apex_available: ["myapex"],
8741 permitted_packages: ["foo.bar"],
8742 sdk_version: "none",
8743 system_modules: "none",
8744 }
8745 java_library {
8746 name: "bcp_lib2",
8747 srcs: ["lib2/src/*.java"],
8748 apex_available: ["myapex"],
8749 permitted_packages: ["foo.bar", "bar.baz"],
8750 sdk_version: "none",
8751 system_modules: "none",
8752 }
8753 apex {
8754 name: "myapex",
8755 key: "myapex.key",
8756 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008757 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008758 }
8759 `,
8760 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008761 bcpPermittedPackages: map[string][]string{
8762 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008763 "foo.bar",
8764 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008765 "bcp_lib2": []string{
8766 "foo.bar",
8767 },
8768 },
8769 },
8770 {
8771 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8772 expectedError: "",
8773 bp: `
8774 java_library {
8775 name: "bcp_lib_restricted",
8776 srcs: ["lib1/src/*.java"],
8777 apex_available: ["myapex"],
8778 permitted_packages: ["foo.bar"],
8779 sdk_version: "none",
8780 min_sdk_version: "29",
8781 system_modules: "none",
8782 }
8783 java_library {
8784 name: "bcp_lib_unrestricted",
8785 srcs: ["lib2/src/*.java"],
8786 apex_available: ["myapex"],
8787 permitted_packages: ["foo.bar", "bar.baz"],
8788 sdk_version: "none",
8789 min_sdk_version: "29",
8790 system_modules: "none",
8791 }
8792 apex {
8793 name: "myapex",
8794 key: "myapex.key",
8795 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8796 updatable: true,
8797 min_sdk_version: "29",
8798 }
8799 `,
8800 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8801 bcpPermittedPackages: map[string][]string{
8802 "bcp_lib1_non_updateable": []string{
8803 "foo.bar",
8804 },
8805 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008806 },
8807 },
8808 }
8809 for _, tc := range testcases {
8810 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008811 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8812 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008813 })
8814 }
8815}
8816
Jiyong Park62304bb2020-04-13 16:19:48 +09008817func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008818 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008819 apex {
8820 name: "myapex",
8821 key: "myapex.key",
8822 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008823 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008824 }
8825
8826 apex_key {
8827 name: "myapex.key",
8828 public_key: "testkey.avbpubkey",
8829 private_key: "testkey.pem",
8830 }
8831
8832 cc_library {
8833 name: "mylib",
8834 srcs: ["mylib.cpp"],
8835 system_shared_libs: [],
8836 stl: "none",
8837 stubs: {
8838 versions: ["1"],
8839 },
8840 apex_available: ["myapex"],
8841 }
8842
8843 cc_library {
8844 name: "myprivlib",
8845 srcs: ["mylib.cpp"],
8846 system_shared_libs: [],
8847 stl: "none",
8848 apex_available: ["myapex"],
8849 }
8850
8851
8852 cc_test {
8853 name: "mytest",
8854 gtest: false,
8855 srcs: ["mylib.cpp"],
8856 system_shared_libs: [],
8857 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008858 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008859 test_for: ["myapex"]
8860 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008861
8862 cc_library {
8863 name: "mytestlib",
8864 srcs: ["mylib.cpp"],
8865 system_shared_libs: [],
8866 shared_libs: ["mylib", "myprivlib"],
8867 stl: "none",
8868 test_for: ["myapex"],
8869 }
8870
8871 cc_benchmark {
8872 name: "mybench",
8873 srcs: ["mylib.cpp"],
8874 system_shared_libs: [],
8875 shared_libs: ["mylib", "myprivlib"],
8876 stl: "none",
8877 test_for: ["myapex"],
8878 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008879 `)
8880
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008881 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008882 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008883 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8884 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8885 }
8886
8887 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008888 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008889 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8890 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8891 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8892}
Jiyong Park46a512f2020-12-04 18:02:13 +09008893
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008894func TestIndirectTestFor(t *testing.T) {
8895 ctx := testApex(t, `
8896 apex {
8897 name: "myapex",
8898 key: "myapex.key",
8899 native_shared_libs: ["mylib", "myprivlib"],
8900 updatable: false,
8901 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008902
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008903 apex_key {
8904 name: "myapex.key",
8905 public_key: "testkey.avbpubkey",
8906 private_key: "testkey.pem",
8907 }
8908
8909 cc_library {
8910 name: "mylib",
8911 srcs: ["mylib.cpp"],
8912 system_shared_libs: [],
8913 stl: "none",
8914 stubs: {
8915 versions: ["1"],
8916 },
8917 apex_available: ["myapex"],
8918 }
8919
8920 cc_library {
8921 name: "myprivlib",
8922 srcs: ["mylib.cpp"],
8923 system_shared_libs: [],
8924 stl: "none",
8925 shared_libs: ["mylib"],
8926 apex_available: ["myapex"],
8927 }
8928
8929 cc_library {
8930 name: "mytestlib",
8931 srcs: ["mylib.cpp"],
8932 system_shared_libs: [],
8933 shared_libs: ["myprivlib"],
8934 stl: "none",
8935 test_for: ["myapex"],
8936 }
8937 `)
8938
8939 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008940 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008941 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8942 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8943 }
8944
8945 // The platform variant of mytestlib links to the platform variant of the
8946 // internal myprivlib.
8947 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8948
8949 // The platform variant of myprivlib links to the platform variant of mylib
8950 // and bypasses its stubs.
8951 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 +09008952}
8953
Martin Stjernholmec009002021-03-27 15:18:31 +00008954func TestTestForForLibInOtherApex(t *testing.T) {
8955 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8956 _ = testApex(t, `
8957 apex {
8958 name: "com.android.art",
8959 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008960 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008961 updatable: false,
8962 }
8963
8964 apex {
8965 name: "com.android.art.debug",
8966 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008967 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008968 updatable: false,
8969 }
8970
8971 apex_key {
8972 name: "myapex.key",
8973 public_key: "testkey.avbpubkey",
8974 private_key: "testkey.pem",
8975 }
8976
8977 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008978 name: "libnativebridge",
8979 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008980 system_shared_libs: [],
8981 stl: "none",
8982 stubs: {
8983 versions: ["1"],
8984 },
8985 apex_available: ["com.android.art", "com.android.art.debug"],
8986 }
8987
8988 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008989 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008990 srcs: ["mylib.cpp"],
8991 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008992 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008993 stl: "none",
8994 apex_available: ["com.android.art.debug"],
8995 test_for: ["com.android.art"],
8996 }
8997 `,
8998 android.MockFS{
8999 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9000 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9001 }.AddToFixture())
9002}
9003
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009004// TODO(jungjw): Move this to proptools
9005func intPtr(i int) *int {
9006 return &i
9007}
9008
9009func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009010 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009011 apex_set {
9012 name: "myapex",
9013 set: "myapex.apks",
9014 filename: "foo_v2.apex",
9015 overrides: ["foo"],
9016 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009017 `,
9018 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9019 variables.Platform_sdk_version = intPtr(30)
9020 }),
9021 android.FixtureModifyConfig(func(config android.Config) {
9022 config.Targets[android.Android] = []android.Target{
9023 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9024 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9025 }
9026 }),
9027 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009028
Paul Duffin24704672021-04-06 16:09:30 +01009029 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009030
9031 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009032 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033 actual := extractedApex.Args["abis"]
9034 expected := "ARMEABI_V7A,ARM64_V8A"
9035 if actual != expected {
9036 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9037 }
9038 actual = extractedApex.Args["sdk-version"]
9039 expected = "30"
9040 if actual != expected {
9041 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9042 }
9043
Paul Duffin6717d882021-06-15 19:09:41 +01009044 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009045 a := m.Module().(*ApexSet)
9046 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009047 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009048 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9049 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9050 }
9051}
9052
Anton Hansson805e0a52022-11-25 14:06:46 +00009053func TestApexSet_NativeBridge(t *testing.T) {
9054 ctx := testApex(t, `
9055 apex_set {
9056 name: "myapex",
9057 set: "myapex.apks",
9058 filename: "foo_v2.apex",
9059 overrides: ["foo"],
9060 }
9061 `,
9062 android.FixtureModifyConfig(func(config android.Config) {
9063 config.Targets[android.Android] = []android.Target{
9064 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9065 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9066 }
9067 }),
9068 )
9069
9070 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9071
9072 // Check extract_apks tool parameters. No native bridge arch expected
9073 extractedApex := m.Output("extracted/myapex.apks")
9074 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9075}
9076
Jiyong Park7d95a512020-05-10 15:16:24 +09009077func TestNoStaticLinkingToStubsLib(t *testing.T) {
9078 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9079 apex {
9080 name: "myapex",
9081 key: "myapex.key",
9082 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009083 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009084 }
9085
9086 apex_key {
9087 name: "myapex.key",
9088 public_key: "testkey.avbpubkey",
9089 private_key: "testkey.pem",
9090 }
9091
9092 cc_library {
9093 name: "mylib",
9094 srcs: ["mylib.cpp"],
9095 static_libs: ["otherlib"],
9096 system_shared_libs: [],
9097 stl: "none",
9098 apex_available: [ "myapex" ],
9099 }
9100
9101 cc_library {
9102 name: "otherlib",
9103 srcs: ["mylib.cpp"],
9104 system_shared_libs: [],
9105 stl: "none",
9106 stubs: {
9107 versions: ["1", "2", "3"],
9108 },
9109 apex_available: [ "myapex" ],
9110 }
9111 `)
9112}
9113
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009114func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009115 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009116 apex {
9117 name: "myapex",
9118 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009119 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009120 custom_sign_tool: "sign_myapex",
9121 }
9122
9123 apex_key {
9124 name: "myapex.key",
9125 public_key: "testkey.avbpubkey",
9126 private_key: "testkey.pem",
9127 }
9128 `)
9129
Jooyung Han286957d2023-10-30 16:17:56 +09009130 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
9131 content := myapex.Output("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009132 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009133}
9134
9135func TestApexKeysTxtOverrides(t *testing.T) {
9136 ctx := testApex(t, `
9137 apex {
9138 name: "myapex",
9139 key: "myapex.key",
9140 updatable: false,
9141 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009142 }
9143
9144 apex_key {
9145 name: "myapex.key",
9146 public_key: "testkey.avbpubkey",
9147 private_key: "testkey.pem",
9148 }
9149
9150 prebuilt_apex {
9151 name: "myapex",
9152 prefer: true,
9153 arch: {
9154 arm64: {
9155 src: "myapex-arm64.apex",
9156 },
9157 arm: {
9158 src: "myapex-arm.apex",
9159 },
9160 },
9161 }
9162
9163 apex_set {
9164 name: "myapex_set",
9165 set: "myapex.apks",
9166 filename: "myapex_set.apex",
9167 overrides: ["myapex"],
9168 }
9169 `)
9170
Jooyung Han286957d2023-10-30 16:17:56 +09009171 content := ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt").BuildParams.Args["content"]
9172 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
9173 content = ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt").BuildParams.Args["content"]
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009174 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009175}
9176
Jooyung Han938b5932020-06-20 12:47:47 +09009177func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009178 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009179 apex {
9180 name: "myapex",
9181 key: "myapex.key",
9182 apps: ["app"],
9183 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009184 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009185 }
9186
9187 apex_key {
9188 name: "myapex.key",
9189 public_key: "testkey.avbpubkey",
9190 private_key: "testkey.pem",
9191 }
9192
9193 android_app {
9194 name: "app",
9195 srcs: ["foo/bar/MyClass.java"],
9196 package_name: "foo",
9197 sdk_version: "none",
9198 system_modules: "none",
9199 apex_available: [ "myapex" ],
9200 }
9201 `, withFiles(map[string][]byte{
9202 "sub/Android.bp": []byte(`
9203 override_apex {
9204 name: "override_myapex",
9205 base: "myapex",
9206 apps: ["override_app"],
9207 allowed_files: ":allowed",
9208 }
9209 // Overridable "path" property should be referenced indirectly
9210 filegroup {
9211 name: "allowed",
9212 srcs: ["allowed.txt"],
9213 }
9214 override_android_app {
9215 name: "override_app",
9216 base: "app",
9217 package_name: "bar",
9218 }
9219 `),
9220 }))
9221
Jooyung Hana0503a52023-08-23 13:12:50 +09009222 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009223 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9224 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9225 }
9226
Jooyung Hana0503a52023-08-23 13:12:50 +09009227 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009228 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9229 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9230 }
9231}
9232
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009233func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009234 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009235 apex {
9236 name: "myapex",
9237 key: "myapex.key",
9238 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009239 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009240 }
9241
9242 apex_key {
9243 name: "myapex.key",
9244 public_key: "testkey.avbpubkey",
9245 private_key: "testkey.pem",
9246 }
9247
9248 cc_library {
9249 name: "mylib",
9250 srcs: ["mylib.cpp"],
9251 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009252 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009253 },
9254 apex_available: ["myapex"],
9255 }
9256
9257 cc_prebuilt_library_shared {
9258 name: "mylib",
9259 prefer: false,
9260 srcs: ["prebuilt.so"],
9261 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009262 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009263 },
9264 apex_available: ["myapex"],
9265 }
9266 `)
9267}
9268
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009269func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009270 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009271 apex {
9272 name: "myapex",
9273 key: "myapex.key",
9274 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009275 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009276 }
9277 apex_key {
9278 name: "myapex.key",
9279 public_key: "testkey.avbpubkey",
9280 private_key: "testkey.pem",
9281 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009282 `,
9283 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9284 variables.CompressedApex = proptools.BoolPtr(true)
9285 }),
9286 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009287
Jooyung Hana0503a52023-08-23 13:12:50 +09009288 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009289 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9290
Jooyung Hana0503a52023-08-23 13:12:50 +09009291 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009292 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9293
9294 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009295 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009296 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9297
9298 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009299 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009300 var builder strings.Builder
9301 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9302 androidMk := builder.String()
9303 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9304}
9305
Martin Stjernholm2856c662020-12-02 15:03:42 +00009306func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009307 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009308 apex {
9309 name: "myapex",
9310 key: "myapex.key",
9311 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009312 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009313 }
9314
9315 apex_key {
9316 name: "myapex.key",
9317 public_key: "testkey.avbpubkey",
9318 private_key: "testkey.pem",
9319 }
9320
9321 cc_library {
9322 name: "mylib",
9323 srcs: ["mylib.cpp"],
9324 apex_available: ["myapex"],
9325 shared_libs: ["otherlib"],
9326 system_shared_libs: [],
9327 }
9328
9329 cc_library {
9330 name: "otherlib",
9331 srcs: ["mylib.cpp"],
9332 stubs: {
9333 versions: ["current"],
9334 },
9335 }
9336
9337 cc_prebuilt_library_shared {
9338 name: "otherlib",
9339 prefer: true,
9340 srcs: ["prebuilt.so"],
9341 stubs: {
9342 versions: ["current"],
9343 },
9344 }
9345 `)
9346
Jooyung Hana0503a52023-08-23 13:12:50 +09009347 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009348 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009349 var builder strings.Builder
9350 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9351 androidMk := builder.String()
9352
9353 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9354 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009355 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009356}
9357
Jiyong Parke3867542020-12-03 17:28:25 +09009358func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009359 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009360 apex {
9361 name: "myapex",
9362 key: "myapex.key",
9363 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009364 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009365 }
9366
9367 apex_key {
9368 name: "myapex.key",
9369 public_key: "testkey.avbpubkey",
9370 private_key: "testkey.pem",
9371 }
9372
9373 cc_library {
9374 name: "mylib",
9375 srcs: ["mylib.cpp"],
9376 system_shared_libs: [],
9377 stl: "none",
9378 apex_available: ["myapex"],
9379 shared_libs: ["mylib2"],
9380 target: {
9381 apex: {
9382 exclude_shared_libs: ["mylib2"],
9383 },
9384 },
9385 }
9386
9387 cc_library {
9388 name: "mylib2",
9389 srcs: ["mylib.cpp"],
9390 system_shared_libs: [],
9391 stl: "none",
9392 }
9393 `)
9394
9395 // Check if mylib is linked to mylib2 for the non-apex target
9396 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9397 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9398
9399 // Make sure that the link doesn't occur for the apex target
9400 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9401 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9402
9403 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009404 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009405 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9406}
9407
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009408func TestPrebuiltStubLibDep(t *testing.T) {
9409 bpBase := `
9410 apex {
9411 name: "myapex",
9412 key: "myapex.key",
9413 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009414 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009415 }
9416 apex_key {
9417 name: "myapex.key",
9418 public_key: "testkey.avbpubkey",
9419 private_key: "testkey.pem",
9420 }
9421 cc_library {
9422 name: "mylib",
9423 srcs: ["mylib.cpp"],
9424 apex_available: ["myapex"],
9425 shared_libs: ["stublib"],
9426 system_shared_libs: [],
9427 }
9428 apex {
9429 name: "otherapex",
9430 enabled: %s,
9431 key: "myapex.key",
9432 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009433 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009434 }
9435 `
9436
9437 stublibSourceBp := `
9438 cc_library {
9439 name: "stublib",
9440 srcs: ["mylib.cpp"],
9441 apex_available: ["otherapex"],
9442 system_shared_libs: [],
9443 stl: "none",
9444 stubs: {
9445 versions: ["1"],
9446 },
9447 }
9448 `
9449
9450 stublibPrebuiltBp := `
9451 cc_prebuilt_library_shared {
9452 name: "stublib",
9453 srcs: ["prebuilt.so"],
9454 apex_available: ["otherapex"],
9455 stubs: {
9456 versions: ["1"],
9457 },
9458 %s
9459 }
9460 `
9461
9462 tests := []struct {
9463 name string
9464 stublibBp string
9465 usePrebuilt bool
9466 modNames []string // Modules to collect AndroidMkEntries for
9467 otherApexEnabled []string
9468 }{
9469 {
9470 name: "only_source",
9471 stublibBp: stublibSourceBp,
9472 usePrebuilt: false,
9473 modNames: []string{"stublib"},
9474 otherApexEnabled: []string{"true", "false"},
9475 },
9476 {
9477 name: "source_preferred",
9478 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9479 usePrebuilt: false,
9480 modNames: []string{"stublib", "prebuilt_stublib"},
9481 otherApexEnabled: []string{"true", "false"},
9482 },
9483 {
9484 name: "prebuilt_preferred",
9485 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9486 usePrebuilt: true,
9487 modNames: []string{"stublib", "prebuilt_stublib"},
9488 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9489 },
9490 {
9491 name: "only_prebuilt",
9492 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9493 usePrebuilt: true,
9494 modNames: []string{"stublib"},
9495 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9496 },
9497 }
9498
9499 for _, test := range tests {
9500 t.Run(test.name, func(t *testing.T) {
9501 for _, otherApexEnabled := range test.otherApexEnabled {
9502 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009503 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009504
9505 type modAndMkEntries struct {
9506 mod *cc.Module
9507 mkEntries android.AndroidMkEntries
9508 }
9509 entries := []*modAndMkEntries{}
9510
9511 // Gather shared lib modules that are installable
9512 for _, modName := range test.modNames {
9513 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9514 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9515 continue
9516 }
9517 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009518 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009519 continue
9520 }
Colin Crossaa255532020-07-03 13:18:24 -07009521 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009522 if ent.Disabled {
9523 continue
9524 }
9525 entries = append(entries, &modAndMkEntries{
9526 mod: mod,
9527 mkEntries: ent,
9528 })
9529 }
9530 }
9531 }
9532
9533 var entry *modAndMkEntries = nil
9534 for _, ent := range entries {
9535 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9536 if entry != nil {
9537 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9538 } else {
9539 entry = ent
9540 }
9541 }
9542 }
9543
9544 if entry == nil {
9545 t.Errorf("AndroidMk entry for \"stublib\" missing")
9546 } else {
9547 isPrebuilt := entry.mod.Prebuilt() != nil
9548 if isPrebuilt != test.usePrebuilt {
9549 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9550 }
9551 if !entry.mod.IsStubs() {
9552 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9553 }
9554 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9555 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9556 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009557 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009558 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009559 if !android.InList(expected, cflags) {
9560 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9561 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009562 }
9563 })
9564 }
9565 })
9566 }
9567}
9568
Colin Crossc33e5212021-05-25 18:16:02 -07009569func TestApexJavaCoverage(t *testing.T) {
9570 bp := `
9571 apex {
9572 name: "myapex",
9573 key: "myapex.key",
9574 java_libs: ["mylib"],
9575 bootclasspath_fragments: ["mybootclasspathfragment"],
9576 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9577 updatable: false,
9578 }
9579
9580 apex_key {
9581 name: "myapex.key",
9582 public_key: "testkey.avbpubkey",
9583 private_key: "testkey.pem",
9584 }
9585
9586 java_library {
9587 name: "mylib",
9588 srcs: ["mylib.java"],
9589 apex_available: ["myapex"],
9590 compile_dex: true,
9591 }
9592
9593 bootclasspath_fragment {
9594 name: "mybootclasspathfragment",
9595 contents: ["mybootclasspathlib"],
9596 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009597 hidden_api: {
9598 split_packages: ["*"],
9599 },
Colin Crossc33e5212021-05-25 18:16:02 -07009600 }
9601
9602 java_library {
9603 name: "mybootclasspathlib",
9604 srcs: ["mybootclasspathlib.java"],
9605 apex_available: ["myapex"],
9606 compile_dex: true,
9607 }
9608
9609 systemserverclasspath_fragment {
9610 name: "mysystemserverclasspathfragment",
9611 contents: ["mysystemserverclasspathlib"],
9612 apex_available: ["myapex"],
9613 }
9614
9615 java_library {
9616 name: "mysystemserverclasspathlib",
9617 srcs: ["mysystemserverclasspathlib.java"],
9618 apex_available: ["myapex"],
9619 compile_dex: true,
9620 }
9621 `
9622
9623 result := android.GroupFixturePreparers(
9624 PrepareForTestWithApexBuildComponents,
9625 prepareForTestWithMyapex,
9626 java.PrepareForTestWithJavaDefaultModules,
9627 android.PrepareForTestWithAndroidBuildComponents,
9628 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009629 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9630 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009631 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009632 ).RunTest(t)
9633
9634 // Make sure jacoco ran on both mylib and mybootclasspathlib
9635 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9636 t.Errorf("Failed to find jacoco rule for mylib")
9637 }
9638 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9639 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9640 }
9641 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9642 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9643 }
9644}
9645
Jiyong Park192600a2021-08-03 07:52:17 +00009646func TestProhibitStaticExecutable(t *testing.T) {
9647 testApexError(t, `executable mybin is static`, `
9648 apex {
9649 name: "myapex",
9650 key: "myapex.key",
9651 binaries: ["mybin"],
9652 min_sdk_version: "29",
9653 }
9654
9655 apex_key {
9656 name: "myapex.key",
9657 public_key: "testkey.avbpubkey",
9658 private_key: "testkey.pem",
9659 }
9660
9661 cc_binary {
9662 name: "mybin",
9663 srcs: ["mylib.cpp"],
9664 relative_install_path: "foo/bar",
9665 static_executable: true,
9666 system_shared_libs: [],
9667 stl: "none",
9668 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009669 min_sdk_version: "29",
9670 }
9671 `)
9672
9673 testApexError(t, `executable mybin.rust is static`, `
9674 apex {
9675 name: "myapex",
9676 key: "myapex.key",
9677 binaries: ["mybin.rust"],
9678 min_sdk_version: "29",
9679 }
9680
9681 apex_key {
9682 name: "myapex.key",
9683 public_key: "testkey.avbpubkey",
9684 private_key: "testkey.pem",
9685 }
9686
9687 rust_binary {
9688 name: "mybin.rust",
9689 srcs: ["foo.rs"],
9690 static_executable: true,
9691 apex_available: ["myapex"],
9692 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009693 }
9694 `)
9695}
9696
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009697func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9698 ctx := testApex(t, `
9699 apex {
9700 name: "myapex",
9701 key: "myapex.key",
9702 updatable: false,
9703 java_libs: ["foo"],
9704 }
9705
9706 apex_key {
9707 name: "myapex.key",
9708 public_key: "testkey.avbpubkey",
9709 private_key: "testkey.pem",
9710 }
9711
9712 java_library {
9713 name: "foo",
9714 srcs: ["foo.java"],
9715 apex_available: ["myapex"],
9716 installable: true,
9717 }
9718 `,
9719 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9720 )
9721
Jooyung Hana0503a52023-08-23 13:12:50 +09009722 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009723 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9724 var builder strings.Builder
9725 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9726 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009727 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009728}
9729
9730func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9731 ctx := testApex(t, `
9732 prebuilt_apex {
9733 name: "myapex",
9734 arch: {
9735 arm64: {
9736 src: "myapex-arm64.apex",
9737 },
9738 arm: {
9739 src: "myapex-arm.apex",
9740 },
9741 },
9742 exported_java_libs: ["foo"],
9743 }
9744
9745 java_import {
9746 name: "foo",
9747 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009748 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009749 }
9750 `,
9751 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9752 )
9753
9754 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9755 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9756 mainModuleEntries := entriesList[0]
9757 android.AssertArrayString(t,
9758 "LOCAL_REQUIRED_MODULES",
9759 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9760 []string{
9761 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9762 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9763 })
9764}
9765
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009766func TestAndroidMk_RequiredModules(t *testing.T) {
9767 ctx := testApex(t, `
9768 apex {
9769 name: "myapex",
9770 key: "myapex.key",
9771 updatable: false,
9772 java_libs: ["foo"],
9773 required: ["otherapex"],
9774 }
9775
9776 apex {
9777 name: "otherapex",
9778 key: "myapex.key",
9779 updatable: false,
9780 java_libs: ["foo"],
9781 required: ["otherapex"],
9782 }
9783
9784 apex_key {
9785 name: "myapex.key",
9786 public_key: "testkey.avbpubkey",
9787 private_key: "testkey.pem",
9788 }
9789
9790 java_library {
9791 name: "foo",
9792 srcs: ["foo.java"],
9793 apex_available: ["myapex", "otherapex"],
9794 installable: true,
9795 }
9796 `)
9797
Jooyung Hana0503a52023-08-23 13:12:50 +09009798 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009799 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9800 var builder strings.Builder
9801 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9802 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009803 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009804}
9805
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009806func TestAndroidMk_RequiredDeps(t *testing.T) {
9807 ctx := testApex(t, `
9808 apex {
9809 name: "myapex",
9810 key: "myapex.key",
9811 updatable: false,
9812 }
9813
9814 apex_key {
9815 name: "myapex.key",
9816 public_key: "testkey.avbpubkey",
9817 private_key: "testkey.pem",
9818 }
9819 `)
9820
Jooyung Hana0503a52023-08-23 13:12:50 +09009821 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009822 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009823 data := android.AndroidMkDataForTest(t, ctx, bundle)
9824 var builder strings.Builder
9825 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9826 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009827 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009828}
9829
Jooyung Hana6d36672022-02-24 13:58:07 +09009830func TestApexOutputFileProducer(t *testing.T) {
9831 for _, tc := range []struct {
9832 name string
9833 ref string
9834 expected_data []string
9835 }{
9836 {
9837 name: "test_using_output",
9838 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009839 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009840 },
9841 {
9842 name: "test_using_apex",
9843 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009844 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009845 },
9846 } {
9847 t.Run(tc.name, func(t *testing.T) {
9848 ctx := testApex(t, `
9849 apex {
9850 name: "myapex",
9851 key: "myapex.key",
9852 compressible: true,
9853 updatable: false,
9854 }
9855
9856 apex_key {
9857 name: "myapex.key",
9858 public_key: "testkey.avbpubkey",
9859 private_key: "testkey.pem",
9860 }
9861
9862 java_test {
9863 name: "`+tc.name+`",
9864 srcs: ["a.java"],
9865 data: ["`+tc.ref+`"],
9866 }
9867 `,
9868 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9869 variables.CompressedApex = proptools.BoolPtr(true)
9870 }))
9871 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9872 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9873 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9874 })
9875 }
9876}
9877
satayev758968a2021-12-06 11:42:40 +00009878func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9879 preparer := android.GroupFixturePreparers(
9880 PrepareForTestWithApexBuildComponents,
9881 prepareForTestWithMyapex,
9882 java.PrepareForTestWithJavaSdkLibraryFiles,
9883 java.PrepareForTestWithJavaDefaultModules,
9884 android.PrepareForTestWithAndroidBuildComponents,
9885 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9886 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9887 )
9888
9889 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9890 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9891 preparer.RunTestWithBp(t, `
9892 apex {
9893 name: "myapex",
9894 key: "myapex.key",
9895 bootclasspath_fragments: ["mybootclasspathfragment"],
9896 min_sdk_version: "30",
9897 updatable: false,
9898 }
9899
9900 apex_key {
9901 name: "myapex.key",
9902 public_key: "testkey.avbpubkey",
9903 private_key: "testkey.pem",
9904 }
9905
9906 bootclasspath_fragment {
9907 name: "mybootclasspathfragment",
9908 contents: ["mybootclasspathlib"],
9909 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009910 hidden_api: {
9911 split_packages: ["*"],
9912 },
satayev758968a2021-12-06 11:42:40 +00009913 }
9914
9915 java_sdk_library {
9916 name: "mybootclasspathlib",
9917 srcs: ["mybootclasspathlib.java"],
9918 apex_available: ["myapex"],
9919 compile_dex: true,
9920 unsafe_ignore_missing_latest_api: true,
9921 min_sdk_version: "31",
9922 static_libs: ["util"],
9923 }
9924
9925 java_library {
9926 name: "util",
9927 srcs: ["a.java"],
9928 apex_available: ["myapex"],
9929 min_sdk_version: "31",
9930 static_libs: ["another_util"],
9931 }
9932
9933 java_library {
9934 name: "another_util",
9935 srcs: ["a.java"],
9936 min_sdk_version: "31",
9937 apex_available: ["myapex"],
9938 }
9939 `)
9940 })
9941
9942 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9943 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9944 preparer.RunTestWithBp(t, `
9945 apex {
9946 name: "myapex",
9947 key: "myapex.key",
9948 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9949 min_sdk_version: "30",
9950 updatable: false,
9951 }
9952
9953 apex_key {
9954 name: "myapex.key",
9955 public_key: "testkey.avbpubkey",
9956 private_key: "testkey.pem",
9957 }
9958
9959 systemserverclasspath_fragment {
9960 name: "mysystemserverclasspathfragment",
9961 contents: ["mysystemserverclasspathlib"],
9962 apex_available: ["myapex"],
9963 }
9964
9965 java_sdk_library {
9966 name: "mysystemserverclasspathlib",
9967 srcs: ["mysystemserverclasspathlib.java"],
9968 apex_available: ["myapex"],
9969 compile_dex: true,
9970 min_sdk_version: "32",
9971 unsafe_ignore_missing_latest_api: true,
9972 static_libs: ["util"],
9973 }
9974
9975 java_library {
9976 name: "util",
9977 srcs: ["a.java"],
9978 apex_available: ["myapex"],
9979 min_sdk_version: "31",
9980 static_libs: ["another_util"],
9981 }
9982
9983 java_library {
9984 name: "another_util",
9985 srcs: ["a.java"],
9986 min_sdk_version: "31",
9987 apex_available: ["myapex"],
9988 }
9989 `)
9990 })
9991
9992 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
9993 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
9994 RunTestWithBp(t, `
9995 apex {
9996 name: "myapex",
9997 key: "myapex.key",
9998 bootclasspath_fragments: ["mybootclasspathfragment"],
9999 min_sdk_version: "30",
10000 updatable: false,
10001 }
10002
10003 apex_key {
10004 name: "myapex.key",
10005 public_key: "testkey.avbpubkey",
10006 private_key: "testkey.pem",
10007 }
10008
10009 bootclasspath_fragment {
10010 name: "mybootclasspathfragment",
10011 contents: ["mybootclasspathlib"],
10012 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010013 hidden_api: {
10014 split_packages: ["*"],
10015 },
satayev758968a2021-12-06 11:42:40 +000010016 }
10017
10018 java_sdk_library {
10019 name: "mybootclasspathlib",
10020 srcs: ["mybootclasspathlib.java"],
10021 apex_available: ["myapex"],
10022 compile_dex: true,
10023 unsafe_ignore_missing_latest_api: true,
10024 }
10025 `)
10026 })
10027
10028 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10029 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10030 RunTestWithBp(t, `
10031 apex {
10032 name: "myapex",
10033 key: "myapex.key",
10034 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10035 min_sdk_version: "30",
10036 updatable: false,
10037 }
10038
10039 apex_key {
10040 name: "myapex.key",
10041 public_key: "testkey.avbpubkey",
10042 private_key: "testkey.pem",
10043 }
10044
10045 systemserverclasspath_fragment {
10046 name: "mysystemserverclasspathfragment",
10047 contents: ["mysystemserverclasspathlib"],
10048 apex_available: ["myapex"],
10049 }
10050
10051 java_sdk_library {
10052 name: "mysystemserverclasspathlib",
10053 srcs: ["mysystemserverclasspathlib.java"],
10054 apex_available: ["myapex"],
10055 compile_dex: true,
10056 unsafe_ignore_missing_latest_api: true,
10057 }
10058 `)
10059 })
10060}
10061
Jiakai Zhang6decef92022-01-12 17:56:19 +000010062// Verifies that the APEX depends on all the Make modules in the list.
10063func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10064 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10065 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010066 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010067 }
10068}
10069
10070// Verifies that the APEX does not depend on any of the Make modules in the list.
10071func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10072 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10073 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010074 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010075 }
10076}
10077
Cole Faust1021ccd2023-02-26 21:15:25 -080010078// TODO(b/193460475): Re-enable this test
10079//func TestApexStrictUpdtabilityLint(t *testing.T) {
10080// bpTemplate := `
10081// apex {
10082// name: "myapex",
10083// key: "myapex.key",
10084// java_libs: ["myjavalib"],
10085// updatable: %v,
10086// min_sdk_version: "29",
10087// }
10088// apex_key {
10089// name: "myapex.key",
10090// }
10091// java_library {
10092// name: "myjavalib",
10093// srcs: ["MyClass.java"],
10094// apex_available: [ "myapex" ],
10095// lint: {
10096// strict_updatability_linting: %v,
10097// },
10098// sdk_version: "current",
10099// min_sdk_version: "29",
10100// }
10101// `
10102// fs := android.MockFS{
10103// "lint-baseline.xml": nil,
10104// }
10105//
10106// testCases := []struct {
10107// testCaseName string
10108// apexUpdatable bool
10109// javaStrictUpdtabilityLint bool
10110// lintFileExists bool
10111// disallowedFlagExpected bool
10112// }{
10113// {
10114// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10115// apexUpdatable: true,
10116// javaStrictUpdtabilityLint: true,
10117// lintFileExists: false,
10118// disallowedFlagExpected: false,
10119// },
10120// {
10121// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10122// apexUpdatable: false,
10123// javaStrictUpdtabilityLint: false,
10124// lintFileExists: true,
10125// disallowedFlagExpected: false,
10126// },
10127// {
10128// testCaseName: "non-updatable apex respects strict updatability of javalib",
10129// apexUpdatable: false,
10130// javaStrictUpdtabilityLint: true,
10131// lintFileExists: true,
10132// disallowedFlagExpected: true,
10133// },
10134// {
10135// testCaseName: "updatable apex sets strict updatability of javalib to true",
10136// apexUpdatable: true,
10137// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10138// lintFileExists: true,
10139// disallowedFlagExpected: true,
10140// },
10141// }
10142//
10143// for _, testCase := range testCases {
10144// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10145// fixtures := []android.FixturePreparer{}
10146// if testCase.lintFileExists {
10147// fixtures = append(fixtures, fs.AddToFixture())
10148// }
10149//
10150// result := testApex(t, bp, fixtures...)
10151// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10152// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10153// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10154//
10155// if disallowedFlagActual != testCase.disallowedFlagExpected {
10156// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10157// }
10158// }
10159//}
10160//
10161//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10162// bp := `
10163// apex {
10164// name: "myapex",
10165// key: "myapex.key",
10166// java_libs: ["myjavalib"],
10167// updatable: true,
10168// min_sdk_version: "29",
10169// }
10170// apex_key {
10171// name: "myapex.key",
10172// }
10173// java_library {
10174// name: "myjavalib",
10175// srcs: ["MyClass.java"],
10176// apex_available: [ "myapex" ],
10177// sdk_version: "current",
10178// min_sdk_version: "29",
10179// }
10180// `
10181//
10182// testCases := []struct {
10183// testCaseName string
10184// moduleDirectory string
10185// disallowedFlagExpected bool
10186// }{
10187// {
10188// testCaseName: "lintable module defined outside libcore",
10189// moduleDirectory: "",
10190// disallowedFlagExpected: true,
10191// },
10192// {
10193// testCaseName: "lintable module defined in libcore root directory",
10194// moduleDirectory: "libcore/",
10195// disallowedFlagExpected: false,
10196// },
10197// {
10198// testCaseName: "lintable module defined in libcore child directory",
10199// moduleDirectory: "libcore/childdir/",
10200// disallowedFlagExpected: true,
10201// },
10202// }
10203//
10204// for _, testCase := range testCases {
10205// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10206// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10207// result := testApex(t, "", lintFileCreator, bpFileCreator)
10208// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10209// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10210// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10211// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10212//
10213// if disallowedFlagActual != testCase.disallowedFlagExpected {
10214// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10215// }
10216// }
10217//}
10218//
10219//// checks transtive deps of an apex coming from bootclasspath_fragment
10220//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10221// bp := `
10222// apex {
10223// name: "myapex",
10224// key: "myapex.key",
10225// bootclasspath_fragments: ["mybootclasspathfragment"],
10226// updatable: true,
10227// min_sdk_version: "29",
10228// }
10229// apex_key {
10230// name: "myapex.key",
10231// }
10232// bootclasspath_fragment {
10233// name: "mybootclasspathfragment",
10234// contents: ["myjavalib"],
10235// apex_available: ["myapex"],
10236// hidden_api: {
10237// split_packages: ["*"],
10238// },
10239// }
10240// java_library {
10241// name: "myjavalib",
10242// srcs: ["MyClass.java"],
10243// apex_available: [ "myapex" ],
10244// sdk_version: "current",
10245// min_sdk_version: "29",
10246// compile_dex: true,
10247// }
10248// `
10249// fs := android.MockFS{
10250// "lint-baseline.xml": nil,
10251// }
10252//
10253// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10254// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10255// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10256// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10257// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10258// }
10259//}
Spandan Das66773252022-01-15 00:23:18 +000010260
Spandan Das42e89502022-05-06 22:12:55 +000010261// updatable apexes should propagate updatable=true to its apps
10262func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10263 bp := `
10264 apex {
10265 name: "myapex",
10266 key: "myapex.key",
10267 updatable: %v,
10268 apps: [
10269 "myapp",
10270 ],
10271 min_sdk_version: "30",
10272 }
10273 apex_key {
10274 name: "myapex.key",
10275 }
10276 android_app {
10277 name: "myapp",
10278 updatable: %v,
10279 apex_available: [
10280 "myapex",
10281 ],
10282 sdk_version: "current",
10283 min_sdk_version: "30",
10284 }
10285 `
10286 testCases := []struct {
10287 name string
10288 apex_is_updatable_bp bool
10289 app_is_updatable_bp bool
10290 app_is_updatable_expected bool
10291 }{
10292 {
10293 name: "Non-updatable apex respects updatable property of non-updatable app",
10294 apex_is_updatable_bp: false,
10295 app_is_updatable_bp: false,
10296 app_is_updatable_expected: false,
10297 },
10298 {
10299 name: "Non-updatable apex respects updatable property of updatable app",
10300 apex_is_updatable_bp: false,
10301 app_is_updatable_bp: true,
10302 app_is_updatable_expected: true,
10303 },
10304 {
10305 name: "Updatable apex respects updatable property of updatable app",
10306 apex_is_updatable_bp: true,
10307 app_is_updatable_bp: true,
10308 app_is_updatable_expected: true,
10309 },
10310 {
10311 name: "Updatable apex sets updatable=true on non-updatable app",
10312 apex_is_updatable_bp: true,
10313 app_is_updatable_bp: false,
10314 app_is_updatable_expected: true,
10315 },
10316 }
10317 for _, testCase := range testCases {
10318 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10319 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10320 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10321 }
10322}
10323
Kiyoung Kim487689e2022-07-26 09:48:22 +090010324func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10325 bp := `
10326 apex {
10327 name: "myapex",
10328 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010329 native_shared_libs: ["libbaz"],
10330 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010331 min_sdk_version: "29",
10332 }
10333 apex_key {
10334 name: "myapex.key",
10335 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010336 cc_binary {
10337 name: "binfoo",
10338 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010339 apex_available: ["myapex"],
10340 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010341 recovery_available: false,
10342 }
10343 cc_library {
10344 name: "libbar",
10345 srcs: ["libbar.cc"],
10346 stubs: {
10347 symbol_file: "libbar.map.txt",
10348 versions: [
10349 "29",
10350 ],
10351 },
10352 }
10353 cc_library {
10354 name: "libbaz",
10355 srcs: ["libbaz.cc"],
10356 apex_available: ["myapex"],
10357 min_sdk_version: "29",
10358 stubs: {
10359 symbol_file: "libbaz.map.txt",
10360 versions: [
10361 "29",
10362 ],
10363 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010364 }
10365 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010366 name: "libbar",
10367 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010368 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010369 variants: ["apex.29"],
10370 }
10371 cc_api_variant {
10372 name: "libbar",
10373 variant: "apex",
10374 version: "29",
10375 src: "libbar_apex_29.so",
10376 }
10377 cc_api_library {
10378 name: "libbaz",
10379 src: "libbaz_stub.so",
10380 min_sdk_version: "29",
10381 variants: ["apex.29"],
10382 }
10383 cc_api_variant {
10384 name: "libbaz",
10385 variant: "apex",
10386 version: "29",
10387 src: "libbaz_apex_29.so",
10388 }
10389 cc_api_library {
10390 name: "libqux",
10391 src: "libqux_stub.so",
10392 min_sdk_version: "29",
10393 variants: ["apex.29"],
10394 }
10395 cc_api_variant {
10396 name: "libqux",
10397 variant: "apex",
10398 version: "29",
10399 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010400 }
10401 api_imports {
10402 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010403 apex_shared_libs: [
10404 "libbar",
10405 "libbaz",
10406 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010407 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010408 }
10409 `
10410 result := testApex(t, bp)
10411
10412 hasDep := func(m android.Module, wantDep android.Module) bool {
10413 t.Helper()
10414 var found bool
10415 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10416 if dep == wantDep {
10417 found = true
10418 }
10419 })
10420 return found
10421 }
10422
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010423 // Library defines stubs and cc_api_library should be used with cc_api_library
10424 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10425 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10426 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010427
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010428 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10429 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010430
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010431 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10432 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10433 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10434 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10435
10436 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10437 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10438 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10439 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10440 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10441
10442 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10443 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10444 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10445
10446 // cc_api_library defined without original library should be linked with cc_api_library
10447 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10448 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10449 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10450}
10451
10452func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10453 bp := `
10454 apex {
10455 name: "myapex",
10456 key: "myapex.key",
10457 native_shared_libs: ["libbar"],
10458 min_sdk_version: "29",
10459 }
10460 apex_key {
10461 name: "myapex.key",
10462 }
10463 cc_binary {
10464 name: "binfoo",
10465 shared_libs: ["libbar"],
10466 recovery_available: false,
10467 }
10468 cc_library {
10469 name: "libbar",
10470 srcs: ["libbar.cc"],
10471 apex_available: ["myapex"],
10472 min_sdk_version: "29",
10473 stubs: {
10474 symbol_file: "libbar.map.txt",
10475 versions: [
10476 "29",
10477 ],
10478 },
10479 }
10480 cc_api_library {
10481 name: "libbar",
10482 src: "libbar_stub.so",
10483 variants: ["apex.29"],
10484 }
10485 cc_api_variant {
10486 name: "libbar",
10487 variant: "apex",
10488 version: "29",
10489 src: "libbar_apex_29.so",
10490 }
10491 api_imports {
10492 name: "api_imports",
10493 apex_shared_libs: [
10494 "libbar",
10495 ],
10496 }
10497 `
10498
10499 result := testApex(t, bp)
10500
10501 hasDep := func(m android.Module, wantDep android.Module) bool {
10502 t.Helper()
10503 var found bool
10504 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10505 if dep == wantDep {
10506 found = true
10507 }
10508 })
10509 return found
10510 }
10511
10512 // Library defines stubs and cc_api_library should be used with cc_api_library
10513 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10514 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10515 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10516
10517 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10518 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10519
10520 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10521 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10522 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10523 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010524}
Dennis Shend4f5d932023-01-31 20:27:21 +000010525
10526func TestTrimmedApex(t *testing.T) {
10527 bp := `
10528 apex {
10529 name: "myapex",
10530 key: "myapex.key",
10531 native_shared_libs: ["libfoo","libbaz"],
10532 min_sdk_version: "29",
10533 trim_against: "mydcla",
10534 }
10535 apex {
10536 name: "mydcla",
10537 key: "myapex.key",
10538 native_shared_libs: ["libfoo","libbar"],
10539 min_sdk_version: "29",
10540 file_contexts: ":myapex-file_contexts",
10541 dynamic_common_lib_apex: true,
10542 }
10543 apex_key {
10544 name: "myapex.key",
10545 }
10546 cc_library {
10547 name: "libfoo",
10548 shared_libs: ["libc"],
10549 apex_available: ["myapex","mydcla"],
10550 min_sdk_version: "29",
10551 }
10552 cc_library {
10553 name: "libbar",
10554 shared_libs: ["libc"],
10555 apex_available: ["myapex","mydcla"],
10556 min_sdk_version: "29",
10557 }
10558 cc_library {
10559 name: "libbaz",
10560 shared_libs: ["libc"],
10561 apex_available: ["myapex","mydcla"],
10562 min_sdk_version: "29",
10563 }
10564 cc_api_library {
10565 name: "libc",
10566 src: "libc.so",
10567 min_sdk_version: "29",
10568 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010569 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010570 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010571 }
10572 api_imports {
10573 name: "api_imports",
10574 shared_libs: [
10575 "libc",
10576 ],
10577 header_libs: [],
10578 }
10579 `
10580 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010581 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010582 apexRule := module.MaybeRule("apexRule")
10583 if apexRule.Rule == nil {
10584 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10585 }
10586
10587 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010588 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010589 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10590 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10591 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10592 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10593}
Jingwen Chendea7a642023-03-28 11:30:50 +000010594
10595func TestCannedFsConfig(t *testing.T) {
10596 ctx := testApex(t, `
10597 apex {
10598 name: "myapex",
10599 key: "myapex.key",
10600 updatable: false,
10601 }
10602
10603 apex_key {
10604 name: "myapex.key",
10605 public_key: "testkey.avbpubkey",
10606 private_key: "testkey.pem",
10607 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010608 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010609 generateFsRule := mod.Rule("generateFsConfig")
10610 cmd := generateFsRule.RuleParams.Command
10611
10612 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10613}
10614
10615func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10616 ctx := testApex(t, `
10617 apex {
10618 name: "myapex",
10619 key: "myapex.key",
10620 canned_fs_config: "my_config",
10621 updatable: false,
10622 }
10623
10624 apex_key {
10625 name: "myapex.key",
10626 public_key: "testkey.avbpubkey",
10627 private_key: "testkey.pem",
10628 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010629 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010630 generateFsRule := mod.Rule("generateFsConfig")
10631 cmd := generateFsRule.RuleParams.Command
10632
10633 // Ensure that canned_fs_config has "cat my_config" at the end
10634 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10635}
Spandan Das20fce2d2023-04-12 17:21:39 +000010636
10637func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10638 testCases := []struct {
10639 desc string
10640 hasStubs bool
10641 apexAvailable string
10642 expectedError string
10643 }{
10644 {
10645 desc: "non-stub library can have multiple apex_available",
10646 hasStubs: false,
10647 apexAvailable: `["myapex", "otherapex"]`,
10648 },
10649 {
10650 desc: "stub library should not be available to anyapex",
10651 hasStubs: true,
10652 apexAvailable: `["//apex_available:anyapex"]`,
10653 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10654 },
10655 {
10656 desc: "stub library should not be available to multiple apexes",
10657 hasStubs: true,
10658 apexAvailable: `["myapex", "otherapex"]`,
10659 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10660 },
10661 {
10662 desc: "stub library can be available to a core apex and a test apex",
10663 hasStubs: true,
10664 apexAvailable: `["myapex", "test_myapex"]`,
10665 },
10666 }
10667 bpTemplate := `
10668 cc_library {
10669 name: "libfoo",
10670 %v
10671 apex_available: %v,
10672 }
10673 apex {
10674 name: "myapex",
10675 key: "apex.key",
10676 updatable: false,
10677 native_shared_libs: ["libfoo"],
10678 }
10679 apex {
10680 name: "otherapex",
10681 key: "apex.key",
10682 updatable: false,
10683 }
10684 apex_test {
10685 name: "test_myapex",
10686 key: "apex.key",
10687 updatable: false,
10688 native_shared_libs: ["libfoo"],
10689 }
10690 apex_key {
10691 name: "apex.key",
10692 }
10693 `
10694 for _, tc := range testCases {
10695 stubs := ""
10696 if tc.hasStubs {
10697 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10698 }
10699 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10700 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10701 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10702 })
10703 if tc.expectedError == "" {
10704 testApex(t, bp, mockFsFixturePreparer)
10705 } else {
10706 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10707 }
10708 }
10709}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010710
10711func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10712 context := android.GroupFixturePreparers(
10713 android.PrepareForIntegrationTestWithAndroid,
10714 cc.PrepareForIntegrationTestWithCc,
10715 PrepareForTestWithApexBuildComponents,
10716 prepareForTestWithMyapex,
10717 filesystem.PrepareForTestWithFilesystemBuildComponents,
10718 )
10719 result := context.RunTestWithBp(t, `
10720 android_system_image {
10721 name: "myfilesystem",
10722 deps: [
10723 "libfoo",
10724 ],
10725 linker_config_src: "linker.config.json",
10726 }
10727
10728 cc_library {
10729 name: "libfoo",
10730 shared_libs: [
10731 "libbar",
10732 ],
10733 stl: "none",
10734 }
10735
10736 cc_library {
10737 name: "libbar",
10738 stl: "none",
10739 apex_available: ["myapex"],
10740 }
10741
10742 apex {
10743 name: "myapex",
10744 native_shared_libs: ["libbar"],
10745 key: "myapex.key",
10746 updatable: false,
10747 }
10748
10749 apex_key {
10750 name: "myapex.key",
10751 public_key: "testkey.avbpubkey",
10752 private_key: "testkey.pem",
10753 }
10754 `)
10755
10756 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10757 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10758 inputs.Strings(),
10759 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10760}
Yu Liueae7b362023-11-16 17:05:47 -080010761
10762var apex_default_bp = `
10763 apex_key {
10764 name: "myapex.key",
10765 public_key: "testkey.avbpubkey",
10766 private_key: "testkey.pem",
10767 }
10768
10769 filegroup {
10770 name: "myapex.manifest",
10771 srcs: ["apex_manifest.json"],
10772 }
10773
10774 filegroup {
10775 name: "myapex.androidmanifest",
10776 srcs: ["AndroidManifest.xml"],
10777 }
10778`
10779
10780func TestAconfigFilesJavaDeps(t *testing.T) {
10781 ctx := testApex(t, apex_default_bp+`
10782 apex {
10783 name: "myapex",
10784 manifest: ":myapex.manifest",
10785 androidManifest: ":myapex.androidmanifest",
10786 key: "myapex.key",
10787 java_libs: [
10788 "my_java_library_foo",
10789 "my_java_library_bar",
10790 ],
10791 updatable: false,
10792 }
10793
10794 java_library {
10795 name: "my_java_library_foo",
10796 srcs: ["foo/bar/MyClass.java"],
10797 sdk_version: "none",
10798 system_modules: "none",
10799 static_libs: ["my_java_aconfig_library_foo"],
10800 // TODO: remove //apex_available:platform
10801 apex_available: [
10802 "//apex_available:platform",
10803 "myapex",
10804 ],
10805 }
10806
10807 java_library {
10808 name: "my_java_library_bar",
10809 srcs: ["foo/bar/MyClass.java"],
10810 sdk_version: "none",
10811 system_modules: "none",
10812 static_libs: ["my_java_aconfig_library_bar"],
10813 // TODO: remove //apex_available:platform
10814 apex_available: [
10815 "//apex_available:platform",
10816 "myapex",
10817 ],
10818 }
10819
10820 aconfig_declarations {
10821 name: "my_aconfig_declarations_foo",
10822 package: "com.example.package",
10823 container: "myapex",
10824 srcs: ["foo.aconfig"],
10825 }
10826
10827 java_aconfig_library {
10828 name: "my_java_aconfig_library_foo",
10829 aconfig_declarations: "my_aconfig_declarations_foo",
10830 // TODO: remove //apex_available:platform
10831 apex_available: [
10832 "//apex_available:platform",
10833 "myapex",
10834 ],
10835 }
10836
10837 aconfig_declarations {
10838 name: "my_aconfig_declarations_bar",
10839 package: "com.example.package",
10840 container: "myapex",
10841 srcs: ["bar.aconfig"],
10842 }
10843
10844 java_aconfig_library {
10845 name: "my_java_aconfig_library_bar",
10846 aconfig_declarations: "my_aconfig_declarations_bar",
10847 // TODO: remove //apex_available:platform
10848 apex_available: [
10849 "//apex_available:platform",
10850 "myapex",
10851 ],
10852 }
10853 `)
10854
10855 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10856 s := mod.Rule("apexRule").Args["copy_commands"]
10857 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10858 if len(copyCmds) != 5 {
10859 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10860 }
10861
10862 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10863
10864 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10865 s = " " + combineAconfigRule.Args["cache_files"]
10866 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10867 if len(aconfigArgs) != 2 {
10868 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
10869 }
10870 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10871 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
10872
10873 buildParams := combineAconfigRule.BuildParams
10874 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10875 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
10876 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10877}
10878
10879func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10880 ctx := testApex(t, apex_default_bp+`
10881 apex {
10882 name: "myapex",
10883 manifest: ":myapex.manifest",
10884 androidManifest: ":myapex.androidmanifest",
10885 key: "myapex.key",
10886 java_libs: [
10887 "my_java_library_foo",
10888 ],
10889 native_shared_libs: [
10890 "my_cc_library_bar",
10891 ],
10892 binaries: [
10893 "my_cc_binary_baz",
10894 ],
10895 updatable: false,
10896 }
10897
10898 java_library {
10899 name: "my_java_library_foo",
10900 srcs: ["foo/bar/MyClass.java"],
10901 sdk_version: "none",
10902 system_modules: "none",
10903 static_libs: ["my_java_aconfig_library_foo"],
10904 // TODO: remove //apex_available:platform
10905 apex_available: [
10906 "//apex_available:platform",
10907 "myapex",
10908 ],
10909 }
10910
10911 cc_library {
10912 name: "my_cc_library_bar",
10913 srcs: ["foo/bar/MyClass.cc"],
10914 static_libs: ["my_cc_aconfig_library_bar"],
10915 // TODO: remove //apex_available:platform
10916 apex_available: [
10917 "//apex_available:platform",
10918 "myapex",
10919 ],
10920 }
10921
10922 cc_binary {
10923 name: "my_cc_binary_baz",
10924 srcs: ["foo/bar/MyClass.cc"],
10925 static_libs: ["my_cc_aconfig_library_baz"],
10926 // TODO: remove //apex_available:platform
10927 apex_available: [
10928 "//apex_available:platform",
10929 "myapex",
10930 ],
10931 }
10932
10933 aconfig_declarations {
10934 name: "my_aconfig_declarations_foo",
10935 package: "com.example.package",
10936 container: "myapex",
10937 srcs: ["foo.aconfig"],
10938 }
10939
10940 java_aconfig_library {
10941 name: "my_java_aconfig_library_foo",
10942 aconfig_declarations: "my_aconfig_declarations_foo",
10943 // TODO: remove //apex_available:platform
10944 apex_available: [
10945 "//apex_available:platform",
10946 "myapex",
10947 ],
10948 }
10949
10950 aconfig_declarations {
10951 name: "my_aconfig_declarations_bar",
10952 package: "com.example.package",
10953 container: "myapex",
10954 srcs: ["bar.aconfig"],
10955 }
10956
10957 cc_aconfig_library {
10958 name: "my_cc_aconfig_library_bar",
10959 aconfig_declarations: "my_aconfig_declarations_bar",
10960 // TODO: remove //apex_available:platform
10961 apex_available: [
10962 "//apex_available:platform",
10963 "myapex",
10964 ],
10965 }
10966
10967 aconfig_declarations {
10968 name: "my_aconfig_declarations_baz",
10969 package: "com.example.package",
10970 container: "myapex",
10971 srcs: ["baz.aconfig"],
10972 }
10973
10974 cc_aconfig_library {
10975 name: "my_cc_aconfig_library_baz",
10976 aconfig_declarations: "my_aconfig_declarations_baz",
10977 // TODO: remove //apex_available:platform
10978 apex_available: [
10979 "//apex_available:platform",
10980 "myapex",
10981 ],
10982 }
10983
10984 cc_library {
10985 name: "server_configurable_flags",
10986 srcs: ["server_configurable_flags.cc"],
10987 }
10988 `)
10989
10990 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10991 s := mod.Rule("apexRule").Args["copy_commands"]
10992 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10993 if len(copyCmds) != 9 {
10994 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
10995 }
10996
10997 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10998
10999 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11000 s = " " + combineAconfigRule.Args["cache_files"]
11001 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11002 if len(aconfigArgs) != 3 {
11003 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11004 }
11005 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11006 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11007 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11008
11009 buildParams := combineAconfigRule.BuildParams
11010 if len(buildParams.Inputs) != 3 {
11011 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11012 }
11013 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11014 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11015 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11016 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11017}
11018
11019func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11020 ctx := testApex(t, apex_default_bp+`
11021 apex {
11022 name: "myapex",
11023 manifest: ":myapex.manifest",
11024 androidManifest: ":myapex.androidmanifest",
11025 key: "myapex.key",
11026 java_libs: [
11027 "my_java_library_foo",
11028 "other_java_library_bar",
11029 ],
11030 updatable: false,
11031 }
11032
11033 java_library {
11034 name: "my_java_library_foo",
11035 srcs: ["foo/bar/MyClass.java"],
11036 sdk_version: "none",
11037 system_modules: "none",
11038 static_libs: ["my_java_aconfig_library_foo"],
11039 // TODO: remove //apex_available:platform
11040 apex_available: [
11041 "//apex_available:platform",
11042 "myapex",
11043 ],
11044 }
11045
11046 java_library {
11047 name: "other_java_library_bar",
11048 srcs: ["foo/bar/MyClass.java"],
11049 sdk_version: "none",
11050 system_modules: "none",
11051 static_libs: ["other_java_aconfig_library_bar"],
11052 // TODO: remove //apex_available:platform
11053 apex_available: [
11054 "//apex_available:platform",
11055 "myapex",
11056 ],
11057 }
11058
11059 aconfig_declarations {
11060 name: "my_aconfig_declarations_foo",
11061 package: "com.example.package",
11062 container: "myapex",
11063 srcs: ["foo.aconfig"],
11064 }
11065
11066 java_aconfig_library {
11067 name: "my_java_aconfig_library_foo",
11068 aconfig_declarations: "my_aconfig_declarations_foo",
11069 // TODO: remove //apex_available:platform
11070 apex_available: [
11071 "//apex_available:platform",
11072 "myapex",
11073 ],
11074 }
11075
11076 aconfig_declarations {
11077 name: "other_aconfig_declarations_bar",
11078 package: "com.example.package",
11079 container: "otherapex",
11080 srcs: ["bar.aconfig"],
11081 }
11082
11083 java_aconfig_library {
11084 name: "other_java_aconfig_library_bar",
11085 aconfig_declarations: "other_aconfig_declarations_bar",
11086 // TODO: remove //apex_available:platform
11087 apex_available: [
11088 "//apex_available:platform",
11089 "myapex",
11090 ],
11091 }
11092 `)
11093
11094 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11095 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11096 s := " " + combineAconfigRule.Args["cache_files"]
11097 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11098 if len(aconfigArgs) != 1 {
11099 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11100 }
11101 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11102
11103 buildParams := combineAconfigRule.BuildParams
11104 if len(buildParams.Inputs) != 1 {
11105 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11106 }
11107 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11108 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11109}
11110
11111func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11112 ctx := testApex(t, apex_default_bp+`
11113 apex {
11114 name: "myapex",
11115 manifest: ":myapex.manifest",
11116 androidManifest: ":myapex.androidmanifest",
11117 key: "myapex.key",
11118 java_libs: [
11119 "my_java_library_foo",
11120 "my_java_library_bar",
11121 ],
11122 updatable: false,
11123 }
11124
11125 java_library {
11126 name: "my_java_library_foo",
11127 srcs: ["foo/bar/MyClass.java"],
11128 sdk_version: "none",
11129 system_modules: "none",
11130 static_libs: ["my_java_aconfig_library_foo"],
11131 // TODO: remove //apex_available:platform
11132 apex_available: [
11133 "//apex_available:platform",
11134 "myapex",
11135 ],
11136 }
11137
11138 java_library {
11139 name: "my_java_library_bar",
11140 srcs: ["foo/bar/MyClass.java"],
11141 sdk_version: "none",
11142 system_modules: "none",
11143 static_libs: ["my_java_aconfig_library_bar"],
11144 // TODO: remove //apex_available:platform
11145 apex_available: [
11146 "//apex_available:platform",
11147 "myapex",
11148 ],
11149 }
11150
11151 aconfig_declarations {
11152 name: "my_aconfig_declarations_foo",
11153 package: "com.example.package",
11154 container: "myapex",
11155 srcs: ["foo.aconfig"],
11156 }
11157
11158 java_aconfig_library {
11159 name: "my_java_aconfig_library_foo",
11160 aconfig_declarations: "my_aconfig_declarations_foo",
11161 // TODO: remove //apex_available:platform
11162 apex_available: [
11163 "//apex_available:platform",
11164 "myapex",
11165 ],
11166 }
11167
11168 java_aconfig_library {
11169 name: "my_java_aconfig_library_bar",
11170 aconfig_declarations: "my_aconfig_declarations_foo",
11171 // TODO: remove //apex_available:platform
11172 apex_available: [
11173 "//apex_available:platform",
11174 "myapex",
11175 ],
11176 }
11177 `)
11178
11179 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11180 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11181 s := " " + combineAconfigRule.Args["cache_files"]
11182 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11183 if len(aconfigArgs) != 1 {
11184 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11185 }
11186 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11187
11188 buildParams := combineAconfigRule.BuildParams
11189 if len(buildParams.Inputs) != 1 {
11190 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11191 }
11192 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11193 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11194}