blob: f0fd7307376b69a42ce84ce80856250cf7f333ad [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
Colin Crossf61d03d2023-11-02 16:56:39 -0700600 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
601 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
604 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
605 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100606
Colin Crossf61d03d2023-11-02 16:56:39 -0700607 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
608 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800613}
614
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800616 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 apex_defaults {
618 name: "myapex-defaults",
619 key: "myapex.key",
620 prebuilts: ["myetc"],
621 native_shared_libs: ["mylib"],
622 java_libs: ["myjar"],
623 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900624 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800625 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000626 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 }
628
629 prebuilt_etc {
630 name: "myetc",
631 src: "myprebuilt",
632 }
633
634 apex {
635 name: "myapex",
636 defaults: ["myapex-defaults"],
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
645 cc_library {
646 name: "mylib",
647 system_shared_libs: [],
648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 java_library {
653 name: "myjar",
654 srcs: ["foo/bar/MyClass.java"],
655 sdk_version: "none",
656 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000657 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658 }
659
660 android_app {
661 name: "AppFoo",
662 srcs: ["foo/bar/MyClass.java"],
663 sdk_version: "none",
664 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000665 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900667
668 runtime_resource_overlay {
669 name: "rro",
670 theme: "blue",
671 }
672
markchien2f59ec92020-09-02 16:23:38 +0800673 bpf {
674 name: "bpf",
675 srcs: ["bpf.c", "bpf2.c"],
676 }
677
Ken Chenfad7f9d2021-11-10 22:02:57 +0800678 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800679 name: "netdTest",
680 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800681 sub_dir: "netd",
682 }
683
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900685 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 "etc/myetc",
687 "javalib/myjar.jar",
688 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000689 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900690 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800691 "etc/bpf/bpf.o",
692 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800693 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 })
695}
696
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800698 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 apex {
700 name: "myapex",
701 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000702 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710 `)
711
Jooyung Hana0503a52023-08-23 13:12:50 +0900712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900713 args := module.Rule("apexRule").Args
714 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
715 t.Error("manifest should be apex_manifest.pb, but " + manifest)
716 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900717}
718
Liz Kammer4854a7d2021-05-27 14:28:27 -0400719func TestApexManifestMinSdkVersion(t *testing.T) {
720 ctx := testApex(t, `
721 apex_defaults {
722 name: "my_defaults",
723 key: "myapex.key",
724 product_specific: true,
725 file_contexts: ":my-file-contexts",
726 updatable: false,
727 }
728 apex {
729 name: "myapex_30",
730 min_sdk_version: "30",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_current",
736 min_sdk_version: "current",
737 defaults: ["my_defaults"],
738 }
739
740 apex {
741 name: "myapex_none",
742 defaults: ["my_defaults"],
743 }
744
745 apex_key {
746 name: "myapex.key",
747 public_key: "testkey.avbpubkey",
748 private_key: "testkey.pem",
749 }
750
751 filegroup {
752 name: "my-file-contexts",
753 srcs: ["product_specific_file_contexts"],
754 }
755 `, withFiles(map[string][]byte{
756 "product_specific_file_contexts": nil,
757 }), android.FixtureModifyProductVariables(
758 func(variables android.FixtureProductVariables) {
759 variables.Unbundled_build = proptools.BoolPtr(true)
760 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
761 }), android.FixtureMergeEnv(map[string]string{
762 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
763 }))
764
765 testCases := []struct {
766 module string
767 minSdkVersion string
768 }{
769 {
770 module: "myapex_30",
771 minSdkVersion: "30",
772 },
773 {
774 module: "myapex_current",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 {
778 module: "myapex_none",
779 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
780 },
781 }
782 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900783 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400784 args := module.Rule("apexRule").Args
785 optFlags := args["opt_flags"]
786 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
787 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
788 }
789 }
790}
791
Jooyung Hanaf730952023-02-28 14:13:38 +0900792func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900793 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900794 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900795 if vendor {
796 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900797 }
798 ctx := testApex(t, `
799 apex {
800 name: "myapex",
801 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900802 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900803 `+prop+`
804 }
805
806 apex_key {
807 name: "myapex.key",
808 public_key: "testkey.avbpubkey",
809 private_key: "testkey.pem",
810 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900811 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900812
Jooyung Hana0503a52023-08-23 13:12:50 +0900813 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900814 if vendor {
815 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900819 android.AssertStringDoesContain(t, "should force-label as system_file",
820 rule.RuleParams.Command,
821 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900822 }
823 }
824}
825
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800827 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900828 apex {
829 name: "myapex",
830 key: "myapex.key",
831 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900832 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000833 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834 }
835
836 apex_key {
837 name: "myapex.key",
838 public_key: "testkey.avbpubkey",
839 private_key: "testkey.pem",
840 }
841
842 cc_library {
843 name: "mylib",
844 srcs: ["mylib.cpp"],
845 shared_libs: ["mylib2", "mylib3"],
846 system_shared_libs: [],
847 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000848 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900849 }
850
851 cc_library {
852 name: "mylib2",
853 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900854 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900855 system_shared_libs: [],
856 stl: "none",
857 stubs: {
858 versions: ["1", "2", "3"],
859 },
860 }
861
862 cc_library {
863 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900864 srcs: ["mylib.cpp"],
865 shared_libs: ["mylib4"],
866 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 stl: "none",
868 stubs: {
869 versions: ["10", "11", "12"],
870 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000871 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900872 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900873
874 cc_library {
875 name: "mylib4",
876 srcs: ["mylib.cpp"],
877 system_shared_libs: [],
878 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000879 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900880 }
Jiyong Park105dc322021-06-11 17:22:09 +0900881
882 rust_binary {
883 name: "foo.rust",
884 srcs: ["foo.rs"],
885 shared_libs: ["libfoo.shared_from_rust"],
886 prefer_rlib: true,
887 apex_available: ["myapex"],
888 }
889
890 cc_library_shared {
891 name: "libfoo.shared_from_rust",
892 srcs: ["mylib.cpp"],
893 system_shared_libs: [],
894 stl: "none",
895 stubs: {
896 versions: ["10", "11", "12"],
897 },
898 }
899
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900 `)
901
Jooyung Hana0503a52023-08-23 13:12:50 +0900902 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 copyCmds := apexRule.Args["copy_commands"]
904
905 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800906 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907
908 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800909 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900910
911 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800912 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913
Colin Crossaede88c2020-08-11 12:17:01 -0700914 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915
916 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900917 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900919 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // 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 -0700922 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700924 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900925
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700926 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
927 // is replaced by sharing of "cFlags" in cc/builder.go.
928 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
929 // module variable representing "cflags". So it was not detected by ensureNotContains.
930 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
931 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
932 // including the original cflags's "-include mylib.h".
933 //
Jiyong Park64379952018-12-13 18:37:29 +0900934 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700935 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
936 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900937
Jiyong Park85cc35a2022-07-17 11:30:47 +0900938 // Ensure that genstub for platform-provided lib is invoked with --systemapi
939 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
940 // Ensure that genstub for apex-provided lib is invoked with --apex
941 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942
Jooyung Hana0503a52023-08-23 13:12:50 +0900943 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900944 "lib64/mylib.so",
945 "lib64/mylib3.so",
946 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900947 "bin/foo.rust",
948 "lib64/libc++.so", // by the implicit dependency from foo.rust
949 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900950 })
Jiyong Park105dc322021-06-11 17:22:09 +0900951
952 // Ensure that stub dependency from a rust module is not included
953 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
954 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700955 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900956 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
957 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900958
Jooyung Hana0503a52023-08-23 13:12:50 +0900959 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900960 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961}
962
Jiyong Park1bc84122021-06-22 20:23:05 +0900963func TestApexCanUsePrivateApis(t *testing.T) {
964 ctx := testApex(t, `
965 apex {
966 name: "myapex",
967 key: "myapex.key",
968 native_shared_libs: ["mylib"],
969 binaries: ["foo.rust"],
970 updatable: false,
971 platform_apis: true,
972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 cc_library {
981 name: "mylib",
982 srcs: ["mylib.cpp"],
983 shared_libs: ["mylib2"],
984 system_shared_libs: [],
985 stl: "none",
986 apex_available: [ "myapex" ],
987 }
988
989 cc_library {
990 name: "mylib2",
991 srcs: ["mylib.cpp"],
992 cflags: ["-include mylib.h"],
993 system_shared_libs: [],
994 stl: "none",
995 stubs: {
996 versions: ["1", "2", "3"],
997 },
998 }
999
1000 rust_binary {
1001 name: "foo.rust",
1002 srcs: ["foo.rs"],
1003 shared_libs: ["libfoo.shared_from_rust"],
1004 prefer_rlib: true,
1005 apex_available: ["myapex"],
1006 }
1007
1008 cc_library_shared {
1009 name: "libfoo.shared_from_rust",
1010 srcs: ["mylib.cpp"],
1011 system_shared_libs: [],
1012 stl: "none",
1013 stubs: {
1014 versions: ["10", "11", "12"],
1015 },
1016 }
1017 `)
1018
Jooyung Hana0503a52023-08-23 13:12:50 +09001019 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001020 copyCmds := apexRule.Args["copy_commands"]
1021
1022 // Ensure that indirect stubs dep is not included
1023 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1024 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1025
1026 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1027 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001028 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001029 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1030 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001031 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001032 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1033 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1034}
1035
Colin Cross7812fd32020-09-25 12:35:10 -07001036func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1037 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001038 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001039 apex {
1040 name: "myapex",
1041 key: "myapex.key",
1042 native_shared_libs: ["mylib", "mylib3"],
1043 min_sdk_version: "29",
1044 }
1045
1046 apex_key {
1047 name: "myapex.key",
1048 public_key: "testkey.avbpubkey",
1049 private_key: "testkey.pem",
1050 }
1051
1052 cc_library {
1053 name: "mylib",
1054 srcs: ["mylib.cpp"],
1055 shared_libs: ["mylib2", "mylib3"],
1056 system_shared_libs: [],
1057 stl: "none",
1058 apex_available: [ "myapex" ],
1059 min_sdk_version: "28",
1060 }
1061
1062 cc_library {
1063 name: "mylib2",
1064 srcs: ["mylib.cpp"],
1065 cflags: ["-include mylib.h"],
1066 system_shared_libs: [],
1067 stl: "none",
1068 stubs: {
1069 versions: ["28", "29", "30", "current"],
1070 },
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib3",
1076 srcs: ["mylib.cpp"],
1077 shared_libs: ["mylib4"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 apex_available: [ "myapex" ],
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib4",
1089 srcs: ["mylib.cpp"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 apex_available: [ "myapex" ],
1093 min_sdk_version: "28",
1094 }
1095 `)
1096
Jooyung Hana0503a52023-08-23 13:12:50 +09001097 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001098 copyCmds := apexRule.Args["copy_commands"]
1099
1100 // Ensure that direct non-stubs dep is always included
1101 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1102
1103 // Ensure that indirect stubs dep is not included
1104 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1105
1106 // Ensure that direct stubs dep is included
1107 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1108
1109 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1110
Jiyong Park55549df2021-02-26 23:57:23 +09001111 // Ensure that mylib is linking with the latest version of stub for mylib2
1112 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001113 // ... and not linking to the non-stub (impl) variant of mylib2
1114 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1115
1116 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1117 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1118 // .. and not linking to the stubs variant of mylib3
1119 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1120
1121 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001122 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001123 ensureNotContains(t, mylib2Cflags, "-include ")
1124
Jiyong Park85cc35a2022-07-17 11:30:47 +09001125 // Ensure that genstub is invoked with --systemapi
1126 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001127
Jooyung Hana0503a52023-08-23 13:12:50 +09001128 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001129 "lib64/mylib.so",
1130 "lib64/mylib3.so",
1131 "lib64/mylib4.so",
1132 })
1133}
1134
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001135func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1136 t.Parallel()
1137 // myapex (Z)
1138 // mylib -----------------.
1139 // |
1140 // otherapex (29) |
1141 // libstub's versions: 29 Z current
1142 // |
1143 // <platform> |
1144 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001145 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001146 apex {
1147 name: "myapex",
1148 key: "myapex.key",
1149 native_shared_libs: ["mylib"],
1150 min_sdk_version: "Z", // non-final
1151 }
1152
1153 cc_library {
1154 name: "mylib",
1155 srcs: ["mylib.cpp"],
1156 shared_libs: ["libstub"],
1157 apex_available: ["myapex"],
1158 min_sdk_version: "Z",
1159 }
1160
1161 apex_key {
1162 name: "myapex.key",
1163 public_key: "testkey.avbpubkey",
1164 private_key: "testkey.pem",
1165 }
1166
1167 apex {
1168 name: "otherapex",
1169 key: "myapex.key",
1170 native_shared_libs: ["libstub"],
1171 min_sdk_version: "29",
1172 }
1173
1174 cc_library {
1175 name: "libstub",
1176 srcs: ["mylib.cpp"],
1177 stubs: {
1178 versions: ["29", "Z", "current"],
1179 },
1180 apex_available: ["otherapex"],
1181 min_sdk_version: "29",
1182 }
1183
1184 // platform module depending on libstub from otherapex should use the latest stub("current")
1185 cc_library {
1186 name: "libplatform",
1187 srcs: ["mylib.cpp"],
1188 shared_libs: ["libstub"],
1189 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001190 `,
1191 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1192 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1193 variables.Platform_sdk_final = proptools.BoolPtr(false)
1194 variables.Platform_version_active_codenames = []string{"Z"}
1195 }),
1196 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197
Jiyong Park55549df2021-02-26 23:57:23 +09001198 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001200 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001201 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001202 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001203
1204 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1205 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1206 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1207 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1208 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1209}
1210
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001211func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001212 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001213 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001214 name: "myapex2",
1215 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001216 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001217 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218 }
1219
1220 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001221 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222 public_key: "testkey.avbpubkey",
1223 private_key: "testkey.pem",
1224 }
1225
1226 cc_library {
1227 name: "mylib",
1228 srcs: ["mylib.cpp"],
1229 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001230 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 system_shared_libs: [],
1232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001233 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 }
1235
1236 cc_library {
1237 name: "libfoo",
1238 srcs: ["mylib.cpp"],
1239 shared_libs: ["libbar"],
1240 system_shared_libs: [],
1241 stl: "none",
1242 stubs: {
1243 versions: ["10", "20", "30"],
1244 },
1245 }
1246
1247 cc_library {
1248 name: "libbar",
1249 srcs: ["mylib.cpp"],
1250 system_shared_libs: [],
1251 stl: "none",
1252 }
1253
Jiyong Park678c8812020-02-07 17:25:49 +09001254 cc_library_static {
1255 name: "libbaz",
1256 srcs: ["mylib.cpp"],
1257 system_shared_libs: [],
1258 stl: "none",
1259 apex_available: [ "myapex2" ],
1260 }
1261
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001262 `)
1263
Jooyung Hana0503a52023-08-23 13:12:50 +09001264 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 copyCmds := apexRule.Args["copy_commands"]
1266
1267 // Ensure that direct non-stubs dep is always included
1268 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1269
1270 // Ensure that indirect stubs dep is not included
1271 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1272
1273 // Ensure that dependency of stubs is not included
1274 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1275
Colin Crossaede88c2020-08-11 12:17:01 -07001276 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277
1278 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001282
Jiyong Park3ff16992019-12-27 14:11:47 +09001283 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284
1285 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1286 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001287
Colin Crossf61d03d2023-11-02 16:56:39 -07001288 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1289 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001290 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001291
Colin Crossf61d03d2023-11-02 16:56:39 -07001292 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1293 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001294 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295}
1296
Jooyung Hand3639552019-08-09 12:57:43 +09001297func TestApexWithRuntimeLibsDependency(t *testing.T) {
1298 /*
1299 myapex
1300 |
1301 v (runtime_libs)
1302 mylib ------+------> libfoo [provides stub]
1303 |
1304 `------> libbar
1305 */
Colin Cross1c460562021-02-16 17:55:47 -08001306 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001307 apex {
1308 name: "myapex",
1309 key: "myapex.key",
1310 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001311 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 cc_library {
1321 name: "mylib",
1322 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001323 static_libs: ["libstatic"],
1324 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001325 runtime_libs: ["libfoo", "libbar"],
1326 system_shared_libs: [],
1327 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001328 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001329 }
1330
1331 cc_library {
1332 name: "libfoo",
1333 srcs: ["mylib.cpp"],
1334 system_shared_libs: [],
1335 stl: "none",
1336 stubs: {
1337 versions: ["10", "20", "30"],
1338 },
1339 }
1340
1341 cc_library {
1342 name: "libbar",
1343 srcs: ["mylib.cpp"],
1344 system_shared_libs: [],
1345 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001346 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001347 }
1348
Liz Kammer5f108fa2023-05-11 14:33:17 -04001349 cc_library {
1350 name: "libstatic",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
1354 apex_available: [ "myapex" ],
1355 runtime_libs: ["libstatic_to_runtime"],
1356 }
1357
1358 cc_library {
1359 name: "libshared",
1360 srcs: ["mylib.cpp"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 apex_available: [ "myapex" ],
1364 runtime_libs: ["libshared_to_runtime"],
1365 }
1366
1367 cc_library {
1368 name: "libstatic_to_runtime",
1369 srcs: ["mylib.cpp"],
1370 system_shared_libs: [],
1371 stl: "none",
1372 apex_available: [ "myapex" ],
1373 }
1374
1375 cc_library {
1376 name: "libshared_to_runtime",
1377 srcs: ["mylib.cpp"],
1378 system_shared_libs: [],
1379 stl: "none",
1380 apex_available: [ "myapex" ],
1381 }
Jooyung Hand3639552019-08-09 12:57:43 +09001382 `)
1383
Jooyung Hana0503a52023-08-23 13:12:50 +09001384 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001385 copyCmds := apexRule.Args["copy_commands"]
1386
1387 // Ensure that direct non-stubs dep is always included
1388 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1389
1390 // Ensure that indirect stubs dep is not included
1391 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1392
1393 // Ensure that runtime_libs dep in included
1394 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001395 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1396 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1397
1398 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001399
Jooyung Hana0503a52023-08-23 13:12:50 +09001400 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001401 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1402 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001403}
1404
Paul Duffina02cae32021-03-09 01:44:06 +00001405var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1406 cc.PrepareForTestWithCcBuildComponents,
1407 PrepareForTestWithApexBuildComponents,
1408 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001409 apex {
1410 name: "com.android.runtime",
1411 key: "com.android.runtime.key",
1412 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001413 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001414 }
1415
1416 apex_key {
1417 name: "com.android.runtime.key",
1418 public_key: "testkey.avbpubkey",
1419 private_key: "testkey.pem",
1420 }
Paul Duffina02cae32021-03-09 01:44:06 +00001421 `),
1422 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1423)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001424
Paul Duffina02cae32021-03-09 01:44:06 +00001425func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001426 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001427 cc_library {
1428 name: "libc",
1429 no_libcrt: true,
1430 nocrt: true,
1431 stl: "none",
1432 system_shared_libs: [],
1433 stubs: { versions: ["1"] },
1434 apex_available: ["com.android.runtime"],
1435
1436 sanitize: {
1437 hwaddress: true,
1438 }
1439 }
1440
1441 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001442 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001443 no_libcrt: true,
1444 nocrt: true,
1445 stl: "none",
1446 system_shared_libs: [],
1447 srcs: [""],
1448 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001449 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001450
1451 sanitize: {
1452 never: true,
1453 },
Spandan Das4de7b492023-05-05 21:13:01 +00001454 apex_available: [
1455 "//apex_available:anyapex",
1456 "//apex_available:platform",
1457 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001458 } `)
1459 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001460
Jooyung Hana0503a52023-08-23 13:12:50 +09001461 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 "lib64/bionic/libc.so",
1463 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1464 })
1465
Colin Cross4c4c1be2022-02-10 11:41:18 -08001466 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001467
1468 installed := hwasan.Description("install libclang_rt.hwasan")
1469 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1470
1471 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1472 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1473 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1474}
1475
1476func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001477 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001478 prepareForTestOfRuntimeApexWithHwasan,
1479 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1480 variables.SanitizeDevice = []string{"hwaddress"}
1481 }),
1482 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001483 cc_library {
1484 name: "libc",
1485 no_libcrt: true,
1486 nocrt: true,
1487 stl: "none",
1488 system_shared_libs: [],
1489 stubs: { versions: ["1"] },
1490 apex_available: ["com.android.runtime"],
1491 }
1492
1493 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001494 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495 no_libcrt: true,
1496 nocrt: true,
1497 stl: "none",
1498 system_shared_libs: [],
1499 srcs: [""],
1500 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001501 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001502
1503 sanitize: {
1504 never: true,
1505 },
Spandan Das4de7b492023-05-05 21:13:01 +00001506 apex_available: [
1507 "//apex_available:anyapex",
1508 "//apex_available:platform",
1509 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001510 }
Paul Duffina02cae32021-03-09 01:44:06 +00001511 `)
1512 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001513
Jooyung Hana0503a52023-08-23 13:12:50 +09001514 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515 "lib64/bionic/libc.so",
1516 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1517 })
1518
Colin Cross4c4c1be2022-02-10 11:41:18 -08001519 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001520
1521 installed := hwasan.Description("install libclang_rt.hwasan")
1522 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1523
1524 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1525 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1526 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1527}
1528
Jooyung Han61b66e92020-03-21 14:21:46 +00001529func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1530 testcases := []struct {
1531 name string
1532 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001533 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 shouldLink string
1535 shouldNotLink []string
1536 }{
1537 {
Jiyong Park55549df2021-02-26 23:57:23 +09001538 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001539 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001540 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001541 shouldLink: "current",
1542 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 },
1544 {
Jiyong Park55549df2021-02-26 23:57:23 +09001545 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001546 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001547 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001548 shouldLink: "current",
1549 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001550 },
1551 }
1552 for _, tc := range testcases {
1553 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001554 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 apex {
1556 name: "myapex",
1557 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001559 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001560 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 apex_key {
1564 name: "myapex.key",
1565 public_key: "testkey.avbpubkey",
1566 private_key: "testkey.pem",
1567 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 cc_library {
1570 name: "mylib",
1571 srcs: ["mylib.cpp"],
1572 vendor_available: true,
1573 shared_libs: ["libbar"],
1574 system_shared_libs: [],
1575 stl: "none",
1576 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001577 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001578 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001579
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 cc_library {
1581 name: "libbar",
1582 srcs: ["mylib.cpp"],
1583 system_shared_libs: [],
1584 stl: "none",
1585 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001586 llndk: {
1587 symbol_file: "libbar.map.txt",
1588 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001589 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001590 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001591 withUnbundledBuild,
1592 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001593
Jooyung Han61b66e92020-03-21 14:21:46 +00001594 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001595 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 "lib64/mylib.so",
1597 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001598
Jooyung Han61b66e92020-03-21 14:21:46 +00001599 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001600 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001601 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1602 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001603
Steven Moreland2c4000c2021-04-27 02:08:49 +00001604 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1605 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001607 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001609
Steven Moreland2c4000c2021-04-27 02:08:49 +00001610 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001611 ver := tc.shouldLink
1612 if tc.shouldLink == "current" {
1613 ver = strconv.Itoa(android.FutureApiLevelInt)
1614 }
1615 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001616 })
1617 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001618}
1619
Jiyong Park25fc6a92018-11-18 18:02:45 +09001620func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001621 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 apex {
1623 name: "myapex",
1624 key: "myapex.key",
1625 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001626 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001627 }
1628
1629 apex_key {
1630 name: "myapex.key",
1631 public_key: "testkey.avbpubkey",
1632 private_key: "testkey.pem",
1633 }
1634
1635 cc_library {
1636 name: "mylib",
1637 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001638 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639 shared_libs: ["libdl#27"],
1640 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001641 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 }
1643
1644 cc_library_shared {
1645 name: "mylib_shared",
1646 srcs: ["mylib.cpp"],
1647 shared_libs: ["libdl#27"],
1648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001649 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 }
1651
1652 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001653 name: "libBootstrap",
1654 srcs: ["mylib.cpp"],
1655 stl: "none",
1656 bootstrap: true,
1657 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001658 `)
1659
Jooyung Hana0503a52023-08-23 13:12:50 +09001660 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661 copyCmds := apexRule.Args["copy_commands"]
1662
1663 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001664 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001665 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1666 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667
1668 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001669 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670
Colin Crossaede88c2020-08-11 12:17:01 -07001671 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1672 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1673 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674
1675 // For dependency to libc
1676 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001677 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001678 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001679 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001680 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001681 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1682 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683
1684 // For dependency to libm
1685 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001686 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001688 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 // ... and is not compiling with the stub
1690 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1691 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1692
1693 // For dependency to libdl
1694 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001695 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001696 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001697 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001699 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001700 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701 // ... Cflags from stub is correctly exported to mylib
1702 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1703 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001704
1705 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001706 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1707 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1708 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1709 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001711
Jooyung Han749dc692020-04-15 11:03:39 +09001712func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001713 // there are three links between liba --> libz.
1714 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001715 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001716 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001717 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001718 apex {
1719 name: "myapex",
1720 key: "myapex.key",
1721 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001722 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001723 }
1724
1725 apex {
1726 name: "otherapex",
1727 key: "myapex.key",
1728 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 apex_key {
1733 name: "myapex.key",
1734 public_key: "testkey.avbpubkey",
1735 private_key: "testkey.pem",
1736 }
1737
1738 cc_library {
1739 name: "libx",
1740 shared_libs: ["liba"],
1741 system_shared_libs: [],
1742 stl: "none",
1743 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001744 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001745 }
1746
1747 cc_library {
1748 name: "liby",
1749 shared_libs: ["liba"],
1750 system_shared_libs: [],
1751 stl: "none",
1752 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001753 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 cc_library {
1757 name: "liba",
1758 shared_libs: ["libz"],
1759 system_shared_libs: [],
1760 stl: "none",
1761 apex_available: [
1762 "//apex_available:anyapex",
1763 "//apex_available:platform",
1764 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001765 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001766 }
1767
1768 cc_library {
1769 name: "libz",
1770 system_shared_libs: [],
1771 stl: "none",
1772 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001773 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001774 },
1775 }
Jooyung Han749dc692020-04-15 11:03:39 +09001776 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001777
1778 expectLink := func(from, from_variant, to, to_variant string) {
1779 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1780 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1781 }
1782 expectNoLink := func(from, from_variant, to, to_variant string) {
1783 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1784 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1785 }
1786 // platform liba is linked to non-stub version
1787 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001788 // liba in myapex is linked to current
1789 expectLink("liba", "shared_apex29", "libz", "shared_current")
1790 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001791 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001792 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001793 // liba in otherapex is linked to current
1794 expectLink("liba", "shared_apex30", "libz", "shared_current")
1795 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001796 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1797 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001798}
1799
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001801 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802 apex {
1803 name: "myapex",
1804 key: "myapex.key",
1805 native_shared_libs: ["libx"],
1806 min_sdk_version: "R",
1807 }
1808
1809 apex_key {
1810 name: "myapex.key",
1811 public_key: "testkey.avbpubkey",
1812 private_key: "testkey.pem",
1813 }
1814
1815 cc_library {
1816 name: "libx",
1817 shared_libs: ["libz"],
1818 system_shared_libs: [],
1819 stl: "none",
1820 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001821 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001822 }
1823
1824 cc_library {
1825 name: "libz",
1826 system_shared_libs: [],
1827 stl: "none",
1828 stubs: {
1829 versions: ["29", "R"],
1830 },
1831 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001832 `,
1833 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1834 variables.Platform_version_active_codenames = []string{"R"}
1835 }),
1836 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001837
1838 expectLink := func(from, from_variant, to, to_variant string) {
1839 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1840 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1841 }
1842 expectNoLink := func(from, from_variant, to, to_variant string) {
1843 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1844 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1845 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001846 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1847 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001848 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1849 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001850}
1851
Jooyung Han4c4da062021-06-23 10:23:16 +09001852func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1853 testApex(t, `
1854 apex {
1855 name: "myapex",
1856 key: "myapex.key",
1857 java_libs: ["libx"],
1858 min_sdk_version: "S",
1859 }
1860
1861 apex_key {
1862 name: "myapex.key",
1863 public_key: "testkey.avbpubkey",
1864 private_key: "testkey.pem",
1865 }
1866
1867 java_library {
1868 name: "libx",
1869 srcs: ["a.java"],
1870 apex_available: [ "myapex" ],
1871 sdk_version: "current",
1872 min_sdk_version: "S", // should be okay
1873 }
1874 `,
1875 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1876 variables.Platform_version_active_codenames = []string{"S"}
1877 variables.Platform_sdk_codename = proptools.StringPtr("S")
1878 }),
1879 )
1880}
1881
Jooyung Han749dc692020-04-15 11:03:39 +09001882func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001883 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001884 apex {
1885 name: "myapex",
1886 key: "myapex.key",
1887 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001888 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001889 }
1890
1891 apex_key {
1892 name: "myapex.key",
1893 public_key: "testkey.avbpubkey",
1894 private_key: "testkey.pem",
1895 }
1896
1897 cc_library {
1898 name: "libx",
1899 shared_libs: ["libz"],
1900 system_shared_libs: [],
1901 stl: "none",
1902 apex_available: [ "myapex" ],
1903 }
1904
1905 cc_library {
1906 name: "libz",
1907 system_shared_libs: [],
1908 stl: "none",
1909 stubs: {
1910 versions: ["1", "2"],
1911 },
1912 }
1913 `)
1914
1915 expectLink := func(from, from_variant, to, to_variant string) {
1916 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1917 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1918 }
1919 expectNoLink := func(from, from_variant, to, to_variant string) {
1920 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1921 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1922 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001923 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001924 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001925 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001927}
1928
Jooyung Handfc864c2023-03-20 18:19:07 +09001929func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930 ctx := testApex(t, `
1931 apex {
1932 name: "myapex",
1933 key: "myapex.key",
1934 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001935 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001936 vendor: true,
1937 min_sdk_version: "29",
1938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001948 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001949 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001950 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001951 shared_libs: ["libbar"],
1952 }
1953
1954 cc_library {
1955 name: "libbar",
1956 stubs: { versions: ["29", "30"] },
1957 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001958 }
1959 `)
1960
1961 vendorVariant := "android_vendor.29_arm64_armv8-a"
1962
Jooyung Handfc864c2023-03-20 18:19:07 +09001963 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1964
1965 // Ensure that mylib links with "current" LLNDK
1966 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1967 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1968
1969 // Ensure that mylib is targeting 29
1970 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1971 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1972
1973 // Ensure that the correct variant of crtbegin_so is used.
1974 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1975 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001976
1977 // Ensure that the crtbegin_so used by the APEX is targeting 29
1978 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1979 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1980}
1981
Jooyung Han4495f842023-04-25 16:39:59 +09001982func TestTrackAllowedDeps(t *testing.T) {
1983 ctx := testApex(t, `
1984 apex {
1985 name: "myapex",
1986 key: "myapex.key",
1987 updatable: true,
1988 native_shared_libs: [
1989 "mylib",
1990 "yourlib",
1991 ],
1992 min_sdk_version: "29",
1993 }
1994
1995 apex {
1996 name: "myapex2",
1997 key: "myapex.key",
1998 updatable: false,
1999 native_shared_libs: ["yourlib"],
2000 }
2001
2002 apex_key {
2003 name: "myapex.key",
2004 public_key: "testkey.avbpubkey",
2005 private_key: "testkey.pem",
2006 }
2007
2008 cc_library {
2009 name: "mylib",
2010 srcs: ["mylib.cpp"],
2011 shared_libs: ["libbar"],
2012 min_sdk_version: "29",
2013 apex_available: ["myapex"],
2014 }
2015
2016 cc_library {
2017 name: "libbar",
2018 stubs: { versions: ["29", "30"] },
2019 }
2020
2021 cc_library {
2022 name: "yourlib",
2023 srcs: ["mylib.cpp"],
2024 min_sdk_version: "29",
2025 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2026 }
2027 `, withFiles(android.MockFS{
2028 "packages/modules/common/build/allowed_deps.txt": nil,
2029 }))
2030
2031 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2032 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2033 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002034 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002035 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002036 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002037
Jooyung Hana0503a52023-08-23 13:12:50 +09002038 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002039 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2040 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002041 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2042 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2043 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2044 flatlist, "mylib:(minSdkVersion:29)")
2045 android.AssertStringListContains(t, "track platform-available lib",
2046 flatlist, "yourlib(minSdkVersion:29)")
2047}
2048
2049func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2050 ctx := testApex(t, `
2051 apex {
2052 name: "myapex",
2053 key: "myapex.key",
2054 updatable: true,
2055 min_sdk_version: "29",
2056 }
2057
2058 apex_key {
2059 name: "myapex.key",
2060 public_key: "testkey.avbpubkey",
2061 private_key: "testkey.pem",
2062 }
2063 `)
2064 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2065 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2066 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2067 }
2068}
2069
Jooyung Han03b51852020-02-26 22:45:42 +09002070func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002071 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002072 apex {
2073 name: "myapex",
2074 key: "myapex.key",
2075 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002076 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002077 }
2078
2079 apex_key {
2080 name: "myapex.key",
2081 public_key: "testkey.avbpubkey",
2082 private_key: "testkey.pem",
2083 }
2084
2085 cc_library {
2086 name: "libx",
2087 system_shared_libs: [],
2088 stl: "none",
2089 apex_available: [ "myapex" ],
2090 stubs: {
2091 versions: ["1", "2"],
2092 },
2093 }
2094
2095 cc_library {
2096 name: "libz",
2097 shared_libs: ["libx"],
2098 system_shared_libs: [],
2099 stl: "none",
2100 }
2101 `)
2102
2103 expectLink := 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 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2107 }
2108 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002109 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002110 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2111 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2112 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002113 expectLink("libz", "shared", "libx", "shared_current")
2114 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002115 expectNoLink("libz", "shared", "libz", "shared_1")
2116 expectNoLink("libz", "shared", "libz", "shared")
2117}
2118
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002119var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2120 func(variables android.FixtureProductVariables) {
2121 variables.SanitizeDevice = []string{"hwaddress"}
2122 },
2123)
2124
Jooyung Han75568392020-03-20 04:29:24 +09002125func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002126 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 native_shared_libs: ["libx"],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex_key {
2135 name: "myapex.key",
2136 public_key: "testkey.avbpubkey",
2137 private_key: "testkey.pem",
2138 }
2139
2140 cc_library {
2141 name: "libx",
2142 shared_libs: ["libbar"],
2143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002144 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002145 }
2146
2147 cc_library {
2148 name: "libbar",
2149 stubs: {
2150 versions: ["29", "30"],
2151 },
2152 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002153 `,
2154 prepareForTestWithSantitizeHwaddress,
2155 )
Jooyung Han03b51852020-02-26 22:45:42 +09002156 expectLink := func(from, from_variant, to, to_variant string) {
2157 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2158 libFlags := ld.Args["libFlags"]
2159 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2160 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002161 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002162}
2163
Jooyung Han75568392020-03-20 04:29:24 +09002164func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
2170 min_sdk_version: "29",
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002182 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002183 }
Jooyung Han75568392020-03-20 04:29:24 +09002184 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002185
2186 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002187 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002188 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002189 // note that platform variant is not.
2190 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002191 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002192}
2193
Jooyung Han749dc692020-04-15 11:03:39 +09002194func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2195 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002196 apex {
2197 name: "myapex",
2198 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002199 native_shared_libs: ["mylib"],
2200 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002201 }
2202
2203 apex_key {
2204 name: "myapex.key",
2205 public_key: "testkey.avbpubkey",
2206 private_key: "testkey.pem",
2207 }
Jooyung Han749dc692020-04-15 11:03:39 +09002208
2209 cc_library {
2210 name: "mylib",
2211 srcs: ["mylib.cpp"],
2212 system_shared_libs: [],
2213 stl: "none",
2214 apex_available: [
2215 "myapex",
2216 ],
2217 min_sdk_version: "30",
2218 }
2219 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002220
2221 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2222 apex {
2223 name: "myapex",
2224 key: "myapex.key",
2225 native_shared_libs: ["libfoo.ffi"],
2226 min_sdk_version: "29",
2227 }
2228
2229 apex_key {
2230 name: "myapex.key",
2231 public_key: "testkey.avbpubkey",
2232 private_key: "testkey.pem",
2233 }
2234
2235 rust_ffi_shared {
2236 name: "libfoo.ffi",
2237 srcs: ["foo.rs"],
2238 crate_name: "foo",
2239 apex_available: [
2240 "myapex",
2241 ],
2242 min_sdk_version: "30",
2243 }
2244 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002245
2246 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2247 apex {
2248 name: "myapex",
2249 key: "myapex.key",
2250 java_libs: ["libfoo"],
2251 min_sdk_version: "29",
2252 }
2253
2254 apex_key {
2255 name: "myapex.key",
2256 public_key: "testkey.avbpubkey",
2257 private_key: "testkey.pem",
2258 }
2259
2260 java_import {
2261 name: "libfoo",
2262 jars: ["libfoo.jar"],
2263 apex_available: [
2264 "myapex",
2265 ],
2266 min_sdk_version: "30",
2267 }
2268 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002269
2270 // Skip check for modules compiling against core API surface
2271 testApex(t, `
2272 apex {
2273 name: "myapex",
2274 key: "myapex.key",
2275 java_libs: ["libfoo"],
2276 min_sdk_version: "29",
2277 }
2278
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284
2285 java_library {
2286 name: "libfoo",
2287 srcs: ["Foo.java"],
2288 apex_available: [
2289 "myapex",
2290 ],
2291 // Compile against core API surface
2292 sdk_version: "core_current",
2293 min_sdk_version: "30",
2294 }
2295 `)
2296
Jooyung Han749dc692020-04-15 11:03:39 +09002297}
2298
2299func TestApexMinSdkVersion_Okay(t *testing.T) {
2300 testApex(t, `
2301 apex {
2302 name: "myapex",
2303 key: "myapex.key",
2304 native_shared_libs: ["libfoo"],
2305 java_libs: ["libbar"],
2306 min_sdk_version: "29",
2307 }
2308
2309 apex_key {
2310 name: "myapex.key",
2311 public_key: "testkey.avbpubkey",
2312 private_key: "testkey.pem",
2313 }
2314
2315 cc_library {
2316 name: "libfoo",
2317 srcs: ["mylib.cpp"],
2318 shared_libs: ["libfoo_dep"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 cc_library {
2324 name: "libfoo_dep",
2325 srcs: ["mylib.cpp"],
2326 apex_available: ["myapex"],
2327 min_sdk_version: "29",
2328 }
2329
2330 java_library {
2331 name: "libbar",
2332 sdk_version: "current",
2333 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002334 static_libs: [
2335 "libbar_dep",
2336 "libbar_import_dep",
2337 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002338 apex_available: ["myapex"],
2339 min_sdk_version: "29",
2340 }
2341
2342 java_library {
2343 name: "libbar_dep",
2344 sdk_version: "current",
2345 srcs: ["a.java"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002349
2350 java_import {
2351 name: "libbar_import_dep",
2352 jars: ["libbar.jar"],
2353 apex_available: ["myapex"],
2354 min_sdk_version: "29",
2355 }
Jooyung Han03b51852020-02-26 22:45:42 +09002356 `)
2357}
2358
Colin Cross8ca61c12022-10-06 21:00:14 -07002359func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2360 // Tests that an apex dependency with min_sdk_version higher than the
2361 // min_sdk_version of the apex is allowed as long as the dependency's
2362 // min_sdk_version is less than or equal to the api level that the
2363 // architecture was introduced in. In this case, arm64 didn't exist
2364 // until api level 21, so the arm64 code will never need to run on
2365 // an api level 20 device, even if other architectures of the apex
2366 // will.
2367 testApex(t, `
2368 apex {
2369 name: "myapex",
2370 key: "myapex.key",
2371 native_shared_libs: ["libfoo"],
2372 min_sdk_version: "20",
2373 }
2374
2375 apex_key {
2376 name: "myapex.key",
2377 public_key: "testkey.avbpubkey",
2378 private_key: "testkey.pem",
2379 }
2380
2381 cc_library {
2382 name: "libfoo",
2383 srcs: ["mylib.cpp"],
2384 apex_available: ["myapex"],
2385 min_sdk_version: "21",
2386 stl: "none",
2387 }
2388 `)
2389}
2390
Artur Satayev8cf899a2020-04-15 17:29:42 +01002391func TestJavaStableSdkVersion(t *testing.T) {
2392 testCases := []struct {
2393 name string
2394 expectedError string
2395 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002396 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002397 }{
2398 {
2399 name: "Non-updatable apex with non-stable dep",
2400 bp: `
2401 apex {
2402 name: "myapex",
2403 java_libs: ["myjar"],
2404 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002405 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002406 }
2407 apex_key {
2408 name: "myapex.key",
2409 public_key: "testkey.avbpubkey",
2410 private_key: "testkey.pem",
2411 }
2412 java_library {
2413 name: "myjar",
2414 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002415 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002416 apex_available: ["myapex"],
2417 }
2418 `,
2419 },
2420 {
2421 name: "Updatable apex with stable dep",
2422 bp: `
2423 apex {
2424 name: "myapex",
2425 java_libs: ["myjar"],
2426 key: "myapex.key",
2427 updatable: true,
2428 min_sdk_version: "29",
2429 }
2430 apex_key {
2431 name: "myapex.key",
2432 public_key: "testkey.avbpubkey",
2433 private_key: "testkey.pem",
2434 }
2435 java_library {
2436 name: "myjar",
2437 srcs: ["foo/bar/MyClass.java"],
2438 sdk_version: "current",
2439 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002440 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }
2442 `,
2443 },
2444 {
2445 name: "Updatable apex with non-stable dep",
2446 expectedError: "cannot depend on \"myjar\"",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
2452 updatable: true,
2453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002468 name: "Updatable apex with non-stable legacy core platform dep",
2469 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2470 bp: `
2471 apex {
2472 name: "myapex",
2473 java_libs: ["myjar-uses-legacy"],
2474 key: "myapex.key",
2475 updatable: true,
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar-uses-legacy",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "core_platform",
2486 apex_available: ["myapex"],
2487 }
2488 `,
2489 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2490 },
2491 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002492 name: "Updatable apex with non-stable transitive dep",
2493 // This is not actually detecting that the transitive dependency is unstable, rather it is
2494 // detecting that the transitive dependency is building against a wider API surface than the
2495 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002496 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002497 bp: `
2498 apex {
2499 name: "myapex",
2500 java_libs: ["myjar"],
2501 key: "myapex.key",
2502 updatable: true,
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 java_library {
2510 name: "myjar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "current",
2513 apex_available: ["myapex"],
2514 static_libs: ["transitive-jar"],
2515 }
2516 java_library {
2517 name: "transitive-jar",
2518 srcs: ["foo/bar/MyClass.java"],
2519 sdk_version: "core_platform",
2520 apex_available: ["myapex"],
2521 }
2522 `,
2523 },
2524 }
2525
2526 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002527 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2528 continue
2529 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002530 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002531 errorHandler := android.FixtureExpectsNoErrors
2532 if test.expectedError != "" {
2533 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002534 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 android.GroupFixturePreparers(
2536 java.PrepareForTestWithJavaDefaultModules,
2537 PrepareForTestWithApexBuildComponents,
2538 prepareForTestWithMyapex,
2539 android.OptionalFixturePreparer(test.preparer),
2540 ).
2541 ExtendWithErrorHandler(errorHandler).
2542 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002543 })
2544 }
2545}
2546
Jooyung Han749dc692020-04-15 11:03:39 +09002547func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2548 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["mylib"],
2553 min_sdk_version: "29",
2554 }
2555
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561
2562 cc_library {
2563 name: "mylib",
2564 srcs: ["mylib.cpp"],
2565 shared_libs: ["mylib2"],
2566 system_shared_libs: [],
2567 stl: "none",
2568 apex_available: [
2569 "myapex",
2570 ],
2571 min_sdk_version: "29",
2572 }
2573
2574 // indirect part of the apex
2575 cc_library {
2576 name: "mylib2",
2577 srcs: ["mylib.cpp"],
2578 system_shared_libs: [],
2579 stl: "none",
2580 apex_available: [
2581 "myapex",
2582 ],
2583 min_sdk_version: "30",
2584 }
2585 `)
2586}
2587
2588func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2589 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2590 apex {
2591 name: "myapex",
2592 key: "myapex.key",
2593 apps: ["AppFoo"],
2594 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002595 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002596 }
2597
2598 apex_key {
2599 name: "myapex.key",
2600 public_key: "testkey.avbpubkey",
2601 private_key: "testkey.pem",
2602 }
2603
2604 android_app {
2605 name: "AppFoo",
2606 srcs: ["foo/bar/MyClass.java"],
2607 sdk_version: "current",
2608 min_sdk_version: "29",
2609 system_modules: "none",
2610 stl: "none",
2611 static_libs: ["bar"],
2612 apex_available: [ "myapex" ],
2613 }
2614
2615 java_library {
2616 name: "bar",
2617 sdk_version: "current",
2618 srcs: ["a.java"],
2619 apex_available: [ "myapex" ],
2620 }
2621 `)
2622}
2623
2624func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002625 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002626 apex {
2627 name: "myapex",
2628 key: "myapex.key",
2629 native_shared_libs: ["mylib"],
2630 min_sdk_version: "29",
2631 }
2632
2633 apex_key {
2634 name: "myapex.key",
2635 public_key: "testkey.avbpubkey",
2636 private_key: "testkey.pem",
2637 }
2638
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002639 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002640 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2641 cc_library {
2642 name: "mylib",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["mylib2"],
2645 system_shared_libs: [],
2646 stl: "none",
2647 apex_available: ["myapex", "otherapex"],
2648 min_sdk_version: "29",
2649 }
2650
2651 cc_library {
2652 name: "mylib2",
2653 srcs: ["mylib.cpp"],
2654 system_shared_libs: [],
2655 stl: "none",
2656 apex_available: ["otherapex"],
2657 stubs: { versions: ["29", "30"] },
2658 min_sdk_version: "30",
2659 }
2660
2661 apex {
2662 name: "otherapex",
2663 key: "myapex.key",
2664 native_shared_libs: ["mylib", "mylib2"],
2665 min_sdk_version: "30",
2666 }
2667 `)
2668 expectLink := func(from, from_variant, to, to_variant string) {
2669 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2670 libFlags := ld.Args["libFlags"]
2671 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2672 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002673 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002674 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002675}
2676
Jooyung Haned124c32021-01-26 11:43:46 +09002677func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002678 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2679 func(variables android.FixtureProductVariables) {
2680 variables.Platform_sdk_codename = proptools.StringPtr("S")
2681 variables.Platform_version_active_codenames = []string{"S"}
2682 },
2683 )
Jooyung Haned124c32021-01-26 11:43:46 +09002684 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2685 apex {
2686 name: "myapex",
2687 key: "myapex.key",
2688 native_shared_libs: ["libfoo"],
2689 min_sdk_version: "S",
2690 }
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696 cc_library {
2697 name: "libfoo",
2698 shared_libs: ["libbar"],
2699 apex_available: ["myapex"],
2700 min_sdk_version: "29",
2701 }
2702 cc_library {
2703 name: "libbar",
2704 apex_available: ["myapex"],
2705 }
2706 `, withSAsActiveCodeNames)
2707}
2708
2709func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002710 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2711 variables.Platform_sdk_codename = proptools.StringPtr("S")
2712 variables.Platform_version_active_codenames = []string{"S", "T"}
2713 })
Colin Cross1c460562021-02-16 17:55:47 -08002714 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002715 apex {
2716 name: "myapex",
2717 key: "myapex.key",
2718 native_shared_libs: ["libfoo"],
2719 min_sdk_version: "S",
2720 }
2721 apex_key {
2722 name: "myapex.key",
2723 public_key: "testkey.avbpubkey",
2724 private_key: "testkey.pem",
2725 }
2726 cc_library {
2727 name: "libfoo",
2728 shared_libs: ["libbar"],
2729 apex_available: ["myapex"],
2730 min_sdk_version: "S",
2731 }
2732 cc_library {
2733 name: "libbar",
2734 stubs: {
2735 symbol_file: "libbar.map.txt",
2736 versions: ["30", "S", "T"],
2737 },
2738 }
2739 `, withSAsActiveCodeNames)
2740
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002741 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002742 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2743 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002744 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002745}
2746
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002748 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002749 apex {
2750 name: "myapex",
2751 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002752 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002753 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002754 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002755 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002756 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002757 }
2758
2759 apex_key {
2760 name: "myapex.key",
2761 public_key: "testkey.avbpubkey",
2762 private_key: "testkey.pem",
2763 }
2764
2765 prebuilt_etc {
2766 name: "myetc",
2767 src: "myprebuilt",
2768 sub_dir: "foo/bar",
2769 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002770
2771 cc_library {
2772 name: "mylib",
2773 srcs: ["mylib.cpp"],
2774 relative_install_path: "foo/bar",
2775 system_shared_libs: [],
2776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002777 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 }
2779
2780 cc_binary {
2781 name: "mybin",
2782 srcs: ["mylib.cpp"],
2783 relative_install_path: "foo/bar",
2784 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002785 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002786 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002787 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002788
2789 rust_binary {
2790 name: "mybin.rust",
2791 srcs: ["foo.rs"],
2792 relative_install_path: "rust_subdir",
2793 apex_available: [ "myapex" ],
2794 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002795 `)
2796
Jooyung Hana0503a52023-08-23 13:12:50 +09002797 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002798 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002799
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002800 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002801 ensureContains(t, cmd, "/etc ")
2802 ensureContains(t, cmd, "/etc/foo ")
2803 ensureContains(t, cmd, "/etc/foo/bar ")
2804 ensureContains(t, cmd, "/lib64 ")
2805 ensureContains(t, cmd, "/lib64/foo ")
2806 ensureContains(t, cmd, "/lib64/foo/bar ")
2807 ensureContains(t, cmd, "/lib ")
2808 ensureContains(t, cmd, "/lib/foo ")
2809 ensureContains(t, cmd, "/lib/foo/bar ")
2810 ensureContains(t, cmd, "/bin ")
2811 ensureContains(t, cmd, "/bin/foo ")
2812 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002813 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002814}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002815
Jooyung Han35155c42020-02-06 17:33:20 +09002816func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002817 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002818 apex {
2819 name: "myapex",
2820 key: "myapex.key",
2821 multilib: {
2822 both: {
2823 native_shared_libs: ["mylib"],
2824 binaries: ["mybin"],
2825 },
2826 },
2827 compile_multilib: "both",
2828 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002829 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002830 }
2831
2832 apex_key {
2833 name: "myapex.key",
2834 public_key: "testkey.avbpubkey",
2835 private_key: "testkey.pem",
2836 }
2837
2838 cc_library {
2839 name: "mylib",
2840 relative_install_path: "foo/bar",
2841 system_shared_libs: [],
2842 stl: "none",
2843 apex_available: [ "myapex" ],
2844 native_bridge_supported: true,
2845 }
2846
2847 cc_binary {
2848 name: "mybin",
2849 relative_install_path: "foo/bar",
2850 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002851 stl: "none",
2852 apex_available: [ "myapex" ],
2853 native_bridge_supported: true,
2854 compile_multilib: "both", // default is "first" for binary
2855 multilib: {
2856 lib64: {
2857 suffix: "64",
2858 },
2859 },
2860 }
2861 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002862 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002863 "bin/foo/bar/mybin",
2864 "bin/foo/bar/mybin64",
2865 "bin/arm/foo/bar/mybin",
2866 "bin/arm64/foo/bar/mybin64",
2867 "lib/foo/bar/mylib.so",
2868 "lib/arm/foo/bar/mylib.so",
2869 "lib64/foo/bar/mylib.so",
2870 "lib64/arm64/foo/bar/mylib.so",
2871 })
2872}
2873
Jooyung Han85d61762020-06-24 23:50:26 +09002874func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002875 result := android.GroupFixturePreparers(
2876 prepareForApexTest,
2877 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2878 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002879 apex {
2880 name: "myapex",
2881 key: "myapex.key",
2882 binaries: ["mybin"],
2883 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002884 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002885 }
2886 apex_key {
2887 name: "myapex.key",
2888 public_key: "testkey.avbpubkey",
2889 private_key: "testkey.pem",
2890 }
2891 cc_binary {
2892 name: "mybin",
2893 vendor: true,
2894 shared_libs: ["libfoo"],
2895 }
2896 cc_library {
2897 name: "libfoo",
2898 proprietary: true,
2899 }
2900 `)
2901
Jooyung Hana0503a52023-08-23 13:12:50 +09002902 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002903 "bin/mybin",
2904 "lib64/libfoo.so",
2905 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2906 "lib64/libc++.so",
2907 })
2908
Jooyung Hana0503a52023-08-23 13:12:50 +09002909 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002910 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002911 name := apexBundle.BaseModuleName()
2912 prefix := "TARGET_"
2913 var builder strings.Builder
2914 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002915 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002916 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002917 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002918
Jooyung Hana0503a52023-08-23 13:12:50 +09002919 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002920 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2921 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002922}
2923
Jooyung Hanc5a96762022-02-04 11:54:50 +09002924func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2925 testApexError(t, `Trying to include a VNDK library`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2930 vendor: true,
2931 use_vndk_as_stable: true,
2932 updatable: false,
2933 }
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }`)
2939}
2940
Jooyung Handf78e212020-07-22 15:54:47 +09002941func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002942 // myapex myapex2
2943 // | |
2944 // mybin ------. mybin2
2945 // \ \ / |
2946 // (stable) .---\--------` |
2947 // \ / \ |
2948 // \ / \ /
2949 // libvndk libvendor
2950 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002952 apex {
2953 name: "myapex",
2954 key: "myapex.key",
2955 binaries: ["mybin"],
2956 vendor: true,
2957 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002958 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002959 }
2960 apex_key {
2961 name: "myapex.key",
2962 public_key: "testkey.avbpubkey",
2963 private_key: "testkey.pem",
2964 }
2965 cc_binary {
2966 name: "mybin",
2967 vendor: true,
2968 shared_libs: ["libvndk", "libvendor"],
2969 }
2970 cc_library {
2971 name: "libvndk",
2972 vndk: {
2973 enabled: true,
2974 },
2975 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002976 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002977 }
2978 cc_library {
2979 name: "libvendor",
2980 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002981 stl: "none",
2982 }
2983 apex {
2984 name: "myapex2",
2985 key: "myapex.key",
2986 binaries: ["mybin2"],
2987 vendor: true,
2988 use_vndk_as_stable: false,
2989 updatable: false,
2990 }
2991 cc_binary {
2992 name: "mybin2",
2993 vendor: true,
2994 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002995 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002996 `,
2997 android.FixtureModifyConfig(func(config android.Config) {
2998 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2999 }),
3000 )
Jooyung Handf78e212020-07-22 15:54:47 +09003001
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003002 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003003
Jooyung Han91f92032022-02-04 12:36:33 +09003004 for _, tc := range []struct {
3005 name string
3006 apexName string
3007 moduleName string
3008 moduleVariant string
3009 libs []string
3010 contents []string
3011 requireVndkNamespace bool
3012 }{
3013 {
3014 name: "use_vndk_as_stable",
3015 apexName: "myapex",
3016 moduleName: "mybin",
3017 moduleVariant: vendorVariant + "_apex10000",
3018 libs: []string{
3019 // should link with vendor variants of VNDK libs(libvndk/libc++)
3020 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3021 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3022 // unstable Vendor libs as APEX variant
3023 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3024 },
3025 contents: []string{
3026 "bin/mybin",
3027 "lib64/libvendor.so",
3028 // VNDK libs (libvndk/libc++) are not included
3029 },
3030 requireVndkNamespace: true,
3031 },
3032 {
3033 name: "!use_vndk_as_stable",
3034 apexName: "myapex2",
3035 moduleName: "mybin2",
3036 moduleVariant: vendorVariant + "_myapex2",
3037 libs: []string{
3038 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3039 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3040 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3041 // unstable vendor libs have "merged" APEX variants
3042 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3043 },
3044 contents: []string{
3045 "bin/mybin2",
3046 "lib64/libvendor.so",
3047 // VNDK libs are included as well
3048 "lib64/libvndk.so",
3049 "lib64/libc++.so",
3050 },
3051 requireVndkNamespace: false,
3052 },
3053 } {
3054 t.Run(tc.name, func(t *testing.T) {
3055 // Check linked libs
3056 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3057 libs := names(ldRule.Args["libFlags"])
3058 for _, lib := range tc.libs {
3059 ensureListContains(t, libs, lib)
3060 }
3061 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003062 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003063
Jooyung Han91f92032022-02-04 12:36:33 +09003064 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003065 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003066 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3067 if tc.requireVndkNamespace {
3068 ensureListContains(t, requireNativeLibs, ":vndk")
3069 } else {
3070 ensureListNotContains(t, requireNativeLibs, ":vndk")
3071 }
3072 })
3073 }
Jooyung Handf78e212020-07-22 15:54:47 +09003074}
3075
Justin Yun13decfb2021-03-08 19:25:55 +09003076func TestProductVariant(t *testing.T) {
3077 ctx := testApex(t, `
3078 apex {
3079 name: "myapex",
3080 key: "myapex.key",
3081 updatable: false,
3082 product_specific: true,
3083 binaries: ["foo"],
3084 }
3085
3086 apex_key {
3087 name: "myapex.key",
3088 public_key: "testkey.avbpubkey",
3089 private_key: "testkey.pem",
3090 }
3091
3092 cc_binary {
3093 name: "foo",
3094 product_available: true,
3095 apex_available: ["myapex"],
3096 srcs: ["foo.cpp"],
3097 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003098 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003099
3100 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003101 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003102 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3103 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3104 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3105 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3106}
3107
Jooyung Han8e5685d2020-09-21 11:02:57 +09003108func TestApex_withPrebuiltFirmware(t *testing.T) {
3109 testCases := []struct {
3110 name string
3111 additionalProp string
3112 }{
3113 {"system apex with prebuilt_firmware", ""},
3114 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3115 }
3116 for _, tc := range testCases {
3117 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003118 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003119 apex {
3120 name: "myapex",
3121 key: "myapex.key",
3122 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003123 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003124 `+tc.additionalProp+`
3125 }
3126 apex_key {
3127 name: "myapex.key",
3128 public_key: "testkey.avbpubkey",
3129 private_key: "testkey.pem",
3130 }
3131 prebuilt_firmware {
3132 name: "myfirmware",
3133 src: "myfirmware.bin",
3134 filename_from_src: true,
3135 `+tc.additionalProp+`
3136 }
3137 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003138 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003139 "etc/firmware/myfirmware.bin",
3140 })
3141 })
3142 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003143}
3144
Jooyung Hanefb184e2020-06-25 17:14:25 +09003145func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003146 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003147 apex {
3148 name: "myapex",
3149 key: "myapex.key",
3150 vendor: true,
3151 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003152 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003153 }
3154
3155 apex_key {
3156 name: "myapex.key",
3157 public_key: "testkey.avbpubkey",
3158 private_key: "testkey.pem",
3159 }
3160
3161 cc_library {
3162 name: "mylib",
3163 vendor_available: true,
3164 }
3165 `)
3166
Jooyung Hana0503a52023-08-23 13:12:50 +09003167 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003168 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003169 name := apexBundle.BaseModuleName()
3170 prefix := "TARGET_"
3171 var builder strings.Builder
3172 data.Custom(&builder, name, prefix, "", data)
3173 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003174 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 +09003175}
3176
Jooyung Han2ed99d02020-06-24 23:26:26 +09003177func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 vintf_fragments: ["fragment.xml"],
3183 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003184 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003185 }
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191 cc_binary {
3192 name: "mybin",
3193 }
3194 `)
3195
Jooyung Hana0503a52023-08-23 13:12:50 +09003196 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003197 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003198 name := apexBundle.BaseModuleName()
3199 prefix := "TARGET_"
3200 var builder strings.Builder
3201 data.Custom(&builder, name, prefix, "", data)
3202 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003203 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003204 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003205}
3206
Jiyong Park16e91a02018-12-20 18:18:08 +09003207func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003208 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 apex {
3210 name: "myapex",
3211 key: "myapex.key",
3212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003213 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003214 }
3215
3216 apex_key {
3217 name: "myapex.key",
3218 public_key: "testkey.avbpubkey",
3219 private_key: "testkey.pem",
3220 }
3221
3222 cc_library {
3223 name: "mylib",
3224 srcs: ["mylib.cpp"],
3225 system_shared_libs: [],
3226 stl: "none",
3227 stubs: {
3228 versions: ["1", "2", "3"],
3229 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003230 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003231 }
3232
3233 cc_binary {
3234 name: "not_in_apex",
3235 srcs: ["mylib.cpp"],
3236 static_libs: ["mylib"],
3237 static_executable: true,
3238 system_shared_libs: [],
3239 stl: "none",
3240 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003241 `)
3242
Colin Cross7113d202019-11-20 16:39:12 -08003243 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003244
3245 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003246 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003247}
Jiyong Park9335a262018-12-24 11:31:58 +09003248
3249func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003251 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003253 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003254 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003255 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003256 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003257 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003266 }
3267
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
3272 }
3273
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003274 android_app_certificate {
3275 name: "myapex.certificate",
3276 certificate: "testkey",
3277 }
3278
3279 android_app_certificate {
3280 name: "myapex.certificate.override",
3281 certificate: "testkey.override",
3282 }
3283
Jiyong Park9335a262018-12-24 11:31:58 +09003284 `)
3285
3286 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003287 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003288
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003289 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3290 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003291 "vendor/foo/devkeys/testkey.avbpubkey")
3292 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003293 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3294 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003295 "vendor/foo/devkeys/testkey.pem")
3296 }
3297
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003298 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003299 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003300 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003301 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003302 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003303 }
3304}
Jiyong Park58e364a2019-01-19 19:24:06 +09003305
Jooyung Hanf121a652019-12-17 14:30:11 +09003306func TestCertificate(t *testing.T) {
3307 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003308 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 apex {
3310 name: "myapex",
3311 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003312 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003313 }
3314 apex_key {
3315 name: "myapex.key",
3316 public_key: "testkey.avbpubkey",
3317 private_key: "testkey.pem",
3318 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003319 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003320 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3321 if actual := rule.Args["certificates"]; actual != expected {
3322 t.Errorf("certificates should be %q, not %q", expected, actual)
3323 }
3324 })
3325 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003326 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003327 apex {
3328 name: "myapex_keytest",
3329 key: "myapex.key",
3330 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003331 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003332 }
3333 apex_key {
3334 name: "myapex.key",
3335 public_key: "testkey.avbpubkey",
3336 private_key: "testkey.pem",
3337 }
3338 android_app_certificate {
3339 name: "myapex.certificate.override",
3340 certificate: "testkey.override",
3341 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003342 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 expected := "testkey.override.x509.pem testkey.override.pk8"
3344 if actual := rule.Args["certificates"]; actual != expected {
3345 t.Errorf("certificates should be %q, not %q", expected, actual)
3346 }
3347 })
3348 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003349 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003350 apex {
3351 name: "myapex",
3352 key: "myapex.key",
3353 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003354 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003355 }
3356 apex_key {
3357 name: "myapex.key",
3358 public_key: "testkey.avbpubkey",
3359 private_key: "testkey.pem",
3360 }
3361 android_app_certificate {
3362 name: "myapex.certificate",
3363 certificate: "testkey",
3364 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003365 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 expected := "testkey.x509.pem testkey.pk8"
3367 if actual := rule.Args["certificates"]; actual != expected {
3368 t.Errorf("certificates should be %q, not %q", expected, actual)
3369 }
3370 })
3371 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003372 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003373 apex {
3374 name: "myapex_keytest",
3375 key: "myapex.key",
3376 file_contexts: ":myapex-file_contexts",
3377 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003378 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003379 }
3380 apex_key {
3381 name: "myapex.key",
3382 public_key: "testkey.avbpubkey",
3383 private_key: "testkey.pem",
3384 }
3385 android_app_certificate {
3386 name: "myapex.certificate.override",
3387 certificate: "testkey.override",
3388 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003389 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003390 expected := "testkey.override.x509.pem testkey.override.pk8"
3391 if actual := rule.Args["certificates"]; actual != expected {
3392 t.Errorf("certificates should be %q, not %q", expected, actual)
3393 }
3394 })
3395 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003396 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 apex {
3398 name: "myapex",
3399 key: "myapex.key",
3400 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003401 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 }
3403 apex_key {
3404 name: "myapex.key",
3405 public_key: "testkey.avbpubkey",
3406 private_key: "testkey.pem",
3407 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003408 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3410 if actual := rule.Args["certificates"]; actual != expected {
3411 t.Errorf("certificates should be %q, not %q", expected, actual)
3412 }
3413 })
3414 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003415 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003416 apex {
3417 name: "myapex_keytest",
3418 key: "myapex.key",
3419 file_contexts: ":myapex-file_contexts",
3420 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003421 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003422 }
3423 apex_key {
3424 name: "myapex.key",
3425 public_key: "testkey.avbpubkey",
3426 private_key: "testkey.pem",
3427 }
3428 android_app_certificate {
3429 name: "myapex.certificate.override",
3430 certificate: "testkey.override",
3431 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003432 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003433 expected := "testkey.override.x509.pem testkey.override.pk8"
3434 if actual := rule.Args["certificates"]; actual != expected {
3435 t.Errorf("certificates should be %q, not %q", expected, actual)
3436 }
3437 })
3438}
3439
Jiyong Park58e364a2019-01-19 19:24:06 +09003440func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003441 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003442 apex {
3443 name: "myapex",
3444 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003445 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003446 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003447 }
3448
3449 apex {
3450 name: "otherapex",
3451 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003452 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003453 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003454 }
3455
3456 apex_key {
3457 name: "myapex.key",
3458 public_key: "testkey.avbpubkey",
3459 private_key: "testkey.pem",
3460 }
3461
3462 cc_library {
3463 name: "mylib",
3464 srcs: ["mylib.cpp"],
3465 system_shared_libs: [],
3466 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003467 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003468 "myapex",
3469 "otherapex",
3470 ],
Jooyung Han24282772020-03-21 23:20:55 +09003471 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003472 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003473 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003474 cc_library {
3475 name: "mylib2",
3476 srcs: ["mylib.cpp"],
3477 system_shared_libs: [],
3478 stl: "none",
3479 apex_available: [
3480 "myapex",
3481 "otherapex",
3482 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003483 static_libs: ["mylib3"],
3484 recovery_available: true,
3485 min_sdk_version: "29",
3486 }
3487 cc_library {
3488 name: "mylib3",
3489 srcs: ["mylib.cpp"],
3490 system_shared_libs: [],
3491 stl: "none",
3492 apex_available: [
3493 "myapex",
3494 "otherapex",
3495 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003496 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003497 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003498 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003499 `)
3500
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003502 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003503 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504
Vinh Tranf9754732023-01-19 22:41:46 -05003505 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003506 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003507 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003508
Vinh Tranf9754732023-01-19 22:41:46 -05003509 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003510 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003511 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003512
Colin Crossaede88c2020-08-11 12:17:01 -07003513 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3514 // each variant defines additional macros to distinguish which apex variant it is built for
3515
3516 // non-APEX variant does not have __ANDROID_APEX__ defined
3517 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3519
Vinh Tranf9754732023-01-19 22:41:46 -05003520 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003521 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003523
Jooyung Hanc87a0592020-03-02 17:44:33 +09003524 // non-APEX variant does not have __ANDROID_APEX__ defined
3525 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3526 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3527
Vinh Tranf9754732023-01-19 22:41:46 -05003528 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003529 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003530 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003531}
Jiyong Park7e636d02019-01-28 16:16:54 +09003532
3533func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003534 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003535 apex {
3536 name: "myapex",
3537 key: "myapex.key",
3538 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003539 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003540 }
3541
3542 apex_key {
3543 name: "myapex.key",
3544 public_key: "testkey.avbpubkey",
3545 private_key: "testkey.pem",
3546 }
3547
3548 cc_library_headers {
3549 name: "mylib_headers",
3550 export_include_dirs: ["my_include"],
3551 system_shared_libs: [],
3552 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003553 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003554 }
3555
3556 cc_library {
3557 name: "mylib",
3558 srcs: ["mylib.cpp"],
3559 system_shared_libs: [],
3560 stl: "none",
3561 header_libs: ["mylib_headers"],
3562 export_header_lib_headers: ["mylib_headers"],
3563 stubs: {
3564 versions: ["1", "2", "3"],
3565 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003566 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003567 }
3568
3569 cc_library {
3570 name: "otherlib",
3571 srcs: ["mylib.cpp"],
3572 system_shared_libs: [],
3573 stl: "none",
3574 shared_libs: ["mylib"],
3575 }
3576 `)
3577
Colin Cross7113d202019-11-20 16:39:12 -08003578 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003579
3580 // Ensure that the include path of the header lib is exported to 'otherlib'
3581 ensureContains(t, cFlags, "-Imy_include")
3582}
Alex Light9670d332019-01-29 18:07:33 -08003583
Jiyong Park7cd10e32020-01-14 09:22:18 +09003584type fileInApex struct {
3585 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003586 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003587 isLink bool
3588}
3589
Jooyung Han1724d582022-12-21 10:17:44 +09003590func (f fileInApex) String() string {
3591 return f.src + ":" + f.path
3592}
3593
3594func (f fileInApex) match(expectation string) bool {
3595 parts := strings.Split(expectation, ":")
3596 if len(parts) == 1 {
3597 match, _ := path.Match(parts[0], f.path)
3598 return match
3599 }
3600 if len(parts) == 2 {
3601 matchSrc, _ := path.Match(parts[0], f.src)
3602 matchDst, _ := path.Match(parts[1], f.path)
3603 return matchSrc && matchDst
3604 }
3605 panic("invalid expected file specification: " + expectation)
3606}
3607
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003610 module := ctx.ModuleForTests(moduleName, variant)
3611 apexRule := module.MaybeRule("apexRule")
3612 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003613 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003615 for _, cmd := range strings.Split(copyCmds, "&&") {
3616 cmd = strings.TrimSpace(cmd)
3617 if cmd == "" {
3618 continue
3619 }
3620 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003621 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 switch terms[0] {
3624 case "mkdir":
3625 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003627 t.Fatal("copyCmds contains invalid cp command", cmd)
3628 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003629 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003630 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003631 isLink = false
3632 case "ln":
3633 if len(terms) != 3 && len(terms) != 4 {
3634 // ln LINK TARGET or ln -s LINK TARGET
3635 t.Fatal("copyCmds contains invalid ln command", cmd)
3636 }
3637 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003638 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003639 isLink = true
3640 default:
3641 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3642 }
3643 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003644 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003646 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 }
Jooyung Han1724d582022-12-21 10:17:44 +09003648 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003649 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 }
3651 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 return ret
3653}
3654
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003656 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003657 var failed bool
3658 var surplus []string
3659 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003660 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003661 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003662 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003663 if file.match(expected) {
3664 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003666 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 }
3668 }
Jooyung Han1724d582022-12-21 10:17:44 +09003669 if !matchFound {
3670 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003671 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003672 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003673
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003675 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003676 t.Log("surplus files", surplus)
3677 failed = true
3678 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003680 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003682 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003683 if !filesMatched[expected] {
3684 missing = append(missing, expected)
3685 }
3686 }
3687 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003688 t.Log("missing files", missing)
3689 failed = true
3690 }
3691 if failed {
3692 t.Fail()
3693 }
3694}
3695
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003696func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3697 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3698}
3699
3700func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3701 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3702 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3703 if deapexer.Output != nil {
3704 outputs = append(outputs, deapexer.Output.String())
3705 }
3706 for _, output := range deapexer.ImplicitOutputs {
3707 outputs = append(outputs, output.String())
3708 }
3709 actualFiles := make([]fileInApex, 0, len(outputs))
3710 for _, output := range outputs {
3711 dir := "/deapexer/"
3712 pos := strings.LastIndex(output, dir)
3713 if pos == -1 {
3714 t.Fatal("Unknown deapexer output ", output)
3715 }
3716 path := output[pos+len(dir):]
3717 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3718 }
3719 assertFileListEquals(t, files, actualFiles)
3720}
3721
Jooyung Han344d5432019-08-23 11:17:39 +09003722func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003723 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003724 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003725 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003726 "etc/llndk.libraries.29.txt",
3727 "etc/vndkcore.libraries.29.txt",
3728 "etc/vndksp.libraries.29.txt",
3729 "etc/vndkprivate.libraries.29.txt",
3730 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003731 }
3732 testCases := []struct {
3733 vndkVersion string
3734 expectedFiles []string
3735 }{
3736 {
3737 vndkVersion: "current",
3738 expectedFiles: append(commonFiles,
3739 "lib/libvndk.so",
3740 "lib/libvndksp.so",
3741 "lib64/libvndk.so",
3742 "lib64/libvndksp.so"),
3743 },
3744 {
3745 vndkVersion: "",
3746 expectedFiles: append(commonFiles,
3747 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3748 "lib/libvndksp.so",
3749 "lib64/libvndksp.so"),
3750 },
3751 }
3752 for _, tc := range testCases {
3753 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3754 ctx := testApex(t, `
3755 apex_vndk {
3756 name: "com.android.vndk.current",
3757 key: "com.android.vndk.current.key",
3758 updatable: false,
3759 }
3760
3761 apex_key {
3762 name: "com.android.vndk.current.key",
3763 public_key: "testkey.avbpubkey",
3764 private_key: "testkey.pem",
3765 }
3766
3767 cc_library {
3768 name: "libvndk",
3769 srcs: ["mylib.cpp"],
3770 vendor_available: true,
3771 product_available: true,
3772 vndk: {
3773 enabled: true,
3774 },
3775 system_shared_libs: [],
3776 stl: "none",
3777 apex_available: [ "com.android.vndk.current" ],
3778 }
3779
3780 cc_library {
3781 name: "libvndksp",
3782 srcs: ["mylib.cpp"],
3783 vendor_available: true,
3784 product_available: true,
3785 vndk: {
3786 enabled: true,
3787 support_system_process: true,
3788 },
3789 system_shared_libs: [],
3790 stl: "none",
3791 apex_available: [ "com.android.vndk.current" ],
3792 }
3793
3794 // VNDK-Ext should not cause any problems
3795
3796 cc_library {
3797 name: "libvndk.ext",
3798 srcs: ["mylib2.cpp"],
3799 vendor: true,
3800 vndk: {
3801 enabled: true,
3802 extends: "libvndk",
3803 },
3804 system_shared_libs: [],
3805 stl: "none",
3806 }
3807
3808 cc_library {
3809 name: "libvndksp.ext",
3810 srcs: ["mylib2.cpp"],
3811 vendor: true,
3812 vndk: {
3813 enabled: true,
3814 support_system_process: true,
3815 extends: "libvndksp",
3816 },
3817 system_shared_libs: [],
3818 stl: "none",
3819 }
3820 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3821 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003822 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003823 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003824 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003825 })
3826 }
Jooyung Han344d5432019-08-23 11:17:39 +09003827}
3828
3829func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003830 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003831 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003832 name: "com.android.vndk.current",
3833 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003834 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003835 }
3836
3837 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003838 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003839 public_key: "testkey.avbpubkey",
3840 private_key: "testkey.pem",
3841 }
3842
3843 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 name: "libvndk",
3845 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003846 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003847 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003848 vndk: {
3849 enabled: true,
3850 },
3851 system_shared_libs: [],
3852 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003853 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003854 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003855
3856 cc_prebuilt_library_shared {
3857 name: "libvndk.arm",
3858 srcs: ["libvndk.arm.so"],
3859 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003860 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003861 vndk: {
3862 enabled: true,
3863 },
3864 enabled: false,
3865 arch: {
3866 arm: {
3867 enabled: true,
3868 },
3869 },
3870 system_shared_libs: [],
3871 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003872 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 `+vndkLibrariesTxtFiles("current"),
3875 withFiles(map[string][]byte{
3876 "libvndk.so": nil,
3877 "libvndk.arm.so": nil,
3878 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003879 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 "lib/libvndk.so",
3881 "lib/libvndk.arm.so",
3882 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003883 "lib/libc++.so",
3884 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003886 })
Jooyung Han344d5432019-08-23 11:17:39 +09003887}
3888
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889func vndkLibrariesTxtFiles(vers ...string) (result string) {
3890 for _, v := range vers {
3891 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003892 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003893 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003894 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003895 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003896 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 }
3898 `
3899 }
Justin Yund5784122023-10-25 13:25:32 +09003900 result += `
3901 llndk_libraries_txt {
3902 name: "llndk.libraries.txt",
3903 }
3904 llndk_libraries_txt_for_apex {
3905 name: "llndk.libraries.txt.apex",
3906 stem: "llndk.libraries.txt",
3907 insert_vndk_version: true,
3908 }
3909 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003911 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003912 result += `
3913 prebuilt_etc {
3914 name: "` + txt + `.libraries.` + v + `.txt",
3915 src: "dummy.txt",
3916 }
3917 `
3918 }
3919 }
3920 }
3921 return
3922}
3923
Jooyung Han344d5432019-08-23 11:17:39 +09003924func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003925 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003926 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003927 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003928 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003929 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003930 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003932 }
3933
3934 apex_key {
3935 name: "myapex.key",
3936 public_key: "testkey.avbpubkey",
3937 private_key: "testkey.pem",
3938 }
3939
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 vndk_prebuilt_shared {
3941 name: "libvndk27",
3942 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003943 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003944 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003945 vndk: {
3946 enabled: true,
3947 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003948 target_arch: "arm64",
3949 arch: {
3950 arm: {
3951 srcs: ["libvndk27_arm.so"],
3952 },
3953 arm64: {
3954 srcs: ["libvndk27_arm64.so"],
3955 },
3956 },
Colin Cross2807f002021-03-02 10:15:29 -08003957 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003958 }
3959
3960 vndk_prebuilt_shared {
3961 name: "libvndk27",
3962 version: "27",
3963 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003964 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003965 vndk: {
3966 enabled: true,
3967 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003968 target_arch: "x86_64",
3969 arch: {
3970 x86: {
3971 srcs: ["libvndk27_x86.so"],
3972 },
3973 x86_64: {
3974 srcs: ["libvndk27_x86_64.so"],
3975 },
3976 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003977 }
3978 `+vndkLibrariesTxtFiles("27"),
3979 withFiles(map[string][]byte{
3980 "libvndk27_arm.so": nil,
3981 "libvndk27_arm64.so": nil,
3982 "libvndk27_x86.so": nil,
3983 "libvndk27_x86_64.so": nil,
3984 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003985
Jooyung Hana0503a52023-08-23 13:12:50 +09003986 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 "lib/libvndk27_arm.so",
3988 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003989 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003990 })
Jooyung Han344d5432019-08-23 11:17:39 +09003991}
3992
Jooyung Han90eee022019-10-01 20:02:42 +09003993func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003994 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003995 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003996 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003997 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003998 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004000 }
4001 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004002 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004003 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004005 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004006 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004007 }
4008 apex_key {
4009 name: "myapex.key",
4010 public_key: "testkey.avbpubkey",
4011 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004012 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004013
4014 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004015 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004016 apexManifestRule := module.Rule("apexManifestRule")
4017 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004018 }
4019
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004020 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004021 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004022}
4023
Jooyung Han344d5432019-08-23 11:17:39 +09004024func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004025 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004026 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current",
4028 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004030 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004031 }
4032
4033 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004034 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004035 public_key: "testkey.avbpubkey",
4036 private_key: "testkey.pem",
4037 }
4038
4039 cc_library {
4040 name: "libvndk",
4041 srcs: ["mylib.cpp"],
4042 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004043 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004044 native_bridge_supported: true,
4045 host_supported: true,
4046 vndk: {
4047 enabled: true,
4048 },
4049 system_shared_libs: [],
4050 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004051 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004052 }
Colin Cross2807f002021-03-02 10:15:29 -08004053 `+vndkLibrariesTxtFiles("current"),
4054 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004055
Jooyung Hana0503a52023-08-23 13:12:50 +09004056 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 "lib/libvndk.so",
4058 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004059 "lib/libc++.so",
4060 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004061 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004062 })
Jooyung Han344d5432019-08-23 11:17:39 +09004063}
4064
4065func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004066 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004067 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004068 name: "com.android.vndk.current",
4069 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004070 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004071 native_bridge_supported: true,
4072 }
4073
4074 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004075 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004076 public_key: "testkey.avbpubkey",
4077 private_key: "testkey.pem",
4078 }
4079
4080 cc_library {
4081 name: "libvndk",
4082 srcs: ["mylib.cpp"],
4083 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004084 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004085 native_bridge_supported: true,
4086 host_supported: true,
4087 vndk: {
4088 enabled: true,
4089 },
4090 system_shared_libs: [],
4091 stl: "none",
4092 }
4093 `)
4094}
4095
Jooyung Han31c470b2019-10-18 16:26:59 +09004096func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004097 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004100 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004103 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004104 }
4105
4106 apex_key {
4107 name: "myapex.key",
4108 public_key: "testkey.avbpubkey",
4109 private_key: "testkey.pem",
4110 }
4111
4112 vndk_prebuilt_shared {
4113 name: "libvndk27",
4114 version: "27",
4115 target_arch: "arm",
4116 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004117 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004118 vndk: {
4119 enabled: true,
4120 },
4121 arch: {
4122 arm: {
4123 srcs: ["libvndk27.so"],
4124 }
4125 },
4126 }
4127
4128 vndk_prebuilt_shared {
4129 name: "libvndk27",
4130 version: "27",
4131 target_arch: "arm",
4132 binder32bit: true,
4133 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004134 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004135 vndk: {
4136 enabled: true,
4137 },
4138 arch: {
4139 arm: {
4140 srcs: ["libvndk27binder32.so"],
4141 }
4142 },
Colin Cross2807f002021-03-02 10:15:29 -08004143 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004145 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004146 withFiles(map[string][]byte{
4147 "libvndk27.so": nil,
4148 "libvndk27binder32.so": nil,
4149 }),
4150 withBinder32bit,
4151 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004152 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004153 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4154 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 },
4156 }),
4157 )
4158
Jooyung Hana0503a52023-08-23 13:12:50 +09004159 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004160 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004161 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004162 })
4163}
4164
Jooyung Han45a96772020-06-15 14:59:42 +09004165func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004166 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004167 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004168 name: "com.android.vndk.current",
4169 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004170 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004171 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004172 }
4173
4174 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004175 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004176 public_key: "testkey.avbpubkey",
4177 private_key: "testkey.pem",
4178 }
4179
4180 cc_library {
4181 name: "libz",
4182 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004183 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004184 vndk: {
4185 enabled: true,
4186 },
4187 stubs: {
4188 symbol_file: "libz.map.txt",
4189 versions: ["30"],
4190 }
4191 }
4192 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4193 "libz.map.txt": nil,
4194 }))
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004197 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4198 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004199 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004200 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4201 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4202 "*/*",
4203 })
Jooyung Han45a96772020-06-15 14:59:42 +09004204}
4205
Jooyung Hane3f02812023-05-08 13:54:50 +09004206func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4207 ctx := testApex(t, "",
4208 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4209 variables.DeviceVndkVersion = proptools.StringPtr("27")
4210 }),
4211 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4212 cc.RegisterVendorSnapshotModules(ctx)
4213 }),
4214 withFiles(map[string][]byte{
4215 "vendor/foo/Android.bp": []byte(`
4216 apex {
4217 name: "myapex",
4218 binaries: ["foo"],
4219 key: "myapex.key",
4220 min_sdk_version: "27",
4221 vendor: true,
4222 }
4223
4224 cc_binary {
4225 name: "foo",
4226 vendor: true,
4227 srcs: ["abc.cpp"],
4228 shared_libs: [
4229 "libllndk",
4230 "libvndk",
4231 ],
4232 nocrt: true,
4233 system_shared_libs: [],
4234 min_sdk_version: "27",
4235 }
4236
4237 apex_key {
4238 name: "myapex.key",
4239 public_key: "testkey.avbpubkey",
4240 private_key: "testkey.pem",
4241 }
4242 `),
4243 // Simulate VNDK prebuilts with vendor_snapshot
4244 "prebuilts/vndk/Android.bp": []byte(`
4245 vndk_prebuilt_shared {
4246 name: "libllndk",
4247 version: "27",
4248 vendor_available: true,
4249 product_available: true,
4250 target_arch: "arm64",
4251 arch: {
4252 arm64: {
4253 srcs: ["libllndk.so"],
4254 },
4255 },
4256 }
4257
4258 vndk_prebuilt_shared {
4259 name: "libvndk",
4260 version: "27",
4261 vendor_available: true,
4262 product_available: true,
4263 target_arch: "arm64",
4264 arch: {
4265 arm64: {
4266 srcs: ["libvndk.so"],
4267 },
4268 },
4269 vndk: {
4270 enabled: true,
4271 },
4272 min_sdk_version: "27",
4273 }
4274
4275 vndk_prebuilt_shared {
4276 name: "libc++",
4277 version: "27",
4278 target_arch: "arm64",
4279 vendor_available: true,
4280 product_available: true,
4281 vndk: {
4282 enabled: true,
4283 support_system_process: true,
4284 },
4285 arch: {
4286 arm64: {
4287 srcs: ["libc++.so"],
4288 },
4289 },
4290 min_sdk_version: "apex_inherit",
4291 }
4292
4293 vendor_snapshot {
4294 name: "vendor_snapshot",
4295 version: "27",
4296 arch: {
4297 arm64: {
4298 vndk_libs: [
4299 "libc++",
4300 "libllndk",
4301 "libvndk",
4302 ],
4303 static_libs: [
4304 "libc++demangle",
4305 "libclang_rt.builtins",
4306 "libunwind",
4307 ],
4308 },
4309 }
4310 }
4311
4312 vendor_snapshot_static {
4313 name: "libclang_rt.builtins",
4314 version: "27",
4315 target_arch: "arm64",
4316 vendor: true,
4317 arch: {
4318 arm64: {
4319 src: "libclang_rt.builtins-aarch64-android.a",
4320 },
4321 },
4322 }
4323
4324 vendor_snapshot_static {
4325 name: "libc++demangle",
4326 version: "27",
4327 target_arch: "arm64",
4328 compile_multilib: "64",
4329 vendor: true,
4330 arch: {
4331 arm64: {
4332 src: "libc++demangle.a",
4333 },
4334 },
4335 min_sdk_version: "apex_inherit",
4336 }
4337
4338 vendor_snapshot_static {
4339 name: "libunwind",
4340 version: "27",
4341 target_arch: "arm64",
4342 compile_multilib: "64",
4343 vendor: true,
4344 arch: {
4345 arm64: {
4346 src: "libunwind.a",
4347 },
4348 },
4349 min_sdk_version: "apex_inherit",
4350 }
4351 `),
4352 }))
4353
4354 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004355 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004356 "bin/foo",
4357 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4358 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4359 })
4360
4361 // Should link foo with prebuilt libraries (shared/static)
4362 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4363 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4364 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4365 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4366 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4367
4368 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004369 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004370 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4371 ensureListContains(t, requireNativeLibs, "libllndk.so")
4372}
4373
Jooyung Hane1633032019-08-01 17:41:43 +09004374func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004376 apex {
4377 name: "myapex_nodep",
4378 key: "myapex.key",
4379 native_shared_libs: ["lib_nodep"],
4380 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004381 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004382 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004383 }
4384
4385 apex {
4386 name: "myapex_dep",
4387 key: "myapex.key",
4388 native_shared_libs: ["lib_dep"],
4389 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004390 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004391 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004392 }
4393
4394 apex {
4395 name: "myapex_provider",
4396 key: "myapex.key",
4397 native_shared_libs: ["libfoo"],
4398 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004399 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004401 }
4402
4403 apex {
4404 name: "myapex_selfcontained",
4405 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004406 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004407 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004408 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004410 }
4411
4412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
4417
4418 cc_library {
4419 name: "lib_nodep",
4420 srcs: ["mylib.cpp"],
4421 system_shared_libs: [],
4422 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004423 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004424 }
4425
4426 cc_library {
4427 name: "lib_dep",
4428 srcs: ["mylib.cpp"],
4429 shared_libs: ["libfoo"],
4430 system_shared_libs: [],
4431 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004432 apex_available: [
4433 "myapex_dep",
4434 "myapex_provider",
4435 "myapex_selfcontained",
4436 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004440 name: "lib_dep_on_bar",
4441 srcs: ["mylib.cpp"],
4442 shared_libs: ["libbar"],
4443 system_shared_libs: [],
4444 stl: "none",
4445 apex_available: [
4446 "myapex_selfcontained",
4447 ],
4448 }
4449
4450
4451 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004452 name: "libfoo",
4453 srcs: ["mytest.cpp"],
4454 stubs: {
4455 versions: ["1"],
4456 },
4457 system_shared_libs: [],
4458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004459 apex_available: [
4460 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004461 ],
4462 }
4463
4464 cc_library {
4465 name: "libbar",
4466 srcs: ["mytest.cpp"],
4467 stubs: {
4468 versions: ["1"],
4469 },
4470 system_shared_libs: [],
4471 stl: "none",
4472 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004473 "myapex_selfcontained",
4474 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004475 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004476
Jooyung Hane1633032019-08-01 17:41:43 +09004477 `)
4478
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004479 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004480 var provideNativeLibs, requireNativeLibs []string
4481
Jooyung Hana0503a52023-08-23 13:12:50 +09004482 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004483 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4484 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004485 ensureListEmpty(t, provideNativeLibs)
4486 ensureListEmpty(t, requireNativeLibs)
4487
Jooyung Hana0503a52023-08-23 13:12:50 +09004488 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004489 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4490 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004491 ensureListEmpty(t, provideNativeLibs)
4492 ensureListContains(t, requireNativeLibs, "libfoo.so")
4493
Jooyung Hana0503a52023-08-23 13:12:50 +09004494 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004495 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4496 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004497 ensureListContains(t, provideNativeLibs, "libfoo.so")
4498 ensureListEmpty(t, requireNativeLibs)
4499
Jooyung Hana0503a52023-08-23 13:12:50 +09004500 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004501 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4502 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004503 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004504 ensureListEmpty(t, requireNativeLibs)
4505}
4506
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004507func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4508 ctx := testApex(t, `
4509 apex {
4510 name: "myapex",
4511 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004512 native_shared_libs: ["mylib"],
4513 updatable: false,
4514 }
4515
4516 apex_key {
4517 name: "myapex.key",
4518 public_key: "testkey.avbpubkey",
4519 private_key: "testkey.pem",
4520 }
4521
4522 cc_library {
4523 name: "mylib",
4524 srcs: ["mylib.cpp"],
4525 system_shared_libs: [],
4526 stl: "none",
4527 apex_available: [
4528 "//apex_available:platform",
4529 "myapex",
4530 ],
4531 }
4532 `, android.FixtureMergeEnv(map[string]string{
4533 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4534 }))
4535
Jooyung Hana0503a52023-08-23 13:12:50 +09004536 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004537 apexManifestRule := module.Rule("apexManifestRule")
4538 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4539}
4540
Vinh Tran8f5310f2022-10-07 18:16:47 -04004541func TestCompileMultilibProp(t *testing.T) {
4542 testCases := []struct {
4543 compileMultiLibProp string
4544 containedLibs []string
4545 notContainedLibs []string
4546 }{
4547 {
4548 containedLibs: []string{
4549 "image.apex/lib64/mylib.so",
4550 "image.apex/lib/mylib.so",
4551 },
4552 compileMultiLibProp: `compile_multilib: "both",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib64/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4557 compileMultiLibProp: `compile_multilib: "first",`,
4558 },
4559 {
4560 containedLibs: []string{"image.apex/lib64/mylib.so"},
4561 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4562 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4563 },
4564 {
4565 containedLibs: []string{"image.apex/lib64/mylib.so"},
4566 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4567 compileMultiLibProp: `compile_multilib: "64",`,
4568 },
4569 {
4570 containedLibs: []string{"image.apex/lib/mylib.so"},
4571 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4572 compileMultiLibProp: `compile_multilib: "32",`,
4573 },
4574 }
4575 for _, testCase := range testCases {
4576 ctx := testApex(t, fmt.Sprintf(`
4577 apex {
4578 name: "myapex",
4579 key: "myapex.key",
4580 %s
4581 native_shared_libs: ["mylib"],
4582 updatable: false,
4583 }
4584 apex_key {
4585 name: "myapex.key",
4586 public_key: "testkey.avbpubkey",
4587 private_key: "testkey.pem",
4588 }
4589 cc_library {
4590 name: "mylib",
4591 srcs: ["mylib.cpp"],
4592 apex_available: [
4593 "//apex_available:platform",
4594 "myapex",
4595 ],
4596 }
4597 `, testCase.compileMultiLibProp),
4598 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004599 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004600 apexRule := module.Rule("apexRule")
4601 copyCmds := apexRule.Args["copy_commands"]
4602 for _, containedLib := range testCase.containedLibs {
4603 ensureContains(t, copyCmds, containedLib)
4604 }
4605 for _, notContainedLib := range testCase.notContainedLibs {
4606 ensureNotContains(t, copyCmds, notContainedLib)
4607 }
4608 }
4609}
4610
Alex Light0851b882019-02-07 13:20:53 -08004611func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004612 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004613 apex {
4614 name: "myapex",
4615 key: "myapex.key",
4616 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004617 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004618 }
4619
4620 apex_key {
4621 name: "myapex.key",
4622 public_key: "testkey.avbpubkey",
4623 private_key: "testkey.pem",
4624 }
4625
4626 cc_library {
4627 name: "mylib_common",
4628 srcs: ["mylib.cpp"],
4629 system_shared_libs: [],
4630 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004631 apex_available: [
4632 "//apex_available:platform",
4633 "myapex",
4634 ],
Alex Light0851b882019-02-07 13:20:53 -08004635 }
4636 `)
4637
Jooyung Hana0503a52023-08-23 13:12:50 +09004638 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004639 apexRule := module.Rule("apexRule")
4640 copyCmds := apexRule.Args["copy_commands"]
4641
4642 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4643 t.Log("Apex was a test apex!")
4644 t.Fail()
4645 }
4646 // Ensure that main rule creates an output
4647 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4648
4649 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004650 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004651
4652 // Ensure that both direct and indirect deps are copied into apex
4653 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4654
Colin Cross7113d202019-11-20 16:39:12 -08004655 // Ensure that the platform variant ends with _shared
4656 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004657
Colin Cross56a83212020-09-15 18:30:11 -07004658 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004659 t.Log("Found mylib_common not in any apex!")
4660 t.Fail()
4661 }
4662}
4663
4664func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004665 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004666 apex_test {
4667 name: "myapex",
4668 key: "myapex.key",
4669 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004670 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004671 }
4672
4673 apex_key {
4674 name: "myapex.key",
4675 public_key: "testkey.avbpubkey",
4676 private_key: "testkey.pem",
4677 }
4678
4679 cc_library {
4680 name: "mylib_common_test",
4681 srcs: ["mylib.cpp"],
4682 system_shared_libs: [],
4683 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004684 // TODO: remove //apex_available:platform
4685 apex_available: [
4686 "//apex_available:platform",
4687 "myapex",
4688 ],
Alex Light0851b882019-02-07 13:20:53 -08004689 }
4690 `)
4691
Jooyung Hana0503a52023-08-23 13:12:50 +09004692 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004693 apexRule := module.Rule("apexRule")
4694 copyCmds := apexRule.Args["copy_commands"]
4695
4696 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4697 t.Log("Apex was not a test apex!")
4698 t.Fail()
4699 }
4700 // Ensure that main rule creates an output
4701 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4702
4703 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004704 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004705
4706 // Ensure that both direct and indirect deps are copied into apex
4707 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4708
Colin Cross7113d202019-11-20 16:39:12 -08004709 // Ensure that the platform variant ends with _shared
4710 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004711}
4712
Alex Light9670d332019-01-29 18:07:33 -08004713func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004714 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004718 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004719 multilib: {
4720 first: {
4721 native_shared_libs: ["mylib_common"],
4722 }
4723 },
4724 target: {
4725 android: {
4726 multilib: {
4727 first: {
4728 native_shared_libs: ["mylib"],
4729 }
4730 }
4731 },
4732 host: {
4733 multilib: {
4734 first: {
4735 native_shared_libs: ["mylib2"],
4736 }
4737 }
4738 }
4739 }
4740 }
4741
4742 apex_key {
4743 name: "myapex.key",
4744 public_key: "testkey.avbpubkey",
4745 private_key: "testkey.pem",
4746 }
4747
4748 cc_library {
4749 name: "mylib",
4750 srcs: ["mylib.cpp"],
4751 system_shared_libs: [],
4752 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004753 // TODO: remove //apex_available:platform
4754 apex_available: [
4755 "//apex_available:platform",
4756 "myapex",
4757 ],
Alex Light9670d332019-01-29 18:07:33 -08004758 }
4759
4760 cc_library {
4761 name: "mylib_common",
4762 srcs: ["mylib.cpp"],
4763 system_shared_libs: [],
4764 stl: "none",
4765 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004766 // TODO: remove //apex_available:platform
4767 apex_available: [
4768 "//apex_available:platform",
4769 "myapex",
4770 ],
Alex Light9670d332019-01-29 18:07:33 -08004771 }
4772
4773 cc_library {
4774 name: "mylib2",
4775 srcs: ["mylib.cpp"],
4776 system_shared_libs: [],
4777 stl: "none",
4778 compile_multilib: "first",
4779 }
4780 `)
4781
Jooyung Hana0503a52023-08-23 13:12:50 +09004782 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004783 copyCmds := apexRule.Args["copy_commands"]
4784
4785 // Ensure that main rule creates an output
4786 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4787
4788 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004789 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4790 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4791 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004792
4793 // Ensure that both direct and indirect deps are copied into apex
4794 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4795 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4796 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4797
Colin Cross7113d202019-11-20 16:39:12 -08004798 // Ensure that the platform variant ends with _shared
4799 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4800 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4801 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004802}
Jiyong Park04480cf2019-02-06 00:16:29 +09004803
Jiyong Park59140302020-12-14 18:44:04 +09004804func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004805 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004809 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004810 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004811 arch: {
4812 arm64: {
4813 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004814 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004815 },
4816 x86_64: {
4817 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004818 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004819 },
4820 }
4821 }
4822
4823 apex_key {
4824 name: "myapex.key",
4825 public_key: "testkey.avbpubkey",
4826 private_key: "testkey.pem",
4827 }
4828
4829 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004830 name: "mylib.generic",
4831 srcs: ["mylib.cpp"],
4832 system_shared_libs: [],
4833 stl: "none",
4834 // TODO: remove //apex_available:platform
4835 apex_available: [
4836 "//apex_available:platform",
4837 "myapex",
4838 ],
4839 }
4840
4841 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004842 name: "mylib.arm64",
4843 srcs: ["mylib.cpp"],
4844 system_shared_libs: [],
4845 stl: "none",
4846 // TODO: remove //apex_available:platform
4847 apex_available: [
4848 "//apex_available:platform",
4849 "myapex",
4850 ],
4851 }
4852
4853 cc_library {
4854 name: "mylib.x64",
4855 srcs: ["mylib.cpp"],
4856 system_shared_libs: [],
4857 stl: "none",
4858 // TODO: remove //apex_available:platform
4859 apex_available: [
4860 "//apex_available:platform",
4861 "myapex",
4862 ],
4863 }
4864 `)
4865
Jooyung Hana0503a52023-08-23 13:12:50 +09004866 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004867 copyCmds := apexRule.Args["copy_commands"]
4868
4869 // Ensure that apex variant is created for the direct dep
4870 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004871 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004872 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4873
4874 // Ensure that both direct and indirect deps are copied into apex
4875 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4876 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4877}
4878
Jiyong Park04480cf2019-02-06 00:16:29 +09004879func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004880 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004881 apex {
4882 name: "myapex",
4883 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004884 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004885 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004886 }
4887
4888 apex_key {
4889 name: "myapex.key",
4890 public_key: "testkey.avbpubkey",
4891 private_key: "testkey.pem",
4892 }
4893
4894 sh_binary {
4895 name: "myscript",
4896 src: "mylib.cpp",
4897 filename: "myscript.sh",
4898 sub_dir: "script",
4899 }
4900 `)
4901
Jooyung Hana0503a52023-08-23 13:12:50 +09004902 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004903 copyCmds := apexRule.Args["copy_commands"]
4904
4905 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4906}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004907
Jooyung Han91df2082019-11-20 01:49:42 +09004908func TestApexInVariousPartition(t *testing.T) {
4909 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004910 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004911 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004912 {"", "system"},
4913 {"product_specific: true", "product"},
4914 {"soc_specific: true", "vendor"},
4915 {"proprietary: true", "vendor"},
4916 {"vendor: true", "vendor"},
4917 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004918 }
4919 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004920 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004921 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004922 apex {
4923 name: "myapex",
4924 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004925 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004926 `+tc.propName+`
4927 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004928
Jooyung Han91df2082019-11-20 01:49:42 +09004929 apex_key {
4930 name: "myapex.key",
4931 public_key: "testkey.avbpubkey",
4932 private_key: "testkey.pem",
4933 }
4934 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004935
Jooyung Hana0503a52023-08-23 13:12:50 +09004936 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004937 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004938 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004939 if actual != expected {
4940 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4941 }
Jooyung Han91df2082019-11-20 01:49:42 +09004942 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004943 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004944}
Jiyong Park67882562019-03-21 01:11:21 +09004945
Jooyung Han580eb4f2020-06-24 19:33:06 +09004946func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004947 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004948 apex {
4949 name: "myapex",
4950 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004951 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004952 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004953
Jooyung Han580eb4f2020-06-24 19:33:06 +09004954 apex_key {
4955 name: "myapex.key",
4956 public_key: "testkey.avbpubkey",
4957 private_key: "testkey.pem",
4958 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004959 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004960 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004961 rule := module.Output("file_contexts")
4962 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4963}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004964
Jooyung Han580eb4f2020-06-24 19:33:06 +09004965func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004966 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004967 apex {
4968 name: "myapex",
4969 key: "myapex.key",
4970 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004971 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004972 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004973
Jooyung Han580eb4f2020-06-24 19:33:06 +09004974 apex_key {
4975 name: "myapex.key",
4976 public_key: "testkey.avbpubkey",
4977 private_key: "testkey.pem",
4978 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004979 `, withFiles(map[string][]byte{
4980 "my_own_file_contexts": nil,
4981 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004982}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004983
Jooyung Han580eb4f2020-06-24 19:33:06 +09004984func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004985 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004986 apex {
4987 name: "myapex",
4988 key: "myapex.key",
4989 product_specific: true,
4990 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004991 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004993
Jooyung Han580eb4f2020-06-24 19:33:06 +09004994 apex_key {
4995 name: "myapex.key",
4996 public_key: "testkey.avbpubkey",
4997 private_key: "testkey.pem",
4998 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004999 `)
5000
Colin Cross1c460562021-02-16 17:55:47 -08005001 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005002 apex {
5003 name: "myapex",
5004 key: "myapex.key",
5005 product_specific: true,
5006 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005007 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005008 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005009
Jooyung Han580eb4f2020-06-24 19:33:06 +09005010 apex_key {
5011 name: "myapex.key",
5012 public_key: "testkey.avbpubkey",
5013 private_key: "testkey.pem",
5014 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005015 `, withFiles(map[string][]byte{
5016 "product_specific_file_contexts": nil,
5017 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005018 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005019 rule := module.Output("file_contexts")
5020 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5021}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005024 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005025 apex {
5026 name: "myapex",
5027 key: "myapex.key",
5028 product_specific: true,
5029 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005030 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005032
Jooyung Han580eb4f2020-06-24 19:33:06 +09005033 apex_key {
5034 name: "myapex.key",
5035 public_key: "testkey.avbpubkey",
5036 private_key: "testkey.pem",
5037 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005038
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 filegroup {
5040 name: "my-file-contexts",
5041 srcs: ["product_specific_file_contexts"],
5042 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005043 `, withFiles(map[string][]byte{
5044 "product_specific_file_contexts": nil,
5045 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005046 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 rule := module.Output("file_contexts")
5048 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005049}
5050
Jiyong Park67882562019-03-21 01:11:21 +09005051func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005052 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005053 apex_key {
5054 name: "myapex.key",
5055 public_key: ":my.avbpubkey",
5056 private_key: ":my.pem",
5057 product_specific: true,
5058 }
5059
5060 filegroup {
5061 name: "my.avbpubkey",
5062 srcs: ["testkey2.avbpubkey"],
5063 }
5064
5065 filegroup {
5066 name: "my.pem",
5067 srcs: ["testkey2.pem"],
5068 }
5069 `)
5070
5071 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5072 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005073 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005074 if actual_pubkey != expected_pubkey {
5075 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5076 }
5077 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005078 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005079 if actual_privkey != expected_privkey {
5080 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5081 }
5082}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005083
5084func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005085 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005086 prebuilt_apex {
5087 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005088 arch: {
5089 arm64: {
5090 src: "myapex-arm64.apex",
5091 },
5092 arm: {
5093 src: "myapex-arm.apex",
5094 },
5095 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005096 }
5097 `)
5098
Wei Li340ee8e2022-03-18 17:33:24 -07005099 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5100 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005101
Jiyong Parkc95714e2019-03-29 14:23:10 +09005102 expectedInput := "myapex-arm64.apex"
5103 if prebuilt.inputApex.String() != expectedInput {
5104 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5105 }
Wei Li340ee8e2022-03-18 17:33:24 -07005106 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5107 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5108 rule := testingModule.Rule("genProvenanceMetaData")
5109 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5110 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5111 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5112 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005113
5114 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5115 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005116}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005117
Paul Duffinc0609c62021-03-01 17:27:16 +00005118func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005119 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005120 prebuilt_apex {
5121 name: "myapex",
5122 }
5123 `)
5124}
5125
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005126func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005127 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005128 prebuilt_apex {
5129 name: "myapex",
5130 src: "myapex-arm.apex",
5131 filename: "notmyapex.apex",
5132 }
5133 `)
5134
Wei Li340ee8e2022-03-18 17:33:24 -07005135 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5136 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005137
5138 expected := "notmyapex.apex"
5139 if p.installFilename != expected {
5140 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5141 }
Wei Li340ee8e2022-03-18 17:33:24 -07005142 rule := testingModule.Rule("genProvenanceMetaData")
5143 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5144 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5145 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5146 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005147}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005148
Samiul Islam7c02e262021-09-08 17:48:28 +01005149func TestApexSetFilenameOverride(t *testing.T) {
5150 testApex(t, `
5151 apex_set {
5152 name: "com.company.android.myapex",
5153 apex_name: "com.android.myapex",
5154 set: "company-myapex.apks",
5155 filename: "com.company.android.myapex.apex"
5156 }
5157 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5158
5159 testApex(t, `
5160 apex_set {
5161 name: "com.company.android.myapex",
5162 apex_name: "com.android.myapex",
5163 set: "company-myapex.apks",
5164 filename: "com.company.android.myapex.capex"
5165 }
5166 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5167
5168 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5169 apex_set {
5170 name: "com.company.android.myapex",
5171 apex_name: "com.android.myapex",
5172 set: "company-myapex.apks",
5173 filename: "some-random-suffix"
5174 }
5175 `)
5176}
5177
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005178func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005179 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005180 prebuilt_apex {
5181 name: "myapex.prebuilt",
5182 src: "myapex-arm.apex",
5183 overrides: [
5184 "myapex",
5185 ],
5186 }
5187 `)
5188
Wei Li340ee8e2022-03-18 17:33:24 -07005189 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5190 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005191
5192 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005193 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005194 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005195 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005196 }
Wei Li340ee8e2022-03-18 17:33:24 -07005197 rule := testingModule.Rule("genProvenanceMetaData")
5198 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5199 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5200 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5201 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005202}
5203
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005204func TestPrebuiltApexName(t *testing.T) {
5205 testApex(t, `
5206 prebuilt_apex {
5207 name: "com.company.android.myapex",
5208 apex_name: "com.android.myapex",
5209 src: "company-myapex-arm.apex",
5210 }
5211 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5212
5213 testApex(t, `
5214 apex_set {
5215 name: "com.company.android.myapex",
5216 apex_name: "com.android.myapex",
5217 set: "company-myapex.apks",
5218 }
5219 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5220}
5221
5222func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5223 _ = android.GroupFixturePreparers(
5224 java.PrepareForTestWithJavaDefaultModules,
5225 PrepareForTestWithApexBuildComponents,
5226 android.FixtureWithRootAndroidBp(`
5227 platform_bootclasspath {
5228 name: "platform-bootclasspath",
5229 fragments: [
5230 {
5231 apex: "com.android.art",
5232 module: "art-bootclasspath-fragment",
5233 },
5234 ],
5235 }
5236
5237 prebuilt_apex {
5238 name: "com.company.android.art",
5239 apex_name: "com.android.art",
5240 src: "com.company.android.art-arm.apex",
5241 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5242 }
5243
5244 prebuilt_bootclasspath_fragment {
5245 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005246 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005247 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005248 hidden_api: {
5249 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5250 metadata: "my-bootclasspath-fragment/metadata.csv",
5251 index: "my-bootclasspath-fragment/index.csv",
5252 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5253 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5254 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005255 }
5256
5257 java_import {
5258 name: "core-oj",
5259 jars: ["prebuilt.jar"],
5260 }
5261 `),
5262 ).RunTest(t)
5263}
5264
Paul Duffin092153d2021-01-26 11:42:39 +00005265// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5266// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005267func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005268 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005269
Paul Duffin89886cb2021-02-05 16:44:03 +00005270 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005271 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005272 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005273 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005274 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005275 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005276 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5277 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5278 android.NormalizePathForTesting(dexJarBuildPath))
5279 }
5280
5281 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005282 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005283 // Make sure the import has been given the correct path to the dex jar.
5284 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5285 dexJarBuildPath := p.DexJarInstallPath()
5286 stem := android.RemoveOptionalPrebuiltPrefix(name)
5287 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5288 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5289 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005290 }
5291
Paul Duffin39853512021-02-26 11:09:39 +00005292 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005293 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005294 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005295 android.AssertArrayString(t, "Check if there is no source variant",
5296 []string{"android_common"},
5297 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005298 }
5299
5300 t.Run("prebuilt only", func(t *testing.T) {
5301 bp := `
5302 prebuilt_apex {
5303 name: "myapex",
5304 arch: {
5305 arm64: {
5306 src: "myapex-arm64.apex",
5307 },
5308 arm: {
5309 src: "myapex-arm.apex",
5310 },
5311 },
Paul Duffin39853512021-02-26 11:09:39 +00005312 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005313 }
5314
5315 java_import {
5316 name: "libfoo",
5317 jars: ["libfoo.jar"],
5318 }
Paul Duffin39853512021-02-26 11:09:39 +00005319
5320 java_sdk_library_import {
5321 name: "libbar",
5322 public: {
5323 jars: ["libbar.jar"],
5324 },
5325 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005326 `
5327
5328 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5329 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5330
Martin Stjernholm44825602021-09-17 01:44:12 +01005331 deapexerName := deapexerModuleName("myapex")
5332 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5333
Paul Duffinf6932af2021-02-26 18:21:56 +00005334 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005335 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005336 rule := deapexer.Rule("deapexer")
5337 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5338 t.Errorf("expected: %q, found: %q", expected, actual)
5339 }
5340
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005341 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005342 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005343 rule = prebuiltApex.Rule("android/soong/android.Cp")
5344 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5345 t.Errorf("expected: %q, found: %q", expected, actual)
5346 }
5347
Paul Duffin89886cb2021-02-05 16:44:03 +00005348 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005349 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005350
5351 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005352 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005353 })
5354
5355 t.Run("prebuilt with source preferred", func(t *testing.T) {
5356
5357 bp := `
5358 prebuilt_apex {
5359 name: "myapex",
5360 arch: {
5361 arm64: {
5362 src: "myapex-arm64.apex",
5363 },
5364 arm: {
5365 src: "myapex-arm.apex",
5366 },
5367 },
Paul Duffin39853512021-02-26 11:09:39 +00005368 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005369 }
5370
5371 java_import {
5372 name: "libfoo",
5373 jars: ["libfoo.jar"],
5374 }
5375
5376 java_library {
5377 name: "libfoo",
5378 }
Paul Duffin39853512021-02-26 11:09:39 +00005379
5380 java_sdk_library_import {
5381 name: "libbar",
5382 public: {
5383 jars: ["libbar.jar"],
5384 },
5385 }
5386
5387 java_sdk_library {
5388 name: "libbar",
5389 srcs: ["foo/bar/MyClass.java"],
5390 unsafe_ignore_missing_latest_api: true,
5391 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005392 `
5393
5394 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5395 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5396
Paul Duffin89886cb2021-02-05 16:44:03 +00005397 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005398 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005399 ensureNoSourceVariant(t, ctx, "libfoo")
5400
5401 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005402 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005403 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005404 })
5405
5406 t.Run("prebuilt preferred with source", func(t *testing.T) {
5407 bp := `
5408 prebuilt_apex {
5409 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005410 arch: {
5411 arm64: {
5412 src: "myapex-arm64.apex",
5413 },
5414 arm: {
5415 src: "myapex-arm.apex",
5416 },
5417 },
Paul Duffin39853512021-02-26 11:09:39 +00005418 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005419 }
5420
5421 java_import {
5422 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005423 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005424 jars: ["libfoo.jar"],
5425 }
5426
5427 java_library {
5428 name: "libfoo",
5429 }
Paul Duffin39853512021-02-26 11:09:39 +00005430
5431 java_sdk_library_import {
5432 name: "libbar",
5433 prefer: true,
5434 public: {
5435 jars: ["libbar.jar"],
5436 },
5437 }
5438
5439 java_sdk_library {
5440 name: "libbar",
5441 srcs: ["foo/bar/MyClass.java"],
5442 unsafe_ignore_missing_latest_api: true,
5443 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005444 `
5445
5446 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5447 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5448
Paul Duffin89886cb2021-02-05 16:44:03 +00005449 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005450 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005451 ensureNoSourceVariant(t, ctx, "libfoo")
5452
5453 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005454 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005455 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005456 })
5457}
5458
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005460 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005461 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005462 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5463 // is disabled.
5464 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5465 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005466
Paul Duffin37856732021-02-26 14:24:15 +00005467 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5468 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005469 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005470 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005471 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005472 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005473 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005474 foundLibfooJar = true
5475 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005476 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005477 }
5478 }
5479 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005480 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 +00005481 }
5482 }
5483
Paul Duffin40a3f652021-07-19 13:11:24 +01005484 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005485 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005486 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005487 var rule android.TestingBuildParams
5488
5489 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5490 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005491 }
5492
Paul Duffin40a3f652021-07-19 13:11:24 +01005493 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5494 t.Helper()
5495 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5496 var rule android.TestingBuildParams
5497
5498 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5499 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5500 }
5501
Paul Duffin89f570a2021-06-16 01:42:33 +01005502 fragment := java.ApexVariantReference{
5503 Apex: proptools.StringPtr("myapex"),
5504 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5505 }
5506
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005507 t.Run("prebuilt only", func(t *testing.T) {
5508 bp := `
5509 prebuilt_apex {
5510 name: "myapex",
5511 arch: {
5512 arm64: {
5513 src: "myapex-arm64.apex",
5514 },
5515 arm: {
5516 src: "myapex-arm.apex",
5517 },
5518 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005519 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5520 }
5521
5522 prebuilt_bootclasspath_fragment {
5523 name: "my-bootclasspath-fragment",
5524 contents: ["libfoo", "libbar"],
5525 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005526 hidden_api: {
5527 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5528 metadata: "my-bootclasspath-fragment/metadata.csv",
5529 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005530 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5531 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5532 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005533 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005534 }
5535
5536 java_import {
5537 name: "libfoo",
5538 jars: ["libfoo.jar"],
5539 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005540 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005541 }
Paul Duffin37856732021-02-26 14:24:15 +00005542
5543 java_sdk_library_import {
5544 name: "libbar",
5545 public: {
5546 jars: ["libbar.jar"],
5547 },
5548 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005549 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005550 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005551 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 `
5553
Paul Duffin89f570a2021-06-16 01:42:33 +01005554 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005555 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5556 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005557
Paul Duffin537ea3d2021-05-14 10:38:00 +01005558 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005559 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005560 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005561 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005562 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005563 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 +01005564 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005565 })
5566
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005567 t.Run("apex_set only", func(t *testing.T) {
5568 bp := `
5569 apex_set {
5570 name: "myapex",
5571 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005572 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005573 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005574 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5575 }
5576
5577 java_import {
5578 name: "myjavalib",
5579 jars: ["myjavalib.jar"],
5580 apex_available: ["myapex"],
5581 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005582 }
5583
5584 prebuilt_bootclasspath_fragment {
5585 name: "my-bootclasspath-fragment",
5586 contents: ["libfoo", "libbar"],
5587 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005588 hidden_api: {
5589 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5590 metadata: "my-bootclasspath-fragment/metadata.csv",
5591 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005592 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5593 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5594 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005595 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005596 }
5597
Liz Kammer2dc72442023-04-20 10:10:48 -04005598 prebuilt_systemserverclasspath_fragment {
5599 name: "my-systemserverclasspath-fragment",
5600 contents: ["libbaz"],
5601 apex_available: ["myapex"],
5602 }
5603
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005604 java_import {
5605 name: "libfoo",
5606 jars: ["libfoo.jar"],
5607 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005608 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005609 }
5610
5611 java_sdk_library_import {
5612 name: "libbar",
5613 public: {
5614 jars: ["libbar.jar"],
5615 },
5616 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005617 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005618 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005619 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005620
5621 java_sdk_library_import {
5622 name: "libbaz",
5623 public: {
5624 jars: ["libbaz.jar"],
5625 },
5626 apex_available: ["myapex"],
5627 shared_library: false,
5628 permitted_packages: ["baz"],
5629 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005630 `
5631
Paul Duffin89f570a2021-06-16 01:42:33 +01005632 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005633 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5634 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5635
Paul Duffin537ea3d2021-05-14 10:38:00 +01005636 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005637 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005638 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005639 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005640 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005641 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 +01005642 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005643
5644 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5645
5646 overrideNames := []string{
5647 "",
5648 "myjavalib.myapex",
5649 "libfoo.myapex",
5650 "libbar.myapex",
5651 "libbaz.myapex",
5652 }
5653 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5654 for i, e := range mkEntries {
5655 g := e.OverrideName
5656 if w := overrideNames[i]; w != g {
5657 t.Errorf("Expected override name %q, got %q", w, g)
5658 }
5659 }
5660
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005661 })
5662
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005663 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5664 bp := `
5665 prebuilt_apex {
5666 name: "myapex",
5667 arch: {
5668 arm64: {
5669 src: "myapex-arm64.apex",
5670 },
5671 arm: {
5672 src: "myapex-arm.apex",
5673 },
5674 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005675 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5676 }
5677
5678 prebuilt_bootclasspath_fragment {
5679 name: "my-bootclasspath-fragment",
5680 contents: ["libfoo", "libbar"],
5681 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005682 hidden_api: {
5683 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5684 metadata: "my-bootclasspath-fragment/metadata.csv",
5685 index: "my-bootclasspath-fragment/index.csv",
5686 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5687 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5688 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005689 }
5690
5691 java_import {
5692 name: "libfoo",
5693 jars: ["libfoo.jar"],
5694 apex_available: ["myapex"],
5695 }
5696
5697 java_library {
5698 name: "libfoo",
5699 srcs: ["foo/bar/MyClass.java"],
5700 apex_available: ["myapex"],
5701 }
Paul Duffin37856732021-02-26 14:24:15 +00005702
5703 java_sdk_library_import {
5704 name: "libbar",
5705 public: {
5706 jars: ["libbar.jar"],
5707 },
5708 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005709 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005710 }
5711
5712 java_sdk_library {
5713 name: "libbar",
5714 srcs: ["foo/bar/MyClass.java"],
5715 unsafe_ignore_missing_latest_api: true,
5716 apex_available: ["myapex"],
5717 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005718 `
5719
5720 // In this test the source (java_library) libfoo is active since the
5721 // prebuilt (java_import) defaults to prefer:false. However the
5722 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5723 // find the dex boot jar in it. We either need to disable the source libfoo
5724 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005725 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005726 // dexbootjar check is skipped if AllowMissingDependencies is true
5727 preparerAllowMissingDeps := android.GroupFixturePreparers(
5728 preparer,
5729 android.PrepareForTestWithAllowMissingDependencies,
5730 )
5731 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005732 })
5733
5734 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5735 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005736 apex {
5737 name: "myapex",
5738 key: "myapex.key",
5739 updatable: false,
5740 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5741 }
5742
5743 apex_key {
5744 name: "myapex.key",
5745 public_key: "testkey.avbpubkey",
5746 private_key: "testkey.pem",
5747 }
5748
5749 bootclasspath_fragment {
5750 name: "my-bootclasspath-fragment",
5751 contents: ["libfoo", "libbar"],
5752 apex_available: ["myapex"],
5753 hidden_api: {
5754 split_packages: ["*"],
5755 },
5756 }
5757
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005758 prebuilt_apex {
5759 name: "myapex",
5760 arch: {
5761 arm64: {
5762 src: "myapex-arm64.apex",
5763 },
5764 arm: {
5765 src: "myapex-arm.apex",
5766 },
5767 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005768 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5769 }
5770
5771 prebuilt_bootclasspath_fragment {
5772 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005773 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005774 contents: ["libfoo", "libbar"],
5775 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005776 hidden_api: {
5777 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5778 metadata: "my-bootclasspath-fragment/metadata.csv",
5779 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005780 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5781 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5782 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005783 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005784 }
5785
5786 java_import {
5787 name: "libfoo",
5788 prefer: true,
5789 jars: ["libfoo.jar"],
5790 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005791 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005792 }
5793
5794 java_library {
5795 name: "libfoo",
5796 srcs: ["foo/bar/MyClass.java"],
5797 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005798 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005799 }
Paul Duffin37856732021-02-26 14:24:15 +00005800
5801 java_sdk_library_import {
5802 name: "libbar",
5803 prefer: true,
5804 public: {
5805 jars: ["libbar.jar"],
5806 },
5807 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005808 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005809 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005810 }
5811
5812 java_sdk_library {
5813 name: "libbar",
5814 srcs: ["foo/bar/MyClass.java"],
5815 unsafe_ignore_missing_latest_api: true,
5816 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005817 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005818 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005819 `
5820
Paul Duffin89f570a2021-06-16 01:42:33 +01005821 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005822 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5823 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005824
Paul Duffin537ea3d2021-05-14 10:38:00 +01005825 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005826 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005827 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005828 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005829 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005830 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 +01005831 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005832 })
5833
5834 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5835 bp := `
5836 apex {
5837 name: "myapex",
5838 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005839 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005840 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005841 }
5842
5843 apex_key {
5844 name: "myapex.key",
5845 public_key: "testkey.avbpubkey",
5846 private_key: "testkey.pem",
5847 }
5848
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005849 bootclasspath_fragment {
5850 name: "my-bootclasspath-fragment",
5851 contents: ["libfoo", "libbar"],
5852 apex_available: ["myapex"],
5853 hidden_api: {
5854 split_packages: ["*"],
5855 },
5856 }
5857
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005858 prebuilt_apex {
5859 name: "myapex",
5860 arch: {
5861 arm64: {
5862 src: "myapex-arm64.apex",
5863 },
5864 arm: {
5865 src: "myapex-arm.apex",
5866 },
5867 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005868 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5869 }
5870
5871 prebuilt_bootclasspath_fragment {
5872 name: "my-bootclasspath-fragment",
5873 contents: ["libfoo", "libbar"],
5874 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005875 hidden_api: {
5876 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5877 metadata: "my-bootclasspath-fragment/metadata.csv",
5878 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005879 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5880 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5881 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005882 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005883 }
5884
5885 java_import {
5886 name: "libfoo",
5887 jars: ["libfoo.jar"],
5888 apex_available: ["myapex"],
5889 }
5890
5891 java_library {
5892 name: "libfoo",
5893 srcs: ["foo/bar/MyClass.java"],
5894 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005895 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005896 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005897 }
Paul Duffin37856732021-02-26 14:24:15 +00005898
5899 java_sdk_library_import {
5900 name: "libbar",
5901 public: {
5902 jars: ["libbar.jar"],
5903 },
5904 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005905 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005906 }
5907
5908 java_sdk_library {
5909 name: "libbar",
5910 srcs: ["foo/bar/MyClass.java"],
5911 unsafe_ignore_missing_latest_api: true,
5912 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005913 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005914 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005915 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005916 `
5917
Paul Duffin89f570a2021-06-16 01:42:33 +01005918 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005919 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5920 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 +00005921
Paul Duffin537ea3d2021-05-14 10:38:00 +01005922 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005923 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005924 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5925 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005926 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5927 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 +01005928 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005929 })
5930
5931 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5932 bp := `
5933 apex {
5934 name: "myapex",
5935 enabled: false,
5936 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005937 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005938 }
5939
5940 apex_key {
5941 name: "myapex.key",
5942 public_key: "testkey.avbpubkey",
5943 private_key: "testkey.pem",
5944 }
5945
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005946 bootclasspath_fragment {
5947 name: "my-bootclasspath-fragment",
5948 enabled: false,
5949 contents: ["libfoo", "libbar"],
5950 apex_available: ["myapex"],
5951 hidden_api: {
5952 split_packages: ["*"],
5953 },
5954 }
5955
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005956 prebuilt_apex {
5957 name: "myapex",
5958 arch: {
5959 arm64: {
5960 src: "myapex-arm64.apex",
5961 },
5962 arm: {
5963 src: "myapex-arm.apex",
5964 },
5965 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005966 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5967 }
5968
5969 prebuilt_bootclasspath_fragment {
5970 name: "my-bootclasspath-fragment",
5971 contents: ["libfoo", "libbar"],
5972 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005973 hidden_api: {
5974 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5975 metadata: "my-bootclasspath-fragment/metadata.csv",
5976 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005977 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5978 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5979 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005980 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005981 }
5982
5983 java_import {
5984 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005985 jars: ["libfoo.jar"],
5986 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005987 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005988 }
5989
5990 java_library {
5991 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005992 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005993 srcs: ["foo/bar/MyClass.java"],
5994 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005995 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005996 }
Paul Duffin37856732021-02-26 14:24:15 +00005997
5998 java_sdk_library_import {
5999 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006000 public: {
6001 jars: ["libbar.jar"],
6002 },
6003 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006004 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006005 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006006 }
6007
6008 java_sdk_library {
6009 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006010 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006011 srcs: ["foo/bar/MyClass.java"],
6012 unsafe_ignore_missing_latest_api: true,
6013 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006014 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006015 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006016 `
6017
Paul Duffin89f570a2021-06-16 01:42:33 +01006018 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006019 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6020 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006021
Paul Duffin537ea3d2021-05-14 10:38:00 +01006022 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006023 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006024 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006025 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006026 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006027 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 +01006028 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006029 })
6030}
6031
Roland Levillain630846d2019-06-26 12:48:34 +01006032func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006033 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006034 apex_test {
6035 name: "myapex",
6036 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006037 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006038 tests: [
6039 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006040 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006041 ],
6042 }
6043
6044 apex_key {
6045 name: "myapex.key",
6046 public_key: "testkey.avbpubkey",
6047 private_key: "testkey.pem",
6048 }
6049
Liz Kammer1c14a212020-05-12 15:26:55 -07006050 filegroup {
6051 name: "fg",
6052 srcs: [
6053 "baz",
6054 "bar/baz"
6055 ],
6056 }
6057
Roland Levillain630846d2019-06-26 12:48:34 +01006058 cc_test {
6059 name: "mytest",
6060 gtest: false,
6061 srcs: ["mytest.cpp"],
6062 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006063 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006064 system_shared_libs: [],
6065 static_executable: true,
6066 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006067 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006068 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006069
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006070 cc_library {
6071 name: "mylib",
6072 srcs: ["mylib.cpp"],
6073 system_shared_libs: [],
6074 stl: "none",
6075 }
6076
Liz Kammer5bd365f2020-05-27 15:15:11 -07006077 filegroup {
6078 name: "fg2",
6079 srcs: [
6080 "testdata/baz"
6081 ],
6082 }
6083
Roland Levillain9b5fde92019-06-28 15:41:19 +01006084 cc_test {
6085 name: "mytests",
6086 gtest: false,
6087 srcs: [
6088 "mytest1.cpp",
6089 "mytest2.cpp",
6090 "mytest3.cpp",
6091 ],
6092 test_per_src: true,
6093 relative_install_path: "test",
6094 system_shared_libs: [],
6095 static_executable: true,
6096 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006097 data: [
6098 ":fg",
6099 ":fg2",
6100 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006101 }
Roland Levillain630846d2019-06-26 12:48:34 +01006102 `)
6103
Jooyung Hana0503a52023-08-23 13:12:50 +09006104 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006105 copyCmds := apexRule.Args["copy_commands"]
6106
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006107 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006108 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006109 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006110
Liz Kammer1c14a212020-05-12 15:26:55 -07006111 //Ensure that test data are copied into apex.
6112 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6113 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6114
Roland Levillain9b5fde92019-06-28 15:41:19 +01006115 // Ensure that test deps built with `test_per_src` are copied into apex.
6116 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6117 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6118 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006119
6120 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006121 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006122 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006123 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006124 prefix := "TARGET_"
6125 var builder strings.Builder
6126 data.Custom(&builder, name, prefix, "", data)
6127 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006128 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6129 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6130 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6131 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006132 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006133}
6134
Jooyung Hand48f3c32019-08-23 11:18:57 +09006135func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6136 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6137 apex {
6138 name: "myapex",
6139 key: "myapex.key",
6140 native_shared_libs: ["libfoo"],
6141 }
6142
6143 apex_key {
6144 name: "myapex.key",
6145 public_key: "testkey.avbpubkey",
6146 private_key: "testkey.pem",
6147 }
6148
6149 cc_library {
6150 name: "libfoo",
6151 stl: "none",
6152 system_shared_libs: [],
6153 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006154 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006155 }
6156 `)
6157 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6158 apex {
6159 name: "myapex",
6160 key: "myapex.key",
6161 java_libs: ["myjar"],
6162 }
6163
6164 apex_key {
6165 name: "myapex.key",
6166 public_key: "testkey.avbpubkey",
6167 private_key: "testkey.pem",
6168 }
6169
6170 java_library {
6171 name: "myjar",
6172 srcs: ["foo/bar/MyClass.java"],
6173 sdk_version: "none",
6174 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006175 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006176 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006177 }
6178 `)
6179}
6180
Bill Peckhama41a6962021-01-11 10:58:54 -08006181func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006182 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006183 apex {
6184 name: "myapex",
6185 key: "myapex.key",
6186 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006187 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006188 }
6189
6190 apex_key {
6191 name: "myapex.key",
6192 public_key: "testkey.avbpubkey",
6193 private_key: "testkey.pem",
6194 }
6195
6196 java_import {
6197 name: "myjavaimport",
6198 apex_available: ["myapex"],
6199 jars: ["my.jar"],
6200 compile_dex: true,
6201 }
6202 `)
6203
Jooyung Hana0503a52023-08-23 13:12:50 +09006204 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006205 apexRule := module.Rule("apexRule")
6206 copyCmds := apexRule.Args["copy_commands"]
6207 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6208}
6209
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006210func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006211 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006212 apex {
6213 name: "myapex",
6214 key: "myapex.key",
6215 apps: [
6216 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006217 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006218 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006219 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006220 }
6221
6222 apex_key {
6223 name: "myapex.key",
6224 public_key: "testkey.avbpubkey",
6225 private_key: "testkey.pem",
6226 }
6227
6228 android_app {
6229 name: "AppFoo",
6230 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006231 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006232 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006233 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006235 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006236 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006237
6238 android_app {
6239 name: "AppFooPriv",
6240 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006241 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006242 system_modules: "none",
6243 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006244 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006245 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006246 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006247 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006248
6249 cc_library_shared {
6250 name: "libjni",
6251 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006252 shared_libs: ["libfoo"],
6253 stl: "none",
6254 system_shared_libs: [],
6255 apex_available: [ "myapex" ],
6256 sdk_version: "current",
6257 }
6258
6259 cc_library_shared {
6260 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006261 stl: "none",
6262 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006263 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006264 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006265 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006266 `)
6267
Jooyung Hana0503a52023-08-23 13:12:50 +09006268 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006269 apexRule := module.Rule("apexRule")
6270 copyCmds := apexRule.Args["copy_commands"]
6271
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006272 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6273 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006274 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006275
Colin Crossaede88c2020-08-11 12:17:01 -07006276 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006277 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006278 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006279 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006280 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006281 // JNI libraries including transitive deps are
6282 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006283 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006284 // ... embedded inside APK (jnilibs.zip)
6285 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6286 // ... and not directly inside the APEX
6287 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6288 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006289
6290 apexBundle := module.Module().(*apexBundle)
6291 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6292 var builder strings.Builder
6293 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6294 androidMk := builder.String()
6295 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6296 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6297 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6298 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6299 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6300 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 +01006301}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006302
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006303func TestApexWithAppImportBuildId(t *testing.T) {
6304 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6305 for _, id := range invalidBuildIds {
6306 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6307 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6308 variables.BuildId = proptools.StringPtr(id)
6309 })
6310 testApexError(t, message, `apex {
6311 name: "myapex",
6312 key: "myapex.key",
6313 apps: ["AppFooPrebuilt"],
6314 updatable: false,
6315 }
6316
6317 apex_key {
6318 name: "myapex.key",
6319 public_key: "testkey.avbpubkey",
6320 private_key: "testkey.pem",
6321 }
6322
6323 android_app_import {
6324 name: "AppFooPrebuilt",
6325 apk: "PrebuiltAppFoo.apk",
6326 presigned: true,
6327 apex_available: ["myapex"],
6328 }
6329 `, fixture)
6330 }
6331}
6332
Dario Frenicde2a032019-10-27 00:29:22 +01006333func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006334 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006335 apex {
6336 name: "myapex",
6337 key: "myapex.key",
6338 apps: [
6339 "AppFooPrebuilt",
6340 "AppFooPrivPrebuilt",
6341 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006342 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006343 }
6344
6345 apex_key {
6346 name: "myapex.key",
6347 public_key: "testkey.avbpubkey",
6348 private_key: "testkey.pem",
6349 }
6350
6351 android_app_import {
6352 name: "AppFooPrebuilt",
6353 apk: "PrebuiltAppFoo.apk",
6354 presigned: true,
6355 dex_preopt: {
6356 enabled: false,
6357 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006358 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006359 }
6360
6361 android_app_import {
6362 name: "AppFooPrivPrebuilt",
6363 apk: "PrebuiltAppFooPriv.apk",
6364 privileged: true,
6365 presigned: true,
6366 dex_preopt: {
6367 enabled: false,
6368 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006369 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006370 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006371 }
6372 `)
6373
Jooyung Hana0503a52023-08-23 13:12:50 +09006374 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006375 apexRule := module.Rule("apexRule")
6376 copyCmds := apexRule.Args["copy_commands"]
6377
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006378 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6379 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006380}
6381
6382func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006383 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006384 apex {
6385 name: "myapex",
6386 key: "myapex.key",
6387 apps: [
6388 "AppFoo",
6389 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006390 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006391 }
6392
6393 apex_key {
6394 name: "myapex.key",
6395 public_key: "testkey.avbpubkey",
6396 private_key: "testkey.pem",
6397 }
6398
6399 android_app {
6400 name: "AppFoo",
6401 srcs: ["foo/bar/MyClass.java"],
6402 sdk_version: "none",
6403 system_modules: "none",
6404 apex_available: [ "myapex" ],
6405 }
6406
6407 android_app_import {
6408 name: "AppFoo",
6409 apk: "AppFooPrebuilt.apk",
6410 filename: "AppFooPrebuilt.apk",
6411 presigned: true,
6412 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006413 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006414 }
6415 `, withFiles(map[string][]byte{
6416 "AppFooPrebuilt.apk": nil,
6417 }))
6418
Jooyung Hana0503a52023-08-23 13:12:50 +09006419 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006420 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006421 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006422}
6423
Dario Freni6f3937c2019-12-20 22:58:03 +00006424func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006425 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006426 apex {
6427 name: "myapex",
6428 key: "myapex.key",
6429 apps: [
6430 "TesterHelpAppFoo",
6431 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006432 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006433 }
6434
6435 apex_key {
6436 name: "myapex.key",
6437 public_key: "testkey.avbpubkey",
6438 private_key: "testkey.pem",
6439 }
6440
6441 android_test_helper_app {
6442 name: "TesterHelpAppFoo",
6443 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006444 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006445 }
6446
6447 `)
6448
Jooyung Hana0503a52023-08-23 13:12:50 +09006449 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006450 apexRule := module.Rule("apexRule")
6451 copyCmds := apexRule.Args["copy_commands"]
6452
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006453 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006454}
6455
Jooyung Han18020ea2019-11-13 10:50:48 +09006456func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6457 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006458 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006459 apex {
6460 name: "myapex",
6461 key: "myapex.key",
6462 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006463 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006464 }
6465
6466 apex_key {
6467 name: "myapex.key",
6468 public_key: "testkey.avbpubkey",
6469 private_key: "testkey.pem",
6470 }
6471
6472 apex {
6473 name: "otherapex",
6474 key: "myapex.key",
6475 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006476 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006477 }
6478
6479 cc_defaults {
6480 name: "libfoo-defaults",
6481 apex_available: ["otherapex"],
6482 }
6483
6484 cc_library {
6485 name: "libfoo",
6486 defaults: ["libfoo-defaults"],
6487 stl: "none",
6488 system_shared_libs: [],
6489 }`)
6490}
6491
Paul Duffine52e66f2020-03-30 17:54:29 +01006492func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006493 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006494 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006495 apex {
6496 name: "myapex",
6497 key: "myapex.key",
6498 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006499 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006500 }
6501
6502 apex_key {
6503 name: "myapex.key",
6504 public_key: "testkey.avbpubkey",
6505 private_key: "testkey.pem",
6506 }
6507
6508 apex {
6509 name: "otherapex",
6510 key: "otherapex.key",
6511 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006512 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006513 }
6514
6515 apex_key {
6516 name: "otherapex.key",
6517 public_key: "testkey.avbpubkey",
6518 private_key: "testkey.pem",
6519 }
6520
6521 cc_library {
6522 name: "libfoo",
6523 stl: "none",
6524 system_shared_libs: [],
6525 apex_available: ["otherapex"],
6526 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006527}
Jiyong Park127b40b2019-09-30 16:04:35 +09006528
Paul Duffine52e66f2020-03-30 17:54:29 +01006529func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006530 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006531 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006532.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006533.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006534.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006535.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006536.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006537.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006538 apex {
6539 name: "myapex",
6540 key: "myapex.key",
6541 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006542 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006543 }
6544
6545 apex_key {
6546 name: "myapex.key",
6547 public_key: "testkey.avbpubkey",
6548 private_key: "testkey.pem",
6549 }
6550
Jiyong Park127b40b2019-09-30 16:04:35 +09006551 cc_library {
6552 name: "libfoo",
6553 stl: "none",
6554 shared_libs: ["libbar"],
6555 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006556 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006557 }
6558
6559 cc_library {
6560 name: "libbar",
6561 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006562 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006563 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006564 apex_available: ["myapex"],
6565 }
6566
6567 cc_library {
6568 name: "libbaz",
6569 stl: "none",
6570 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006571 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006572}
Jiyong Park127b40b2019-09-30 16:04:35 +09006573
Liz Kammer5f108fa2023-05-11 14:33:17 -04006574func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6575 testApex(t, `
6576 apex {
6577 name: "myapex",
6578 key: "myapex.key",
6579 native_shared_libs: ["libfoo"],
6580 updatable: false,
6581 }
6582
6583 apex_key {
6584 name: "myapex.key",
6585 public_key: "testkey.avbpubkey",
6586 private_key: "testkey.pem",
6587 }
6588
6589 cc_library {
6590 name: "libfoo",
6591 stl: "none",
6592 static_libs: ["libbar"],
6593 system_shared_libs: [],
6594 apex_available: ["myapex"],
6595 }
6596
6597 cc_library {
6598 name: "libbar",
6599 stl: "none",
6600 shared_libs: ["libbaz"],
6601 system_shared_libs: [],
6602 apex_available: ["myapex"],
6603 }
6604
6605 cc_library {
6606 name: "libbaz",
6607 stl: "none",
6608 system_shared_libs: [],
6609 }`)
6610
6611 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6612 apex {
6613 name: "myapex",
6614 key: "myapex.key",
6615 native_shared_libs: ["libfoo"],
6616 updatable: false,
6617 }
6618
6619 apex_key {
6620 name: "myapex.key",
6621 public_key: "testkey.avbpubkey",
6622 private_key: "testkey.pem",
6623 }
6624
6625 cc_library {
6626 name: "libfoo",
6627 stl: "none",
6628 static_libs: ["libbar"],
6629 system_shared_libs: [],
6630 apex_available: ["myapex"],
6631 }
6632
6633 cc_library {
6634 name: "libbar",
6635 stl: "none",
6636 system_shared_libs: [],
6637 }`)
6638}
6639
Paul Duffine52e66f2020-03-30 17:54:29 +01006640func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006641 testApexError(t, "\"otherapex\" is not a valid module name", `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006646 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006647 }
6648
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654
6655 cc_library {
6656 name: "libfoo",
6657 stl: "none",
6658 system_shared_libs: [],
6659 apex_available: ["otherapex"],
6660 }`)
6661
Paul Duffine52e66f2020-03-30 17:54:29 +01006662 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006663 apex {
6664 name: "myapex",
6665 key: "myapex.key",
6666 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006667 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006668 }
6669
6670 apex_key {
6671 name: "myapex.key",
6672 public_key: "testkey.avbpubkey",
6673 private_key: "testkey.pem",
6674 }
6675
6676 cc_library {
6677 name: "libfoo",
6678 stl: "none",
6679 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006680 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006681 apex_available: ["myapex"],
6682 }
6683
6684 cc_library {
6685 name: "libbar",
6686 stl: "none",
6687 system_shared_libs: [],
6688 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006689 }
6690
6691 cc_library {
6692 name: "libbaz",
6693 stl: "none",
6694 system_shared_libs: [],
6695 stubs: {
6696 versions: ["10", "20", "30"],
6697 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006698 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006699}
Jiyong Park127b40b2019-09-30 16:04:35 +09006700
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006701func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6702 t.Run("negative variant_version produces error", func(t *testing.T) {
6703 testApexError(t, "expected an integer between 0-9; got -1", `
6704 apex {
6705 name: "myapex",
6706 key: "myapex.key",
6707 apex_available_name: "com.android.foo",
6708 variant_version: "-1",
6709 updatable: false,
6710 }
6711 apex_key {
6712 name: "myapex.key",
6713 public_key: "testkey.avbpubkey",
6714 private_key: "testkey.pem",
6715 }
6716 `)
6717 })
6718
6719 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6720 testApexError(t, "expected an integer between 0-9; got 10", `
6721 apex {
6722 name: "myapex",
6723 key: "myapex.key",
6724 apex_available_name: "com.android.foo",
6725 variant_version: "10",
6726 updatable: false,
6727 }
6728 apex_key {
6729 name: "myapex.key",
6730 public_key: "testkey.avbpubkey",
6731 private_key: "testkey.pem",
6732 }
6733 `)
6734 })
6735}
6736
6737func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6738 context := android.GroupFixturePreparers(
6739 android.PrepareForIntegrationTestWithAndroid,
6740 PrepareForTestWithApexBuildComponents,
6741 android.FixtureMergeMockFs(android.MockFS{
6742 "system/sepolicy/apex/foo-file_contexts": nil,
6743 "system/sepolicy/apex/bar-file_contexts": nil,
6744 }),
6745 )
6746 result := context.RunTestWithBp(t, `
6747 apex {
6748 name: "foo",
6749 key: "myapex.key",
6750 apex_available_name: "com.android.foo",
6751 variant_version: "0",
6752 updatable: false,
6753 }
6754 apex {
6755 name: "bar",
6756 key: "myapex.key",
6757 apex_available_name: "com.android.foo",
6758 variant_version: "3",
6759 updatable: false,
6760 }
6761 apex_key {
6762 name: "myapex.key",
6763 public_key: "testkey.avbpubkey",
6764 private_key: "testkey.pem",
6765 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006766 override_apex {
6767 name: "myoverrideapex",
6768 base: "bar",
6769 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006770 `)
6771
Jooyung Hana0503a52023-08-23 13:12:50 +09006772 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006773 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6774 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6775 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6776 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6777 }
6778
Jooyung Hana0503a52023-08-23 13:12:50 +09006779 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006780 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6781 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6782 barActualDefaultVersion := barManifestRule.Args["default_version"]
6783 if barActualDefaultVersion != barExpectedDefaultVersion {
6784 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6785 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006786
Jooyung Hana0503a52023-08-23 13:12:50 +09006787 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006788 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6789 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6790 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6791 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006792}
6793
Sam Delmericoca816532023-06-02 14:09:50 -04006794func TestApexAvailable_ApexAvailableName(t *testing.T) {
6795 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6796 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6797 apex {
6798 name: "myapex_sminus",
6799 key: "myapex.key",
6800 apps: ["AppFoo"],
6801 apex_available_name: "myapex",
6802 updatable: false,
6803 }
6804 apex {
6805 name: "myapex",
6806 key: "myapex.key",
6807 apps: ["AppFoo"],
6808 updatable: false,
6809 }
6810 apex_key {
6811 name: "myapex.key",
6812 public_key: "testkey.avbpubkey",
6813 private_key: "testkey.pem",
6814 }
6815 android_app {
6816 name: "AppFoo",
6817 srcs: ["foo/bar/MyClass.java"],
6818 sdk_version: "none",
6819 system_modules: "none",
6820 apex_available: [ "myapex_sminus" ],
6821 }`,
6822 android.FixtureMergeMockFs(android.MockFS{
6823 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6824 }),
6825 )
6826 })
6827
6828 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6829 testApex(t, `
6830 apex {
6831 name: "myapex_sminus",
6832 key: "myapex.key",
6833 apps: ["AppFoo"],
6834 apex_available_name: "myapex",
6835 updatable: false,
6836 }
6837 apex {
6838 name: "myapex",
6839 key: "myapex.key",
6840 apps: ["AppFoo"],
6841 updatable: false,
6842 }
6843 apex_key {
6844 name: "myapex.key",
6845 public_key: "testkey.avbpubkey",
6846 private_key: "testkey.pem",
6847 }
6848 android_app {
6849 name: "AppFoo",
6850 srcs: ["foo/bar/MyClass.java"],
6851 sdk_version: "none",
6852 system_modules: "none",
6853 apex_available: [ "myapex" ],
6854 }`,
6855 android.FixtureMergeMockFs(android.MockFS{
6856 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6857 }),
6858 )
6859 })
6860
6861 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6862 testApex(t, `
6863 override_apex {
6864 name: "myoverrideapex_sminus",
6865 base: "myapex_sminus",
6866 key: "myapex.key",
6867 apps: ["AppFooOverride"],
6868 }
6869 override_apex {
6870 name: "myoverrideapex",
6871 base: "myapex",
6872 key: "myapex.key",
6873 apps: ["AppFooOverride"],
6874 }
6875 apex {
6876 name: "myapex_sminus",
6877 key: "myapex.key",
6878 apps: ["AppFoo"],
6879 apex_available_name: "myapex",
6880 updatable: false,
6881 }
6882 apex {
6883 name: "myapex",
6884 key: "myapex.key",
6885 apps: ["AppFoo"],
6886 updatable: false,
6887 }
6888 apex_key {
6889 name: "myapex.key",
6890 public_key: "testkey.avbpubkey",
6891 private_key: "testkey.pem",
6892 }
6893 android_app {
6894 name: "AppFooOverride",
6895 srcs: ["foo/bar/MyClass.java"],
6896 sdk_version: "none",
6897 system_modules: "none",
6898 apex_available: [ "myapex" ],
6899 }
6900 android_app {
6901 name: "AppFoo",
6902 srcs: ["foo/bar/MyClass.java"],
6903 sdk_version: "none",
6904 system_modules: "none",
6905 apex_available: [ "myapex" ],
6906 }`,
6907 android.FixtureMergeMockFs(android.MockFS{
6908 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6909 }),
6910 )
6911 })
6912}
6913
6914func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6915 context := android.GroupFixturePreparers(
6916 android.PrepareForIntegrationTestWithAndroid,
6917 PrepareForTestWithApexBuildComponents,
6918 java.PrepareForTestWithDexpreopt,
6919 android.FixtureMergeMockFs(android.MockFS{
6920 "system/sepolicy/apex/myapex-file_contexts": nil,
6921 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6922 }),
6923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6924 variables.BuildId = proptools.StringPtr("buildid")
6925 }),
6926 )
6927 context.RunTestWithBp(t, `
6928 override_apex {
6929 name: "myoverrideapex_sminus",
6930 base: "myapex_sminus",
6931 }
6932 override_apex {
6933 name: "myoverrideapex",
6934 base: "myapex",
6935 }
6936 apex {
6937 name: "myapex",
6938 key: "myapex.key",
6939 apps: ["AppFoo"],
6940 updatable: false,
6941 }
6942 apex {
6943 name: "myapex_sminus",
6944 apex_available_name: "myapex",
6945 key: "myapex.key",
6946 apps: ["AppFoo_sminus"],
6947 updatable: false,
6948 }
6949 apex_key {
6950 name: "myapex.key",
6951 public_key: "testkey.avbpubkey",
6952 private_key: "testkey.pem",
6953 }
6954 android_app {
6955 name: "AppFoo",
6956 srcs: ["foo/bar/MyClass.java"],
6957 sdk_version: "none",
6958 system_modules: "none",
6959 apex_available: [ "myapex" ],
6960 }
6961 android_app {
6962 name: "AppFoo_sminus",
6963 srcs: ["foo/bar/MyClass.java"],
6964 sdk_version: "none",
6965 min_sdk_version: "29",
6966 system_modules: "none",
6967 apex_available: [ "myapex" ],
6968 }`)
6969}
6970
Jiyong Park89e850a2020-04-07 16:37:39 +09006971func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006972 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006973 apex {
6974 name: "myapex",
6975 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006976 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006977 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006978 }
6979
6980 apex_key {
6981 name: "myapex.key",
6982 public_key: "testkey.avbpubkey",
6983 private_key: "testkey.pem",
6984 }
6985
6986 cc_library {
6987 name: "libfoo",
6988 stl: "none",
6989 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006990 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006991 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006992 }
6993
6994 cc_library {
6995 name: "libfoo2",
6996 stl: "none",
6997 system_shared_libs: [],
6998 shared_libs: ["libbaz"],
6999 apex_available: ["//apex_available:platform"],
7000 }
7001
7002 cc_library {
7003 name: "libbar",
7004 stl: "none",
7005 system_shared_libs: [],
7006 apex_available: ["myapex"],
7007 }
7008
7009 cc_library {
7010 name: "libbaz",
7011 stl: "none",
7012 system_shared_libs: [],
7013 apex_available: ["myapex"],
7014 stubs: {
7015 versions: ["1"],
7016 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007017 }`)
7018
Jiyong Park89e850a2020-04-07 16:37:39 +09007019 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7020 // because it depends on libbar which isn't available to platform
7021 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7022 if libfoo.NotAvailableForPlatform() != true {
7023 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7024 }
7025
7026 // libfoo2 however can be available to platform because it depends on libbaz which provides
7027 // stubs
7028 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7029 if libfoo2.NotAvailableForPlatform() == true {
7030 t.Errorf("%q should be available to platform", libfoo2.String())
7031 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007032}
Jiyong Parka90ca002019-10-07 15:47:24 +09007033
Paul Duffine52e66f2020-03-30 17:54:29 +01007034func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007035 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007036 apex {
7037 name: "myapex",
7038 key: "myapex.key",
7039 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007040 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007041 }
7042
7043 apex_key {
7044 name: "myapex.key",
7045 public_key: "testkey.avbpubkey",
7046 private_key: "testkey.pem",
7047 }
7048
7049 cc_library {
7050 name: "libfoo",
7051 stl: "none",
7052 system_shared_libs: [],
7053 apex_available: ["myapex"],
7054 static: {
7055 apex_available: ["//apex_available:platform"],
7056 },
7057 }`)
7058
Jiyong Park89e850a2020-04-07 16:37:39 +09007059 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7060 if libfooShared.NotAvailableForPlatform() != true {
7061 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7062 }
7063 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7064 if libfooStatic.NotAvailableForPlatform() != false {
7065 t.Errorf("%q should be available to platform", libfooStatic.String())
7066 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007067}
7068
Jiyong Park5d790c32019-11-15 18:40:32 +09007069func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007070 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007071 apex {
7072 name: "myapex",
7073 key: "myapex.key",
7074 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007075 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007076 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007077 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007078 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007079 }
7080
7081 override_apex {
7082 name: "override_myapex",
7083 base: "myapex",
7084 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007085 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007086 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007087 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007088 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007089 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007090 key: "mynewapex.key",
7091 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007092 }
7093
7094 apex_key {
7095 name: "myapex.key",
7096 public_key: "testkey.avbpubkey",
7097 private_key: "testkey.pem",
7098 }
7099
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007100 apex_key {
7101 name: "mynewapex.key",
7102 public_key: "testkey2.avbpubkey",
7103 private_key: "testkey2.pem",
7104 }
7105
7106 android_app_certificate {
7107 name: "myapex.certificate",
7108 certificate: "testkey",
7109 }
7110
Jiyong Park5d790c32019-11-15 18:40:32 +09007111 android_app {
7112 name: "app",
7113 srcs: ["foo/bar/MyClass.java"],
7114 package_name: "foo",
7115 sdk_version: "none",
7116 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007117 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007118 }
7119
7120 override_android_app {
7121 name: "override_app",
7122 base: "app",
7123 package_name: "bar",
7124 }
markchien7c803b82021-08-26 22:10:06 +08007125
7126 bpf {
7127 name: "bpf",
7128 srcs: ["bpf.c"],
7129 }
7130
7131 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007132 name: "overrideBpf",
7133 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007134 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007135
7136 prebuilt_etc {
7137 name: "myetc",
7138 src: "myprebuilt",
7139 }
7140
7141 prebuilt_etc {
7142 name: "override_myetc",
7143 src: "override_myprebuilt",
7144 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007145 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007146
Jooyung Hana0503a52023-08-23 13:12:50 +09007147 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7148 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007149 if originalVariant.GetOverriddenBy() != "" {
7150 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7151 }
7152 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7153 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7154 }
7155
Jooyung Hana0503a52023-08-23 13:12:50 +09007156 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007157 apexRule := module.Rule("apexRule")
7158 copyCmds := apexRule.Args["copy_commands"]
7159
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007160 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7161 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007162
markchien7c803b82021-08-26 22:10:06 +08007163 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007164 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007165
Daniel Norman5a3ce132021-08-26 15:44:43 -07007166 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7167 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7168
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007169 apexBundle := module.Module().(*apexBundle)
7170 name := apexBundle.Name()
7171 if name != "override_myapex" {
7172 t.Errorf("name should be \"override_myapex\", but was %q", name)
7173 }
7174
Baligh Uddin004d7172020-02-19 21:29:28 -08007175 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7176 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7177 }
7178
Jiyong Park20bacab2020-03-03 11:45:41 +09007179 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007180 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007181 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7182
7183 signApkRule := module.Rule("signapk")
7184 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007185
Colin Crossaa255532020-07-03 13:18:24 -07007186 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007187 var builder strings.Builder
7188 data.Custom(&builder, name, "TARGET_", "", data)
7189 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007190 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7191 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007192 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007193 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007194 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007195 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007196 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007197 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007198}
7199
Albert Martineefabcf2022-03-21 20:11:16 +00007200func TestMinSdkVersionOverride(t *testing.T) {
7201 // Override from 29 to 31
7202 minSdkOverride31 := "31"
7203 ctx := testApex(t, `
7204 apex {
7205 name: "myapex",
7206 key: "myapex.key",
7207 native_shared_libs: ["mylib"],
7208 updatable: true,
7209 min_sdk_version: "29"
7210 }
7211
7212 override_apex {
7213 name: "override_myapex",
7214 base: "myapex",
7215 logging_parent: "com.foo.bar",
7216 package_name: "test.overridden.package"
7217 }
7218
7219 apex_key {
7220 name: "myapex.key",
7221 public_key: "testkey.avbpubkey",
7222 private_key: "testkey.pem",
7223 }
7224
7225 cc_library {
7226 name: "mylib",
7227 srcs: ["mylib.cpp"],
7228 runtime_libs: ["libbar"],
7229 system_shared_libs: [],
7230 stl: "none",
7231 apex_available: [ "myapex" ],
7232 min_sdk_version: "apex_inherit"
7233 }
7234
7235 cc_library {
7236 name: "libbar",
7237 srcs: ["mylib.cpp"],
7238 system_shared_libs: [],
7239 stl: "none",
7240 apex_available: [ "myapex" ],
7241 min_sdk_version: "apex_inherit"
7242 }
7243
7244 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7245
Jooyung Hana0503a52023-08-23 13:12:50 +09007246 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007247 copyCmds := apexRule.Args["copy_commands"]
7248
7249 // Ensure that direct non-stubs dep is always included
7250 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7251
7252 // Ensure that runtime_libs dep in included
7253 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7254
7255 // Ensure libraries target overridden min_sdk_version value
7256 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7257}
7258
7259func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7260 // Attempt to override from 31 to 29, should be a NOOP
7261 minSdkOverride29 := "29"
7262 ctx := testApex(t, `
7263 apex {
7264 name: "myapex",
7265 key: "myapex.key",
7266 native_shared_libs: ["mylib"],
7267 updatable: true,
7268 min_sdk_version: "31"
7269 }
7270
7271 override_apex {
7272 name: "override_myapex",
7273 base: "myapex",
7274 logging_parent: "com.foo.bar",
7275 package_name: "test.overridden.package"
7276 }
7277
7278 apex_key {
7279 name: "myapex.key",
7280 public_key: "testkey.avbpubkey",
7281 private_key: "testkey.pem",
7282 }
7283
7284 cc_library {
7285 name: "mylib",
7286 srcs: ["mylib.cpp"],
7287 runtime_libs: ["libbar"],
7288 system_shared_libs: [],
7289 stl: "none",
7290 apex_available: [ "myapex" ],
7291 min_sdk_version: "apex_inherit"
7292 }
7293
7294 cc_library {
7295 name: "libbar",
7296 srcs: ["mylib.cpp"],
7297 system_shared_libs: [],
7298 stl: "none",
7299 apex_available: [ "myapex" ],
7300 min_sdk_version: "apex_inherit"
7301 }
7302
7303 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7304
Jooyung Hana0503a52023-08-23 13:12:50 +09007305 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007306 copyCmds := apexRule.Args["copy_commands"]
7307
7308 // Ensure that direct non-stubs dep is always included
7309 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7310
7311 // Ensure that runtime_libs dep in included
7312 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7313
7314 // Ensure libraries target the original min_sdk_version value rather than the overridden
7315 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7316}
7317
Jooyung Han214bf372019-11-12 13:03:50 +09007318func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007319 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007320 apex {
7321 name: "myapex",
7322 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007323 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007324 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007325 }
7326
7327 apex_key {
7328 name: "myapex.key",
7329 public_key: "testkey.avbpubkey",
7330 private_key: "testkey.pem",
7331 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007332
7333 cc_library {
7334 name: "mylib",
7335 srcs: ["mylib.cpp"],
7336 stl: "libc++",
7337 system_shared_libs: [],
7338 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007339 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007340 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007341 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007342
Jooyung Hana0503a52023-08-23 13:12:50 +09007343 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007344 args := module.Rule("apexRule").Args
7345 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007346 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007347
7348 // The copies of the libraries in the apex should have one more dependency than
7349 // the ones outside the apex, namely the unwinder. Ideally we should check
7350 // the dependency names directly here but for some reason the names are blank in
7351 // this test.
7352 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007353 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007354 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7355 if len(apexImplicits) != len(nonApexImplicits)+1 {
7356 t.Errorf("%q missing unwinder dep", lib)
7357 }
7358 }
Jooyung Han214bf372019-11-12 13:03:50 +09007359}
7360
Paul Duffine05480a2021-03-08 15:07:14 +00007361var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007362 "api/current.txt": nil,
7363 "api/removed.txt": nil,
7364 "api/system-current.txt": nil,
7365 "api/system-removed.txt": nil,
7366 "api/test-current.txt": nil,
7367 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007368
Anton Hanssondff2c782020-12-21 17:10:01 +00007369 "100/public/api/foo.txt": nil,
7370 "100/public/api/foo-removed.txt": nil,
7371 "100/system/api/foo.txt": nil,
7372 "100/system/api/foo-removed.txt": nil,
7373
Paul Duffineedc5d52020-06-12 17:46:39 +01007374 // For java_sdk_library_import
7375 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007376}
7377
Jooyung Han58f26ab2019-12-18 15:34:32 +09007378func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007379 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007380 apex {
7381 name: "myapex",
7382 key: "myapex.key",
7383 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007384 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007385 }
7386
7387 apex_key {
7388 name: "myapex.key",
7389 public_key: "testkey.avbpubkey",
7390 private_key: "testkey.pem",
7391 }
7392
7393 java_sdk_library {
7394 name: "foo",
7395 srcs: ["a.java"],
7396 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007397 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007398 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007399
7400 prebuilt_apis {
7401 name: "sdk",
7402 api_dirs: ["100"],
7403 }
Paul Duffin9b879592020-05-26 13:21:35 +01007404 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007405
7406 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007407 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007408 "javalib/foo.jar",
7409 "etc/permissions/foo.xml",
7410 })
7411 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007412 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007413 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 +09007414}
7415
Paul Duffin9b879592020-05-26 13:21:35 +01007416func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007417 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007418 apex {
7419 name: "myapex",
7420 key: "myapex.key",
7421 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007422 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007423 }
7424
7425 apex_key {
7426 name: "myapex.key",
7427 public_key: "testkey.avbpubkey",
7428 private_key: "testkey.pem",
7429 }
7430
7431 java_sdk_library {
7432 name: "foo",
7433 srcs: ["a.java"],
7434 api_packages: ["foo"],
7435 apex_available: ["myapex"],
7436 sdk_version: "none",
7437 system_modules: "none",
7438 }
7439
7440 java_library {
7441 name: "bar",
7442 srcs: ["a.java"],
7443 libs: ["foo"],
7444 apex_available: ["myapex"],
7445 sdk_version: "none",
7446 system_modules: "none",
7447 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007448
7449 prebuilt_apis {
7450 name: "sdk",
7451 api_dirs: ["100"],
7452 }
Paul Duffin9b879592020-05-26 13:21:35 +01007453 `, withFiles(filesForSdkLibrary))
7454
7455 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007456 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007457 "javalib/bar.jar",
7458 "javalib/foo.jar",
7459 "etc/permissions/foo.xml",
7460 })
7461
7462 // The bar library should depend on the implementation jar.
7463 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007464 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007465 t.Errorf("expected %q, found %#q", expected, actual)
7466 }
7467}
7468
7469func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007470 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007471 apex {
7472 name: "myapex",
7473 key: "myapex.key",
7474 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007475 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007476 }
7477
7478 apex_key {
7479 name: "myapex.key",
7480 public_key: "testkey.avbpubkey",
7481 private_key: "testkey.pem",
7482 }
7483
7484 java_sdk_library {
7485 name: "foo",
7486 srcs: ["a.java"],
7487 api_packages: ["foo"],
7488 apex_available: ["myapex"],
7489 sdk_version: "none",
7490 system_modules: "none",
7491 }
7492
7493 java_library {
7494 name: "bar",
7495 srcs: ["a.java"],
7496 libs: ["foo"],
7497 sdk_version: "none",
7498 system_modules: "none",
7499 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007500
7501 prebuilt_apis {
7502 name: "sdk",
7503 api_dirs: ["100"],
7504 }
Paul Duffin9b879592020-05-26 13:21:35 +01007505 `, withFiles(filesForSdkLibrary))
7506
7507 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007508 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007509 "javalib/foo.jar",
7510 "etc/permissions/foo.xml",
7511 })
7512
7513 // The bar library should depend on the stubs jar.
7514 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007515 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007516 t.Errorf("expected %q, found %#q", expected, actual)
7517 }
7518}
7519
Paul Duffineedc5d52020-06-12 17:46:39 +01007520func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007521 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007522 prebuilt_apis {
7523 name: "sdk",
7524 api_dirs: ["100"],
7525 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007526 withFiles(map[string][]byte{
7527 "apex/a.java": nil,
7528 "apex/apex_manifest.json": nil,
7529 "apex/Android.bp": []byte(`
7530 package {
7531 default_visibility: ["//visibility:private"],
7532 }
7533
7534 apex {
7535 name: "myapex",
7536 key: "myapex.key",
7537 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007538 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007539 }
7540
7541 apex_key {
7542 name: "myapex.key",
7543 public_key: "testkey.avbpubkey",
7544 private_key: "testkey.pem",
7545 }
7546
7547 java_library {
7548 name: "bar",
7549 srcs: ["a.java"],
7550 libs: ["foo"],
7551 apex_available: ["myapex"],
7552 sdk_version: "none",
7553 system_modules: "none",
7554 }
7555`),
7556 "source/a.java": nil,
7557 "source/api/current.txt": nil,
7558 "source/api/removed.txt": nil,
7559 "source/Android.bp": []byte(`
7560 package {
7561 default_visibility: ["//visibility:private"],
7562 }
7563
7564 java_sdk_library {
7565 name: "foo",
7566 visibility: ["//apex"],
7567 srcs: ["a.java"],
7568 api_packages: ["foo"],
7569 apex_available: ["myapex"],
7570 sdk_version: "none",
7571 system_modules: "none",
7572 public: {
7573 enabled: true,
7574 },
7575 }
7576`),
7577 "prebuilt/a.jar": nil,
7578 "prebuilt/Android.bp": []byte(`
7579 package {
7580 default_visibility: ["//visibility:private"],
7581 }
7582
7583 java_sdk_library_import {
7584 name: "foo",
7585 visibility: ["//apex", "//source"],
7586 apex_available: ["myapex"],
7587 prefer: true,
7588 public: {
7589 jars: ["a.jar"],
7590 },
7591 }
7592`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007593 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007594 )
7595
7596 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007597 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007598 "javalib/bar.jar",
7599 "javalib/foo.jar",
7600 "etc/permissions/foo.xml",
7601 })
7602
7603 // The bar library should depend on the implementation jar.
7604 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007605 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007606 t.Errorf("expected %q, found %#q", expected, actual)
7607 }
7608}
7609
7610func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7611 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7612 apex {
7613 name: "myapex",
7614 key: "myapex.key",
7615 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007616 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007617 }
7618
7619 apex_key {
7620 name: "myapex.key",
7621 public_key: "testkey.avbpubkey",
7622 private_key: "testkey.pem",
7623 }
7624
7625 java_sdk_library_import {
7626 name: "foo",
7627 apex_available: ["myapex"],
7628 prefer: true,
7629 public: {
7630 jars: ["a.jar"],
7631 },
7632 }
7633
7634 `, withFiles(filesForSdkLibrary))
7635}
7636
atrost6e126252020-01-27 17:01:16 +00007637func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007638 result := android.GroupFixturePreparers(
7639 prepareForApexTest,
7640 java.PrepareForTestWithPlatformCompatConfig,
7641 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007642 apex {
7643 name: "myapex",
7644 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007645 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007646 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007647 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007648 }
7649
7650 apex_key {
7651 name: "myapex.key",
7652 public_key: "testkey.avbpubkey",
7653 private_key: "testkey.pem",
7654 }
7655
7656 platform_compat_config {
7657 name: "myjar-platform-compat-config",
7658 src: ":myjar",
7659 }
7660
7661 java_library {
7662 name: "myjar",
7663 srcs: ["foo/bar/MyClass.java"],
7664 sdk_version: "none",
7665 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007666 apex_available: [ "myapex" ],
7667 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007668
7669 // Make sure that a preferred prebuilt does not affect the apex contents.
7670 prebuilt_platform_compat_config {
7671 name: "myjar-platform-compat-config",
7672 metadata: "compat-config/metadata.xml",
7673 prefer: true,
7674 }
atrost6e126252020-01-27 17:01:16 +00007675 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007676 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007677 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007678 "etc/compatconfig/myjar-platform-compat-config.xml",
7679 "javalib/myjar.jar",
7680 })
7681}
7682
Jooyung Han862c0d62022-12-21 10:15:37 +09007683func TestNoDupeApexFiles(t *testing.T) {
7684 android.GroupFixturePreparers(
7685 android.PrepareForTestWithAndroidBuildComponents,
7686 PrepareForTestWithApexBuildComponents,
7687 prepareForTestWithMyapex,
7688 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7689 ).
7690 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7691 RunTestWithBp(t, `
7692 apex {
7693 name: "myapex",
7694 key: "myapex.key",
7695 prebuilts: ["foo", "bar"],
7696 updatable: false,
7697 }
7698
7699 apex_key {
7700 name: "myapex.key",
7701 public_key: "testkey.avbpubkey",
7702 private_key: "testkey.pem",
7703 }
7704
7705 prebuilt_etc {
7706 name: "foo",
7707 src: "myprebuilt",
7708 filename_from_src: true,
7709 }
7710
7711 prebuilt_etc {
7712 name: "bar",
7713 src: "myprebuilt",
7714 filename_from_src: true,
7715 }
7716 `)
7717}
7718
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007719func TestApexUnwantedTransitiveDeps(t *testing.T) {
7720 bp := `
7721 apex {
7722 name: "myapex",
7723 key: "myapex.key",
7724 native_shared_libs: ["libfoo"],
7725 updatable: false,
7726 unwanted_transitive_deps: ["libbar"],
7727 }
7728
7729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }
7734
7735 cc_library {
7736 name: "libfoo",
7737 srcs: ["foo.cpp"],
7738 shared_libs: ["libbar"],
7739 apex_available: ["myapex"],
7740 }
7741
7742 cc_library {
7743 name: "libbar",
7744 srcs: ["bar.cpp"],
7745 apex_available: ["myapex"],
7746 }`
7747 ctx := testApex(t, bp)
7748 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7749 "*/libc++.so",
7750 "*/libfoo.so",
7751 // not libbar.so
7752 })
7753}
7754
Jiyong Park479321d2019-12-16 11:47:12 +09007755func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7756 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7757 apex {
7758 name: "myapex",
7759 key: "myapex.key",
7760 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007761 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007762 }
7763
7764 apex_key {
7765 name: "myapex.key",
7766 public_key: "testkey.avbpubkey",
7767 private_key: "testkey.pem",
7768 }
7769
7770 java_library {
7771 name: "myjar",
7772 srcs: ["foo/bar/MyClass.java"],
7773 sdk_version: "none",
7774 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007775 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007776 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007777 }
7778 `)
7779}
7780
Jiyong Park7afd1072019-12-30 16:56:33 +09007781func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007782 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007783 apex {
7784 name: "myapex",
7785 key: "myapex.key",
7786 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007787 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007788 }
7789
7790 apex_key {
7791 name: "myapex.key",
7792 public_key: "testkey.avbpubkey",
7793 private_key: "testkey.pem",
7794 }
7795
7796 cc_library {
7797 name: "mylib",
7798 srcs: ["mylib.cpp"],
7799 system_shared_libs: [],
7800 stl: "none",
7801 required: ["a", "b"],
7802 host_required: ["c", "d"],
7803 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007804 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007805 }
7806 `)
7807
Jooyung Hana0503a52023-08-23 13:12:50 +09007808 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007809 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007810 name := apexBundle.BaseModuleName()
7811 prefix := "TARGET_"
7812 var builder strings.Builder
7813 data.Custom(&builder, name, prefix, "", data)
7814 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007815 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007816 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7817 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007818}
7819
Jiyong Park7cd10e32020-01-14 09:22:18 +09007820func TestSymlinksFromApexToSystem(t *testing.T) {
7821 bp := `
7822 apex {
7823 name: "myapex",
7824 key: "myapex.key",
7825 native_shared_libs: ["mylib"],
7826 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007827 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007828 }
7829
Jiyong Park9d677202020-02-19 16:29:35 +09007830 apex {
7831 name: "myapex.updatable",
7832 key: "myapex.key",
7833 native_shared_libs: ["mylib"],
7834 java_libs: ["myjar"],
7835 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007836 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007837 }
7838
Jiyong Park7cd10e32020-01-14 09:22:18 +09007839 apex_key {
7840 name: "myapex.key",
7841 public_key: "testkey.avbpubkey",
7842 private_key: "testkey.pem",
7843 }
7844
7845 cc_library {
7846 name: "mylib",
7847 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007848 shared_libs: [
7849 "myotherlib",
7850 "myotherlib_ext",
7851 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 system_shared_libs: [],
7853 stl: "none",
7854 apex_available: [
7855 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007856 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007857 "//apex_available:platform",
7858 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007859 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007860 }
7861
7862 cc_library {
7863 name: "myotherlib",
7864 srcs: ["mylib.cpp"],
7865 system_shared_libs: [],
7866 stl: "none",
7867 apex_available: [
7868 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007869 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007870 "//apex_available:platform",
7871 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007872 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007873 }
7874
Jiyong Parkce243632023-02-17 18:22:25 +09007875 cc_library {
7876 name: "myotherlib_ext",
7877 srcs: ["mylib.cpp"],
7878 system_shared_libs: [],
7879 system_ext_specific: true,
7880 stl: "none",
7881 apex_available: [
7882 "myapex",
7883 "myapex.updatable",
7884 "//apex_available:platform",
7885 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007886 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007887 }
7888
Jiyong Park7cd10e32020-01-14 09:22:18 +09007889 java_library {
7890 name: "myjar",
7891 srcs: ["foo/bar/MyClass.java"],
7892 sdk_version: "none",
7893 system_modules: "none",
7894 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007895 apex_available: [
7896 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007897 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007898 "//apex_available:platform",
7899 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007900 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007901 }
7902
7903 java_library {
7904 name: "myotherjar",
7905 srcs: ["foo/bar/MyClass.java"],
7906 sdk_version: "none",
7907 system_modules: "none",
7908 apex_available: [
7909 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007910 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007911 "//apex_available:platform",
7912 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007913 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007914 }
7915 `
7916
7917 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7918 for _, f := range files {
7919 if f.path == file {
7920 if f.isLink {
7921 t.Errorf("%q is not a real file", file)
7922 }
7923 return
7924 }
7925 }
7926 t.Errorf("%q is not found", file)
7927 }
7928
Jiyong Parkce243632023-02-17 18:22:25 +09007929 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007930 for _, f := range files {
7931 if f.path == file {
7932 if !f.isLink {
7933 t.Errorf("%q is not a symlink", file)
7934 }
Jiyong Parkce243632023-02-17 18:22:25 +09007935 if f.src != target {
7936 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7937 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007938 return
7939 }
7940 }
7941 t.Errorf("%q is not found", file)
7942 }
7943
Jiyong Park9d677202020-02-19 16:29:35 +09007944 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7945 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007946 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007947 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007948 ensureRealfileExists(t, files, "javalib/myjar.jar")
7949 ensureRealfileExists(t, files, "lib64/mylib.so")
7950 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007951 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007952
Jooyung Hana0503a52023-08-23 13:12:50 +09007953 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007954 ensureRealfileExists(t, files, "javalib/myjar.jar")
7955 ensureRealfileExists(t, files, "lib64/mylib.so")
7956 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007957 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007958
7959 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007960 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007961 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007962 ensureRealfileExists(t, files, "javalib/myjar.jar")
7963 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007964 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7965 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007966
Jooyung Hana0503a52023-08-23 13:12:50 +09007967 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007968 ensureRealfileExists(t, files, "javalib/myjar.jar")
7969 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007970 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7971 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007972}
7973
Yo Chiange8128052020-07-23 20:09:18 +08007974func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007975 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007976 apex {
7977 name: "myapex",
7978 key: "myapex.key",
7979 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007980 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007981 }
7982
7983 apex_key {
7984 name: "myapex.key",
7985 public_key: "testkey.avbpubkey",
7986 private_key: "testkey.pem",
7987 }
7988
7989 cc_library_shared {
7990 name: "mylib",
7991 srcs: ["mylib.cpp"],
7992 shared_libs: ["myotherlib"],
7993 system_shared_libs: [],
7994 stl: "none",
7995 apex_available: [
7996 "myapex",
7997 "//apex_available:platform",
7998 ],
7999 }
8000
8001 cc_prebuilt_library_shared {
8002 name: "myotherlib",
8003 srcs: ["prebuilt.so"],
8004 system_shared_libs: [],
8005 stl: "none",
8006 apex_available: [
8007 "myapex",
8008 "//apex_available:platform",
8009 ],
8010 }
8011 `)
8012
Jooyung Hana0503a52023-08-23 13:12:50 +09008013 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008014 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008015 var builder strings.Builder
8016 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8017 androidMk := builder.String()
8018 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008019 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008020 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8021 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8022 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008023 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008024}
8025
Jooyung Han643adc42020-02-27 13:50:06 +09008026func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008027 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008028 apex {
8029 name: "myapex",
8030 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008031 binaries: ["mybin"],
8032 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008033 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008034 }
8035
8036 apex_key {
8037 name: "myapex.key",
8038 public_key: "testkey.avbpubkey",
8039 private_key: "testkey.pem",
8040 }
8041
8042 cc_library {
8043 name: "mylib",
8044 srcs: ["mylib.cpp"],
8045 shared_libs: ["mylib2"],
8046 system_shared_libs: [],
8047 stl: "none",
8048 apex_available: [ "myapex" ],
8049 }
8050
8051 cc_library {
8052 name: "mylib2",
8053 srcs: ["mylib.cpp"],
8054 system_shared_libs: [],
8055 stl: "none",
8056 apex_available: [ "myapex" ],
8057 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008058
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008059 // Used as both a JNI library and a regular shared library.
8060 cc_library {
8061 name: "mylib3",
8062 srcs: ["mylib.cpp"],
8063 system_shared_libs: [],
8064 stl: "none",
8065 apex_available: [ "myapex" ],
8066 }
8067
8068 cc_binary {
8069 name: "mybin",
8070 srcs: ["mybin.cpp"],
8071 shared_libs: ["mylib3"],
8072 system_shared_libs: [],
8073 stl: "none",
8074 apex_available: [ "myapex" ],
8075 }
8076
Jiyong Park34d5c332022-02-24 18:02:44 +09008077 rust_ffi_shared {
8078 name: "libfoo.rust",
8079 crate_name: "foo",
8080 srcs: ["foo.rs"],
8081 shared_libs: ["libfoo.shared_from_rust"],
8082 prefer_rlib: true,
8083 apex_available: ["myapex"],
8084 }
8085
8086 cc_library_shared {
8087 name: "libfoo.shared_from_rust",
8088 srcs: ["mylib.cpp"],
8089 system_shared_libs: [],
8090 stl: "none",
8091 stubs: {
8092 versions: ["10", "11", "12"],
8093 },
8094 }
8095
Jooyung Han643adc42020-02-27 13:50:06 +09008096 `)
8097
Jooyung Hana0503a52023-08-23 13:12:50 +09008098 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008099 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008100 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008101 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008102 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008103 "lib64/mylib.so",
8104 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008105 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008106 "lib64/libfoo.rust.so",
8107 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8108 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008109 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008110
8111 // b/220397949
8112 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008113}
8114
Jooyung Han49f67012020-04-17 13:43:10 +09008115func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008116 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008117 apex {
8118 name: "myapex",
8119 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008120 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008121 }
8122 apex_key {
8123 name: "myapex.key",
8124 public_key: "testkey.avbpubkey",
8125 private_key: "testkey.pem",
8126 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008127 `,
8128 android.FixtureModifyConfig(func(config android.Config) {
8129 delete(config.Targets, android.Android)
8130 config.AndroidCommonTarget = android.Target{}
8131 }),
8132 )
Jooyung Han49f67012020-04-17 13:43:10 +09008133
8134 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8135 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8136 }
8137}
8138
Jiyong Parkbd159612020-02-28 15:22:21 +09008139func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008140 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008141 apex {
8142 name: "myapex",
8143 key: "myapex.key",
8144 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008145 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008146 }
8147
8148 apex_key {
8149 name: "myapex.key",
8150 public_key: "testkey.avbpubkey",
8151 private_key: "testkey.pem",
8152 }
8153
8154 android_app {
8155 name: "AppFoo",
8156 srcs: ["foo/bar/MyClass.java"],
8157 sdk_version: "none",
8158 system_modules: "none",
8159 apex_available: [ "myapex" ],
8160 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008161 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008162
Jooyung Hana0503a52023-08-23 13:12:50 +09008163 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008164 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008165
8166 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008167 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 +09008168}
8169
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008170func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008171 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008172 apex {
8173 name: "myapex",
8174 key: "myapex.key",
8175 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008176 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008177 }
8178
8179 apex_key {
8180 name: "myapex.key",
8181 public_key: "testkey.avbpubkey",
8182 private_key: "testkey.pem",
8183 }
8184
8185 android_app_set {
8186 name: "AppSet",
8187 set: "AppSet.apks",
8188 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008189 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008190 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008191 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008192 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8193 s := mod.Rule("apexRule").Args["copy_commands"]
8194 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008195 if len(copyCmds) != 4 {
8196 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008197 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008198 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8199 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008200 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8201 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008202
8203 // Ensure that canned_fs_config has an entry for the app set zip file
8204 generateFsRule := mod.Rule("generateFsConfig")
8205 cmd := generateFsRule.RuleParams.Command
8206 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008207}
8208
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008209func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008210 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008211 apex_set {
8212 name: "myapex",
8213 filename: "foo_v2.apex",
8214 sanitized: {
8215 none: { set: "myapex.apks", },
8216 hwaddress: { set: "myapex.hwasan.apks", },
8217 },
Paul Duffin24704672021-04-06 16:09:30 +01008218 }
8219 `
8220 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008221
Paul Duffin24704672021-04-06 16:09:30 +01008222 // Check that the extractor produces the correct output file from the correct input file.
8223 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008224
Paul Duffin24704672021-04-06 16:09:30 +01008225 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8226 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008227
Paul Duffin24704672021-04-06 16:09:30 +01008228 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8229
8230 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008231 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8232 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008233
8234 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008235}
8236
Pranav Guptaeba03b02022-09-27 00:27:08 +00008237func TestApexSetApksModuleAssignment(t *testing.T) {
8238 ctx := testApex(t, `
8239 apex_set {
8240 name: "myapex",
8241 set: ":myapex_apks_file",
8242 }
8243
8244 filegroup {
8245 name: "myapex_apks_file",
8246 srcs: ["myapex.apks"],
8247 }
8248 `)
8249
8250 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8251
8252 // Check that the extractor produces the correct apks file from the input module
8253 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8254 extractedApex := m.Output(extractorOutput)
8255
8256 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8257}
8258
Paul Duffin89f570a2021-06-16 01:42:33 +01008259func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008260 t.Helper()
8261
Paul Duffin55607122021-03-30 23:32:51 +01008262 fs := android.MockFS{
8263 "a.java": nil,
8264 "a.jar": nil,
8265 "apex_manifest.json": nil,
8266 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008267 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008268 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8269 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8270 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008271 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008272 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008273
Paul Duffin55607122021-03-30 23:32:51 +01008274 errorHandler := android.FixtureExpectsNoErrors
8275 if errmsg != "" {
8276 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008277 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008278
Paul Duffin55607122021-03-30 23:32:51 +01008279 result := android.GroupFixturePreparers(
8280 cc.PrepareForTestWithCcDefaultModules,
8281 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008282 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008283 java.PrepareForTestWithJavaSdkLibraryFiles,
8284 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008285 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008286 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008287 android.FixtureModifyMockFS(func(fs android.MockFS) {
8288 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8289 insert := ""
8290 for _, fragment := range fragments {
8291 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8292 }
8293 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8294 platform_bootclasspath {
8295 name: "platform-bootclasspath",
8296 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008297 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008298 %s
8299 ],
8300 }
8301 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008302 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008303 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008304 // Dexpreopt for boot jars requires the ART boot image profile.
8305 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8306 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008307 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008308 ).
8309 ExtendWithErrorHandler(errorHandler).
8310 RunTestWithBp(t, bp)
8311
8312 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008313}
8314
Paul Duffin5556c5f2022-06-09 17:32:21 +00008315func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008316 preparers := android.GroupFixturePreparers(
8317 java.PrepareForTestWithJavaDefaultModules,
8318 PrepareForTestWithApexBuildComponents,
8319 ).
8320 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8321 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8322
8323 bpBase := `
8324 apex_set {
8325 name: "com.android.myapex",
8326 installable: true,
8327 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8328 set: "myapex.apks",
8329 }
8330
8331 apex_set {
8332 name: "com.mycompany.android.myapex",
8333 apex_name: "com.android.myapex",
8334 installable: true,
8335 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8336 set: "company-myapex.apks",
8337 }
8338
8339 prebuilt_bootclasspath_fragment {
8340 name: "my-bootclasspath-fragment",
8341 apex_available: ["com.android.myapex"],
8342 %s
8343 }
8344 `
8345
8346 t.Run("java_import", func(t *testing.T) {
8347 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8348 java_import {
8349 name: "libfoo",
8350 jars: ["libfoo.jar"],
8351 apex_available: ["com.android.myapex"],
8352 }
8353 `)
8354 })
8355
8356 t.Run("java_sdk_library_import", func(t *testing.T) {
8357 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8358 java_sdk_library_import {
8359 name: "libfoo",
8360 public: {
8361 jars: ["libbar.jar"],
8362 },
8363 apex_available: ["com.android.myapex"],
8364 }
8365 `)
8366 })
8367
8368 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8369 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8370 image_name: "art",
8371 contents: ["libfoo"],
8372 `)+`
8373 java_sdk_library_import {
8374 name: "libfoo",
8375 public: {
8376 jars: ["libbar.jar"],
8377 },
8378 apex_available: ["com.android.myapex"],
8379 }
8380 `)
8381 })
8382}
8383
Paul Duffin5556c5f2022-06-09 17:32:21 +00008384func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8385 preparers := android.GroupFixturePreparers(
8386 java.PrepareForTestWithJavaDefaultModules,
8387 PrepareForTestWithApexBuildComponents,
8388 )
8389
8390 bpBase := `
8391 apex_set {
8392 name: "com.android.myapex",
8393 installable: true,
8394 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8395 set: "myapex.apks",
8396 }
8397
8398 apex_set {
8399 name: "com.android.myapex_compressed",
8400 apex_name: "com.android.myapex",
8401 installable: true,
8402 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8403 set: "myapex_compressed.apks",
8404 }
8405
8406 prebuilt_bootclasspath_fragment {
8407 name: "my-bootclasspath-fragment",
8408 apex_available: [
8409 "com.android.myapex",
8410 "com.android.myapex_compressed",
8411 ],
8412 hidden_api: {
8413 annotation_flags: "annotation-flags.csv",
8414 metadata: "metadata.csv",
8415 index: "index.csv",
8416 signature_patterns: "signature_patterns.csv",
8417 },
8418 %s
8419 }
8420 `
8421
8422 t.Run("java_import", func(t *testing.T) {
8423 result := preparers.RunTestWithBp(t,
8424 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8425 java_import {
8426 name: "libfoo",
8427 jars: ["libfoo.jar"],
8428 apex_available: [
8429 "com.android.myapex",
8430 "com.android.myapex_compressed",
8431 ],
8432 }
8433 `)
8434
8435 module := result.Module("libfoo", "android_common_com.android.myapex")
8436 usesLibraryDep := module.(java.UsesLibraryDependency)
8437 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8438 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8439 usesLibraryDep.DexJarBuildPath().Path())
8440 })
8441
8442 t.Run("java_sdk_library_import", func(t *testing.T) {
8443 result := preparers.RunTestWithBp(t,
8444 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8445 java_sdk_library_import {
8446 name: "libfoo",
8447 public: {
8448 jars: ["libbar.jar"],
8449 },
8450 apex_available: [
8451 "com.android.myapex",
8452 "com.android.myapex_compressed",
8453 ],
8454 compile_dex: true,
8455 }
8456 `)
8457
8458 module := result.Module("libfoo", "android_common_com.android.myapex")
8459 usesLibraryDep := module.(java.UsesLibraryDependency)
8460 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8461 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8462 usesLibraryDep.DexJarBuildPath().Path())
8463 })
8464
8465 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8466 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8467 image_name: "art",
8468 contents: ["libfoo"],
8469 `)+`
8470 java_sdk_library_import {
8471 name: "libfoo",
8472 public: {
8473 jars: ["libbar.jar"],
8474 },
8475 apex_available: [
8476 "com.android.myapex",
8477 "com.android.myapex_compressed",
8478 ],
8479 compile_dex: true,
8480 }
8481 `)
8482 })
8483}
8484
Jooyung Han548640b2020-04-27 12:10:30 +09008485func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8486 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8487 apex {
8488 name: "myapex",
8489 key: "myapex.key",
8490 updatable: true,
8491 }
8492
8493 apex_key {
8494 name: "myapex.key",
8495 public_key: "testkey.avbpubkey",
8496 private_key: "testkey.pem",
8497 }
8498 `)
8499}
8500
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008501func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8502 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8503 apex {
8504 name: "myapex",
8505 key: "myapex.key",
8506 }
8507
8508 apex_key {
8509 name: "myapex.key",
8510 public_key: "testkey.avbpubkey",
8511 private_key: "testkey.pem",
8512 }
8513 `)
8514}
8515
Jooyung Handfc864c2023-03-20 18:19:07 +09008516func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8517 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008518 apex {
8519 name: "myapex",
8520 key: "myapex.key",
8521 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008522 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008523 soc_specific: true,
8524 }
8525
8526 apex_key {
8527 name: "myapex.key",
8528 public_key: "testkey.avbpubkey",
8529 private_key: "testkey.pem",
8530 }
8531 `)
8532}
8533
Jooyung Han02873da2023-03-22 17:41:03 +09008534func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8535 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8536 apex {
8537 name: "myapex",
8538 key: "myapex.key",
8539 updatable: false,
8540 min_sdk_version: "29",
8541 use_vndk_as_stable: true,
8542 vendor: true,
8543 }
8544
8545 apex_key {
8546 name: "myapex.key",
8547 public_key: "testkey.avbpubkey",
8548 private_key: "testkey.pem",
8549 }
8550 `)
8551}
8552
Jooyung Handfc864c2023-03-20 18:19:07 +09008553func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8554 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8555 apex {
8556 name: "myapex",
8557 key: "myapex.key",
8558 updatable: false,
8559 use_vndk_as_stable: true,
8560 }
8561
8562 apex_key {
8563 name: "myapex.key",
8564 public_key: "testkey.avbpubkey",
8565 private_key: "testkey.pem",
8566 }
8567 `)
8568}
8569
satayevb98371c2021-06-15 16:49:50 +01008570func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8571 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8572 apex {
8573 name: "myapex",
8574 key: "myapex.key",
8575 systemserverclasspath_fragments: [
8576 "mysystemserverclasspathfragment",
8577 ],
8578 min_sdk_version: "29",
8579 updatable: true,
8580 }
8581
8582 apex_key {
8583 name: "myapex.key",
8584 public_key: "testkey.avbpubkey",
8585 private_key: "testkey.pem",
8586 }
8587
8588 java_library {
8589 name: "foo",
8590 srcs: ["b.java"],
8591 min_sdk_version: "29",
8592 installable: true,
8593 apex_available: [
8594 "myapex",
8595 ],
8596 }
8597
8598 systemserverclasspath_fragment {
8599 name: "mysystemserverclasspathfragment",
8600 generate_classpaths_proto: false,
8601 contents: [
8602 "foo",
8603 ],
8604 apex_available: [
8605 "myapex",
8606 ],
8607 }
satayevabcd5972021-08-06 17:49:46 +01008608 `,
8609 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8610 )
satayevb98371c2021-06-15 16:49:50 +01008611}
8612
Paul Duffin064b70c2020-11-02 17:32:38 +00008613func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008614 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008615 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008616 fragment := java.ApexVariantReference{
8617 Apex: proptools.StringPtr("myapex"),
8618 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8619 }
8620
Paul Duffin064b70c2020-11-02 17:32:38 +00008621 testDexpreoptWithApexes(t, `
8622 prebuilt_apex {
8623 name: "myapex" ,
8624 arch: {
8625 arm64: {
8626 src: "myapex-arm64.apex",
8627 },
8628 arm: {
8629 src: "myapex-arm.apex",
8630 },
8631 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008632 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8633 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008634
Paul Duffin89f570a2021-06-16 01:42:33 +01008635 prebuilt_bootclasspath_fragment {
8636 name: "my-bootclasspath-fragment",
8637 contents: ["libfoo"],
8638 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008639 hidden_api: {
8640 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8641 metadata: "my-bootclasspath-fragment/metadata.csv",
8642 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008643 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8644 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8645 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008646 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008647 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008648
Paul Duffin89f570a2021-06-16 01:42:33 +01008649 java_import {
8650 name: "libfoo",
8651 jars: ["libfoo.jar"],
8652 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008653 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008654 }
8655 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008656 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008657}
8658
Spandan Dasf14e2542021-11-12 00:01:37 +00008659func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008660 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008661 bp += `
8662 apex_key {
8663 name: "myapex.key",
8664 public_key: "testkey.avbpubkey",
8665 private_key: "testkey.pem",
8666 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008667 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 "lib1/src/A.java": nil,
8669 "lib2/src/B.java": nil,
8670 "system/sepolicy/apex/myapex-file_contexts": nil,
8671 }
8672
Paul Duffin45338f02021-03-30 23:07:52 +01008673 errorHandler := android.FixtureExpectsNoErrors
8674 if errmsg != "" {
8675 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008676 }
Colin Crossae8600b2020-10-29 17:09:13 -07008677
Paul Duffin45338f02021-03-30 23:07:52 +01008678 android.GroupFixturePreparers(
8679 android.PrepareForTestWithAndroidBuildComponents,
8680 java.PrepareForTestWithJavaBuildComponents,
8681 PrepareForTestWithApexBuildComponents,
8682 android.PrepareForTestWithNeverallowRules(rules),
8683 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008684 apexBootJars := make([]string, 0, len(bootJars))
8685 for _, apexBootJar := range bootJars {
8686 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008687 }
satayevd604b212021-07-21 14:23:52 +01008688 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008689 }),
8690 fs.AddToFixture(),
8691 ).
8692 ExtendWithErrorHandler(errorHandler).
8693 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008694}
8695
8696func TestApexPermittedPackagesRules(t *testing.T) {
8697 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008698 name string
8699 expectedError string
8700 bp string
8701 bootJars []string
8702 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008703 }{
8704
8705 {
8706 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8707 expectedError: "",
8708 bp: `
8709 java_library {
8710 name: "bcp_lib1",
8711 srcs: ["lib1/src/*.java"],
8712 permitted_packages: ["foo.bar"],
8713 apex_available: ["myapex"],
8714 sdk_version: "none",
8715 system_modules: "none",
8716 }
8717 java_library {
8718 name: "nonbcp_lib2",
8719 srcs: ["lib2/src/*.java"],
8720 apex_available: ["myapex"],
8721 permitted_packages: ["a.b"],
8722 sdk_version: "none",
8723 system_modules: "none",
8724 }
8725 apex {
8726 name: "myapex",
8727 key: "myapex.key",
8728 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008729 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008730 }`,
8731 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008732 bcpPermittedPackages: map[string][]string{
8733 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008734 "foo.bar",
8735 },
8736 },
8737 },
8738 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008739 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008740 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 +01008741 bp: `
8742 java_library {
8743 name: "bcp_lib1",
8744 srcs: ["lib1/src/*.java"],
8745 apex_available: ["myapex"],
8746 permitted_packages: ["foo.bar"],
8747 sdk_version: "none",
8748 system_modules: "none",
8749 }
8750 java_library {
8751 name: "bcp_lib2",
8752 srcs: ["lib2/src/*.java"],
8753 apex_available: ["myapex"],
8754 permitted_packages: ["foo.bar", "bar.baz"],
8755 sdk_version: "none",
8756 system_modules: "none",
8757 }
8758 apex {
8759 name: "myapex",
8760 key: "myapex.key",
8761 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008762 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008763 }
8764 `,
8765 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008766 bcpPermittedPackages: map[string][]string{
8767 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008768 "foo.bar",
8769 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008770 "bcp_lib2": []string{
8771 "foo.bar",
8772 },
8773 },
8774 },
8775 {
8776 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8777 expectedError: "",
8778 bp: `
8779 java_library {
8780 name: "bcp_lib_restricted",
8781 srcs: ["lib1/src/*.java"],
8782 apex_available: ["myapex"],
8783 permitted_packages: ["foo.bar"],
8784 sdk_version: "none",
8785 min_sdk_version: "29",
8786 system_modules: "none",
8787 }
8788 java_library {
8789 name: "bcp_lib_unrestricted",
8790 srcs: ["lib2/src/*.java"],
8791 apex_available: ["myapex"],
8792 permitted_packages: ["foo.bar", "bar.baz"],
8793 sdk_version: "none",
8794 min_sdk_version: "29",
8795 system_modules: "none",
8796 }
8797 apex {
8798 name: "myapex",
8799 key: "myapex.key",
8800 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8801 updatable: true,
8802 min_sdk_version: "29",
8803 }
8804 `,
8805 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8806 bcpPermittedPackages: map[string][]string{
8807 "bcp_lib1_non_updateable": []string{
8808 "foo.bar",
8809 },
8810 // 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 +01008811 },
8812 },
8813 }
8814 for _, tc := range testcases {
8815 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008816 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8817 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008818 })
8819 }
8820}
8821
Jiyong Park62304bb2020-04-13 16:19:48 +09008822func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008823 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008824 apex {
8825 name: "myapex",
8826 key: "myapex.key",
8827 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008828 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008829 }
8830
8831 apex_key {
8832 name: "myapex.key",
8833 public_key: "testkey.avbpubkey",
8834 private_key: "testkey.pem",
8835 }
8836
8837 cc_library {
8838 name: "mylib",
8839 srcs: ["mylib.cpp"],
8840 system_shared_libs: [],
8841 stl: "none",
8842 stubs: {
8843 versions: ["1"],
8844 },
8845 apex_available: ["myapex"],
8846 }
8847
8848 cc_library {
8849 name: "myprivlib",
8850 srcs: ["mylib.cpp"],
8851 system_shared_libs: [],
8852 stl: "none",
8853 apex_available: ["myapex"],
8854 }
8855
8856
8857 cc_test {
8858 name: "mytest",
8859 gtest: false,
8860 srcs: ["mylib.cpp"],
8861 system_shared_libs: [],
8862 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008863 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008864 test_for: ["myapex"]
8865 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008866
8867 cc_library {
8868 name: "mytestlib",
8869 srcs: ["mylib.cpp"],
8870 system_shared_libs: [],
8871 shared_libs: ["mylib", "myprivlib"],
8872 stl: "none",
8873 test_for: ["myapex"],
8874 }
8875
8876 cc_benchmark {
8877 name: "mybench",
8878 srcs: ["mylib.cpp"],
8879 system_shared_libs: [],
8880 shared_libs: ["mylib", "myprivlib"],
8881 stl: "none",
8882 test_for: ["myapex"],
8883 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008884 `)
8885
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008886 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008887 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008888 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8889 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8890 }
8891
8892 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008893 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008894 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8895 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8896 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8897}
Jiyong Park46a512f2020-12-04 18:02:13 +09008898
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008899func TestIndirectTestFor(t *testing.T) {
8900 ctx := testApex(t, `
8901 apex {
8902 name: "myapex",
8903 key: "myapex.key",
8904 native_shared_libs: ["mylib", "myprivlib"],
8905 updatable: false,
8906 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008907
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008908 apex_key {
8909 name: "myapex.key",
8910 public_key: "testkey.avbpubkey",
8911 private_key: "testkey.pem",
8912 }
8913
8914 cc_library {
8915 name: "mylib",
8916 srcs: ["mylib.cpp"],
8917 system_shared_libs: [],
8918 stl: "none",
8919 stubs: {
8920 versions: ["1"],
8921 },
8922 apex_available: ["myapex"],
8923 }
8924
8925 cc_library {
8926 name: "myprivlib",
8927 srcs: ["mylib.cpp"],
8928 system_shared_libs: [],
8929 stl: "none",
8930 shared_libs: ["mylib"],
8931 apex_available: ["myapex"],
8932 }
8933
8934 cc_library {
8935 name: "mytestlib",
8936 srcs: ["mylib.cpp"],
8937 system_shared_libs: [],
8938 shared_libs: ["myprivlib"],
8939 stl: "none",
8940 test_for: ["myapex"],
8941 }
8942 `)
8943
8944 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008945 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008946 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8947 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8948 }
8949
8950 // The platform variant of mytestlib links to the platform variant of the
8951 // internal myprivlib.
8952 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8953
8954 // The platform variant of myprivlib links to the platform variant of mylib
8955 // and bypasses its stubs.
8956 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 +09008957}
8958
Martin Stjernholmec009002021-03-27 15:18:31 +00008959func TestTestForForLibInOtherApex(t *testing.T) {
8960 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8961 _ = testApex(t, `
8962 apex {
8963 name: "com.android.art",
8964 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008965 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008966 updatable: false,
8967 }
8968
8969 apex {
8970 name: "com.android.art.debug",
8971 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008972 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008973 updatable: false,
8974 }
8975
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981
8982 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008983 name: "libnativebridge",
8984 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008985 system_shared_libs: [],
8986 stl: "none",
8987 stubs: {
8988 versions: ["1"],
8989 },
8990 apex_available: ["com.android.art", "com.android.art.debug"],
8991 }
8992
8993 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008994 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008995 srcs: ["mylib.cpp"],
8996 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008997 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008998 stl: "none",
8999 apex_available: ["com.android.art.debug"],
9000 test_for: ["com.android.art"],
9001 }
9002 `,
9003 android.MockFS{
9004 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9005 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9006 }.AddToFixture())
9007}
9008
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009009// TODO(jungjw): Move this to proptools
9010func intPtr(i int) *int {
9011 return &i
9012}
9013
9014func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009015 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009016 apex_set {
9017 name: "myapex",
9018 set: "myapex.apks",
9019 filename: "foo_v2.apex",
9020 overrides: ["foo"],
9021 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009022 `,
9023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9024 variables.Platform_sdk_version = intPtr(30)
9025 }),
9026 android.FixtureModifyConfig(func(config android.Config) {
9027 config.Targets[android.Android] = []android.Target{
9028 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9029 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9030 }
9031 }),
9032 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033
Paul Duffin24704672021-04-06 16:09:30 +01009034 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009035
9036 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009037 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009038 actual := extractedApex.Args["abis"]
9039 expected := "ARMEABI_V7A,ARM64_V8A"
9040 if actual != expected {
9041 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9042 }
9043 actual = extractedApex.Args["sdk-version"]
9044 expected = "30"
9045 if actual != expected {
9046 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9047 }
9048
Paul Duffin6717d882021-06-15 19:09:41 +01009049 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009050 a := m.Module().(*ApexSet)
9051 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009052 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009053 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9054 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9055 }
9056}
9057
Anton Hansson805e0a52022-11-25 14:06:46 +00009058func TestApexSet_NativeBridge(t *testing.T) {
9059 ctx := testApex(t, `
9060 apex_set {
9061 name: "myapex",
9062 set: "myapex.apks",
9063 filename: "foo_v2.apex",
9064 overrides: ["foo"],
9065 }
9066 `,
9067 android.FixtureModifyConfig(func(config android.Config) {
9068 config.Targets[android.Android] = []android.Target{
9069 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9070 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9071 }
9072 }),
9073 )
9074
9075 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9076
9077 // Check extract_apks tool parameters. No native bridge arch expected
9078 extractedApex := m.Output("extracted/myapex.apks")
9079 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9080}
9081
Jiyong Park7d95a512020-05-10 15:16:24 +09009082func TestNoStaticLinkingToStubsLib(t *testing.T) {
9083 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9084 apex {
9085 name: "myapex",
9086 key: "myapex.key",
9087 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009088 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009089 }
9090
9091 apex_key {
9092 name: "myapex.key",
9093 public_key: "testkey.avbpubkey",
9094 private_key: "testkey.pem",
9095 }
9096
9097 cc_library {
9098 name: "mylib",
9099 srcs: ["mylib.cpp"],
9100 static_libs: ["otherlib"],
9101 system_shared_libs: [],
9102 stl: "none",
9103 apex_available: [ "myapex" ],
9104 }
9105
9106 cc_library {
9107 name: "otherlib",
9108 srcs: ["mylib.cpp"],
9109 system_shared_libs: [],
9110 stl: "none",
9111 stubs: {
9112 versions: ["1", "2", "3"],
9113 },
9114 apex_available: [ "myapex" ],
9115 }
9116 `)
9117}
9118
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009119func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009120 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009121 apex {
9122 name: "myapex",
9123 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009124 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009125 custom_sign_tool: "sign_myapex",
9126 }
9127
9128 apex_key {
9129 name: "myapex.key",
9130 public_key: "testkey.avbpubkey",
9131 private_key: "testkey.pem",
9132 }
9133 `)
9134
Jooyung Han286957d2023-10-30 16:17:56 +09009135 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009136 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009137 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 +09009138}
9139
9140func TestApexKeysTxtOverrides(t *testing.T) {
9141 ctx := testApex(t, `
9142 apex {
9143 name: "myapex",
9144 key: "myapex.key",
9145 updatable: false,
9146 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009147 }
9148
9149 apex_key {
9150 name: "myapex.key",
9151 public_key: "testkey.avbpubkey",
9152 private_key: "testkey.pem",
9153 }
9154
9155 prebuilt_apex {
9156 name: "myapex",
9157 prefer: true,
9158 arch: {
9159 arm64: {
9160 src: "myapex-arm64.apex",
9161 },
9162 arm: {
9163 src: "myapex-arm.apex",
9164 },
9165 },
9166 }
9167
9168 apex_set {
9169 name: "myapex_set",
9170 set: "myapex.apks",
9171 filename: "myapex_set.apex",
9172 overrides: ["myapex"],
9173 }
9174 `)
9175
Colin Crossf61d03d2023-11-02 16:56:39 -07009176 content := android.ContentFromFileRuleForTests(t, ctx,
9177 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009178 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"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07009179 content = android.ContentFromFileRuleForTests(t, ctx,
9180 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009181 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 +09009182}
9183
Jooyung Han938b5932020-06-20 12:47:47 +09009184func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009185 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009186 apex {
9187 name: "myapex",
9188 key: "myapex.key",
9189 apps: ["app"],
9190 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009191 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009192 }
9193
9194 apex_key {
9195 name: "myapex.key",
9196 public_key: "testkey.avbpubkey",
9197 private_key: "testkey.pem",
9198 }
9199
9200 android_app {
9201 name: "app",
9202 srcs: ["foo/bar/MyClass.java"],
9203 package_name: "foo",
9204 sdk_version: "none",
9205 system_modules: "none",
9206 apex_available: [ "myapex" ],
9207 }
9208 `, withFiles(map[string][]byte{
9209 "sub/Android.bp": []byte(`
9210 override_apex {
9211 name: "override_myapex",
9212 base: "myapex",
9213 apps: ["override_app"],
9214 allowed_files: ":allowed",
9215 }
9216 // Overridable "path" property should be referenced indirectly
9217 filegroup {
9218 name: "allowed",
9219 srcs: ["allowed.txt"],
9220 }
9221 override_android_app {
9222 name: "override_app",
9223 base: "app",
9224 package_name: "bar",
9225 }
9226 `),
9227 }))
9228
Jooyung Hana0503a52023-08-23 13:12:50 +09009229 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009230 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9231 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9232 }
9233
Jooyung Hana0503a52023-08-23 13:12:50 +09009234 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009235 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9236 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9237 }
9238}
9239
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009240func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009241 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009242 apex {
9243 name: "myapex",
9244 key: "myapex.key",
9245 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009246 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009247 }
9248
9249 apex_key {
9250 name: "myapex.key",
9251 public_key: "testkey.avbpubkey",
9252 private_key: "testkey.pem",
9253 }
9254
9255 cc_library {
9256 name: "mylib",
9257 srcs: ["mylib.cpp"],
9258 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009259 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009260 },
9261 apex_available: ["myapex"],
9262 }
9263
9264 cc_prebuilt_library_shared {
9265 name: "mylib",
9266 prefer: false,
9267 srcs: ["prebuilt.so"],
9268 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009269 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009270 },
9271 apex_available: ["myapex"],
9272 }
9273 `)
9274}
9275
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009276func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009277 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009278 apex {
9279 name: "myapex",
9280 key: "myapex.key",
9281 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009282 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009283 }
9284 apex_key {
9285 name: "myapex.key",
9286 public_key: "testkey.avbpubkey",
9287 private_key: "testkey.pem",
9288 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009289 `,
9290 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9291 variables.CompressedApex = proptools.BoolPtr(true)
9292 }),
9293 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009294
Jooyung Hana0503a52023-08-23 13:12:50 +09009295 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009296 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9297
Jooyung Hana0503a52023-08-23 13:12:50 +09009298 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009299 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9300
9301 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009302 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009303 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9304
9305 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009306 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009307 var builder strings.Builder
9308 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9309 androidMk := builder.String()
9310 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9311}
9312
Martin Stjernholm2856c662020-12-02 15:03:42 +00009313func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009314 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009315 apex {
9316 name: "myapex",
9317 key: "myapex.key",
9318 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009319 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009320 }
9321
9322 apex_key {
9323 name: "myapex.key",
9324 public_key: "testkey.avbpubkey",
9325 private_key: "testkey.pem",
9326 }
9327
9328 cc_library {
9329 name: "mylib",
9330 srcs: ["mylib.cpp"],
9331 apex_available: ["myapex"],
9332 shared_libs: ["otherlib"],
9333 system_shared_libs: [],
9334 }
9335
9336 cc_library {
9337 name: "otherlib",
9338 srcs: ["mylib.cpp"],
9339 stubs: {
9340 versions: ["current"],
9341 },
9342 }
9343
9344 cc_prebuilt_library_shared {
9345 name: "otherlib",
9346 prefer: true,
9347 srcs: ["prebuilt.so"],
9348 stubs: {
9349 versions: ["current"],
9350 },
9351 }
9352 `)
9353
Jooyung Hana0503a52023-08-23 13:12:50 +09009354 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009355 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009356 var builder strings.Builder
9357 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9358 androidMk := builder.String()
9359
9360 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9361 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009362 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009363}
9364
Jiyong Parke3867542020-12-03 17:28:25 +09009365func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009366 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009367 apex {
9368 name: "myapex",
9369 key: "myapex.key",
9370 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009371 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009372 }
9373
9374 apex_key {
9375 name: "myapex.key",
9376 public_key: "testkey.avbpubkey",
9377 private_key: "testkey.pem",
9378 }
9379
9380 cc_library {
9381 name: "mylib",
9382 srcs: ["mylib.cpp"],
9383 system_shared_libs: [],
9384 stl: "none",
9385 apex_available: ["myapex"],
9386 shared_libs: ["mylib2"],
9387 target: {
9388 apex: {
9389 exclude_shared_libs: ["mylib2"],
9390 },
9391 },
9392 }
9393
9394 cc_library {
9395 name: "mylib2",
9396 srcs: ["mylib.cpp"],
9397 system_shared_libs: [],
9398 stl: "none",
9399 }
9400 `)
9401
9402 // Check if mylib is linked to mylib2 for the non-apex target
9403 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9404 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9405
9406 // Make sure that the link doesn't occur for the apex target
9407 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9408 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9409
9410 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009411 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009412 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9413}
9414
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009415func TestPrebuiltStubLibDep(t *testing.T) {
9416 bpBase := `
9417 apex {
9418 name: "myapex",
9419 key: "myapex.key",
9420 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009421 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009422 }
9423 apex_key {
9424 name: "myapex.key",
9425 public_key: "testkey.avbpubkey",
9426 private_key: "testkey.pem",
9427 }
9428 cc_library {
9429 name: "mylib",
9430 srcs: ["mylib.cpp"],
9431 apex_available: ["myapex"],
9432 shared_libs: ["stublib"],
9433 system_shared_libs: [],
9434 }
9435 apex {
9436 name: "otherapex",
9437 enabled: %s,
9438 key: "myapex.key",
9439 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009440 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009441 }
9442 `
9443
9444 stublibSourceBp := `
9445 cc_library {
9446 name: "stublib",
9447 srcs: ["mylib.cpp"],
9448 apex_available: ["otherapex"],
9449 system_shared_libs: [],
9450 stl: "none",
9451 stubs: {
9452 versions: ["1"],
9453 },
9454 }
9455 `
9456
9457 stublibPrebuiltBp := `
9458 cc_prebuilt_library_shared {
9459 name: "stublib",
9460 srcs: ["prebuilt.so"],
9461 apex_available: ["otherapex"],
9462 stubs: {
9463 versions: ["1"],
9464 },
9465 %s
9466 }
9467 `
9468
9469 tests := []struct {
9470 name string
9471 stublibBp string
9472 usePrebuilt bool
9473 modNames []string // Modules to collect AndroidMkEntries for
9474 otherApexEnabled []string
9475 }{
9476 {
9477 name: "only_source",
9478 stublibBp: stublibSourceBp,
9479 usePrebuilt: false,
9480 modNames: []string{"stublib"},
9481 otherApexEnabled: []string{"true", "false"},
9482 },
9483 {
9484 name: "source_preferred",
9485 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9486 usePrebuilt: false,
9487 modNames: []string{"stublib", "prebuilt_stublib"},
9488 otherApexEnabled: []string{"true", "false"},
9489 },
9490 {
9491 name: "prebuilt_preferred",
9492 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9493 usePrebuilt: true,
9494 modNames: []string{"stublib", "prebuilt_stublib"},
9495 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9496 },
9497 {
9498 name: "only_prebuilt",
9499 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9500 usePrebuilt: true,
9501 modNames: []string{"stublib"},
9502 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9503 },
9504 }
9505
9506 for _, test := range tests {
9507 t.Run(test.name, func(t *testing.T) {
9508 for _, otherApexEnabled := range test.otherApexEnabled {
9509 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009510 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009511
9512 type modAndMkEntries struct {
9513 mod *cc.Module
9514 mkEntries android.AndroidMkEntries
9515 }
9516 entries := []*modAndMkEntries{}
9517
9518 // Gather shared lib modules that are installable
9519 for _, modName := range test.modNames {
9520 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9521 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9522 continue
9523 }
9524 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009525 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009526 continue
9527 }
Colin Crossaa255532020-07-03 13:18:24 -07009528 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009529 if ent.Disabled {
9530 continue
9531 }
9532 entries = append(entries, &modAndMkEntries{
9533 mod: mod,
9534 mkEntries: ent,
9535 })
9536 }
9537 }
9538 }
9539
9540 var entry *modAndMkEntries = nil
9541 for _, ent := range entries {
9542 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9543 if entry != nil {
9544 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9545 } else {
9546 entry = ent
9547 }
9548 }
9549 }
9550
9551 if entry == nil {
9552 t.Errorf("AndroidMk entry for \"stublib\" missing")
9553 } else {
9554 isPrebuilt := entry.mod.Prebuilt() != nil
9555 if isPrebuilt != test.usePrebuilt {
9556 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9557 }
9558 if !entry.mod.IsStubs() {
9559 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9560 }
9561 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9562 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9563 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009564 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009565 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009566 if !android.InList(expected, cflags) {
9567 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9568 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009569 }
9570 })
9571 }
9572 })
9573 }
9574}
9575
Colin Crossc33e5212021-05-25 18:16:02 -07009576func TestApexJavaCoverage(t *testing.T) {
9577 bp := `
9578 apex {
9579 name: "myapex",
9580 key: "myapex.key",
9581 java_libs: ["mylib"],
9582 bootclasspath_fragments: ["mybootclasspathfragment"],
9583 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9584 updatable: false,
9585 }
9586
9587 apex_key {
9588 name: "myapex.key",
9589 public_key: "testkey.avbpubkey",
9590 private_key: "testkey.pem",
9591 }
9592
9593 java_library {
9594 name: "mylib",
9595 srcs: ["mylib.java"],
9596 apex_available: ["myapex"],
9597 compile_dex: true,
9598 }
9599
9600 bootclasspath_fragment {
9601 name: "mybootclasspathfragment",
9602 contents: ["mybootclasspathlib"],
9603 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009604 hidden_api: {
9605 split_packages: ["*"],
9606 },
Colin Crossc33e5212021-05-25 18:16:02 -07009607 }
9608
9609 java_library {
9610 name: "mybootclasspathlib",
9611 srcs: ["mybootclasspathlib.java"],
9612 apex_available: ["myapex"],
9613 compile_dex: true,
9614 }
9615
9616 systemserverclasspath_fragment {
9617 name: "mysystemserverclasspathfragment",
9618 contents: ["mysystemserverclasspathlib"],
9619 apex_available: ["myapex"],
9620 }
9621
9622 java_library {
9623 name: "mysystemserverclasspathlib",
9624 srcs: ["mysystemserverclasspathlib.java"],
9625 apex_available: ["myapex"],
9626 compile_dex: true,
9627 }
9628 `
9629
9630 result := android.GroupFixturePreparers(
9631 PrepareForTestWithApexBuildComponents,
9632 prepareForTestWithMyapex,
9633 java.PrepareForTestWithJavaDefaultModules,
9634 android.PrepareForTestWithAndroidBuildComponents,
9635 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009636 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9637 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009638 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009639 ).RunTest(t)
9640
9641 // Make sure jacoco ran on both mylib and mybootclasspathlib
9642 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9643 t.Errorf("Failed to find jacoco rule for mylib")
9644 }
9645 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9646 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9647 }
9648 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9649 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9650 }
9651}
9652
Jiyong Park192600a2021-08-03 07:52:17 +00009653func TestProhibitStaticExecutable(t *testing.T) {
9654 testApexError(t, `executable mybin is static`, `
9655 apex {
9656 name: "myapex",
9657 key: "myapex.key",
9658 binaries: ["mybin"],
9659 min_sdk_version: "29",
9660 }
9661
9662 apex_key {
9663 name: "myapex.key",
9664 public_key: "testkey.avbpubkey",
9665 private_key: "testkey.pem",
9666 }
9667
9668 cc_binary {
9669 name: "mybin",
9670 srcs: ["mylib.cpp"],
9671 relative_install_path: "foo/bar",
9672 static_executable: true,
9673 system_shared_libs: [],
9674 stl: "none",
9675 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009676 min_sdk_version: "29",
9677 }
9678 `)
9679
9680 testApexError(t, `executable mybin.rust is static`, `
9681 apex {
9682 name: "myapex",
9683 key: "myapex.key",
9684 binaries: ["mybin.rust"],
9685 min_sdk_version: "29",
9686 }
9687
9688 apex_key {
9689 name: "myapex.key",
9690 public_key: "testkey.avbpubkey",
9691 private_key: "testkey.pem",
9692 }
9693
9694 rust_binary {
9695 name: "mybin.rust",
9696 srcs: ["foo.rs"],
9697 static_executable: true,
9698 apex_available: ["myapex"],
9699 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009700 }
9701 `)
9702}
9703
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009704func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9705 ctx := testApex(t, `
9706 apex {
9707 name: "myapex",
9708 key: "myapex.key",
9709 updatable: false,
9710 java_libs: ["foo"],
9711 }
9712
9713 apex_key {
9714 name: "myapex.key",
9715 public_key: "testkey.avbpubkey",
9716 private_key: "testkey.pem",
9717 }
9718
9719 java_library {
9720 name: "foo",
9721 srcs: ["foo.java"],
9722 apex_available: ["myapex"],
9723 installable: true,
9724 }
9725 `,
9726 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9727 )
9728
Jooyung Hana0503a52023-08-23 13:12:50 +09009729 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009730 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9731 var builder strings.Builder
9732 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9733 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009734 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 +00009735}
9736
9737func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9738 ctx := testApex(t, `
9739 prebuilt_apex {
9740 name: "myapex",
9741 arch: {
9742 arm64: {
9743 src: "myapex-arm64.apex",
9744 },
9745 arm: {
9746 src: "myapex-arm.apex",
9747 },
9748 },
9749 exported_java_libs: ["foo"],
9750 }
9751
9752 java_import {
9753 name: "foo",
9754 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009755 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009756 }
9757 `,
9758 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9759 )
9760
9761 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9762 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9763 mainModuleEntries := entriesList[0]
9764 android.AssertArrayString(t,
9765 "LOCAL_REQUIRED_MODULES",
9766 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9767 []string{
9768 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9769 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9770 })
9771}
9772
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009773func TestAndroidMk_RequiredModules(t *testing.T) {
9774 ctx := testApex(t, `
9775 apex {
9776 name: "myapex",
9777 key: "myapex.key",
9778 updatable: false,
9779 java_libs: ["foo"],
9780 required: ["otherapex"],
9781 }
9782
9783 apex {
9784 name: "otherapex",
9785 key: "myapex.key",
9786 updatable: false,
9787 java_libs: ["foo"],
9788 required: ["otherapex"],
9789 }
9790
9791 apex_key {
9792 name: "myapex.key",
9793 public_key: "testkey.avbpubkey",
9794 private_key: "testkey.pem",
9795 }
9796
9797 java_library {
9798 name: "foo",
9799 srcs: ["foo.java"],
9800 apex_available: ["myapex", "otherapex"],
9801 installable: true,
9802 }
9803 `)
9804
Jooyung Hana0503a52023-08-23 13:12:50 +09009805 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009806 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9807 var builder strings.Builder
9808 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9809 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009810 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009811}
9812
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009813func TestAndroidMk_RequiredDeps(t *testing.T) {
9814 ctx := testApex(t, `
9815 apex {
9816 name: "myapex",
9817 key: "myapex.key",
9818 updatable: false,
9819 }
9820
9821 apex_key {
9822 name: "myapex.key",
9823 public_key: "testkey.avbpubkey",
9824 private_key: "testkey.pem",
9825 }
9826 `)
9827
Jooyung Hana0503a52023-08-23 13:12:50 +09009828 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009829 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009830 data := android.AndroidMkDataForTest(t, ctx, bundle)
9831 var builder strings.Builder
9832 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9833 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009834 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009835}
9836
Jooyung Hana6d36672022-02-24 13:58:07 +09009837func TestApexOutputFileProducer(t *testing.T) {
9838 for _, tc := range []struct {
9839 name string
9840 ref string
9841 expected_data []string
9842 }{
9843 {
9844 name: "test_using_output",
9845 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009846 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009847 },
9848 {
9849 name: "test_using_apex",
9850 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009851 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009852 },
9853 } {
9854 t.Run(tc.name, func(t *testing.T) {
9855 ctx := testApex(t, `
9856 apex {
9857 name: "myapex",
9858 key: "myapex.key",
9859 compressible: true,
9860 updatable: false,
9861 }
9862
9863 apex_key {
9864 name: "myapex.key",
9865 public_key: "testkey.avbpubkey",
9866 private_key: "testkey.pem",
9867 }
9868
9869 java_test {
9870 name: "`+tc.name+`",
9871 srcs: ["a.java"],
9872 data: ["`+tc.ref+`"],
9873 }
9874 `,
9875 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9876 variables.CompressedApex = proptools.BoolPtr(true)
9877 }))
9878 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9879 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9880 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9881 })
9882 }
9883}
9884
satayev758968a2021-12-06 11:42:40 +00009885func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9886 preparer := android.GroupFixturePreparers(
9887 PrepareForTestWithApexBuildComponents,
9888 prepareForTestWithMyapex,
9889 java.PrepareForTestWithJavaSdkLibraryFiles,
9890 java.PrepareForTestWithJavaDefaultModules,
9891 android.PrepareForTestWithAndroidBuildComponents,
9892 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9893 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9894 )
9895
9896 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9897 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9898 preparer.RunTestWithBp(t, `
9899 apex {
9900 name: "myapex",
9901 key: "myapex.key",
9902 bootclasspath_fragments: ["mybootclasspathfragment"],
9903 min_sdk_version: "30",
9904 updatable: false,
9905 }
9906
9907 apex_key {
9908 name: "myapex.key",
9909 public_key: "testkey.avbpubkey",
9910 private_key: "testkey.pem",
9911 }
9912
9913 bootclasspath_fragment {
9914 name: "mybootclasspathfragment",
9915 contents: ["mybootclasspathlib"],
9916 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009917 hidden_api: {
9918 split_packages: ["*"],
9919 },
satayev758968a2021-12-06 11:42:40 +00009920 }
9921
9922 java_sdk_library {
9923 name: "mybootclasspathlib",
9924 srcs: ["mybootclasspathlib.java"],
9925 apex_available: ["myapex"],
9926 compile_dex: true,
9927 unsafe_ignore_missing_latest_api: true,
9928 min_sdk_version: "31",
9929 static_libs: ["util"],
9930 }
9931
9932 java_library {
9933 name: "util",
9934 srcs: ["a.java"],
9935 apex_available: ["myapex"],
9936 min_sdk_version: "31",
9937 static_libs: ["another_util"],
9938 }
9939
9940 java_library {
9941 name: "another_util",
9942 srcs: ["a.java"],
9943 min_sdk_version: "31",
9944 apex_available: ["myapex"],
9945 }
9946 `)
9947 })
9948
9949 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9950 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9951 preparer.RunTestWithBp(t, `
9952 apex {
9953 name: "myapex",
9954 key: "myapex.key",
9955 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9956 min_sdk_version: "30",
9957 updatable: false,
9958 }
9959
9960 apex_key {
9961 name: "myapex.key",
9962 public_key: "testkey.avbpubkey",
9963 private_key: "testkey.pem",
9964 }
9965
9966 systemserverclasspath_fragment {
9967 name: "mysystemserverclasspathfragment",
9968 contents: ["mysystemserverclasspathlib"],
9969 apex_available: ["myapex"],
9970 }
9971
9972 java_sdk_library {
9973 name: "mysystemserverclasspathlib",
9974 srcs: ["mysystemserverclasspathlib.java"],
9975 apex_available: ["myapex"],
9976 compile_dex: true,
9977 min_sdk_version: "32",
9978 unsafe_ignore_missing_latest_api: true,
9979 static_libs: ["util"],
9980 }
9981
9982 java_library {
9983 name: "util",
9984 srcs: ["a.java"],
9985 apex_available: ["myapex"],
9986 min_sdk_version: "31",
9987 static_libs: ["another_util"],
9988 }
9989
9990 java_library {
9991 name: "another_util",
9992 srcs: ["a.java"],
9993 min_sdk_version: "31",
9994 apex_available: ["myapex"],
9995 }
9996 `)
9997 })
9998
9999 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10000 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10001 RunTestWithBp(t, `
10002 apex {
10003 name: "myapex",
10004 key: "myapex.key",
10005 bootclasspath_fragments: ["mybootclasspathfragment"],
10006 min_sdk_version: "30",
10007 updatable: false,
10008 }
10009
10010 apex_key {
10011 name: "myapex.key",
10012 public_key: "testkey.avbpubkey",
10013 private_key: "testkey.pem",
10014 }
10015
10016 bootclasspath_fragment {
10017 name: "mybootclasspathfragment",
10018 contents: ["mybootclasspathlib"],
10019 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010020 hidden_api: {
10021 split_packages: ["*"],
10022 },
satayev758968a2021-12-06 11:42:40 +000010023 }
10024
10025 java_sdk_library {
10026 name: "mybootclasspathlib",
10027 srcs: ["mybootclasspathlib.java"],
10028 apex_available: ["myapex"],
10029 compile_dex: true,
10030 unsafe_ignore_missing_latest_api: true,
10031 }
10032 `)
10033 })
10034
10035 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10036 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10037 RunTestWithBp(t, `
10038 apex {
10039 name: "myapex",
10040 key: "myapex.key",
10041 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10042 min_sdk_version: "30",
10043 updatable: false,
10044 }
10045
10046 apex_key {
10047 name: "myapex.key",
10048 public_key: "testkey.avbpubkey",
10049 private_key: "testkey.pem",
10050 }
10051
10052 systemserverclasspath_fragment {
10053 name: "mysystemserverclasspathfragment",
10054 contents: ["mysystemserverclasspathlib"],
10055 apex_available: ["myapex"],
10056 }
10057
10058 java_sdk_library {
10059 name: "mysystemserverclasspathlib",
10060 srcs: ["mysystemserverclasspathlib.java"],
10061 apex_available: ["myapex"],
10062 compile_dex: true,
10063 unsafe_ignore_missing_latest_api: true,
10064 }
10065 `)
10066 })
10067}
10068
Jiakai Zhang6decef92022-01-12 17:56:19 +000010069// Verifies that the APEX depends on all the Make modules in the list.
10070func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10071 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10072 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010073 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010074 }
10075}
10076
10077// Verifies that the APEX does not depend on any of the Make modules in the list.
10078func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10079 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10080 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010081 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010082 }
10083}
10084
Cole Faust1021ccd2023-02-26 21:15:25 -080010085// TODO(b/193460475): Re-enable this test
10086//func TestApexStrictUpdtabilityLint(t *testing.T) {
10087// bpTemplate := `
10088// apex {
10089// name: "myapex",
10090// key: "myapex.key",
10091// java_libs: ["myjavalib"],
10092// updatable: %v,
10093// min_sdk_version: "29",
10094// }
10095// apex_key {
10096// name: "myapex.key",
10097// }
10098// java_library {
10099// name: "myjavalib",
10100// srcs: ["MyClass.java"],
10101// apex_available: [ "myapex" ],
10102// lint: {
10103// strict_updatability_linting: %v,
10104// },
10105// sdk_version: "current",
10106// min_sdk_version: "29",
10107// }
10108// `
10109// fs := android.MockFS{
10110// "lint-baseline.xml": nil,
10111// }
10112//
10113// testCases := []struct {
10114// testCaseName string
10115// apexUpdatable bool
10116// javaStrictUpdtabilityLint bool
10117// lintFileExists bool
10118// disallowedFlagExpected bool
10119// }{
10120// {
10121// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10122// apexUpdatable: true,
10123// javaStrictUpdtabilityLint: true,
10124// lintFileExists: false,
10125// disallowedFlagExpected: false,
10126// },
10127// {
10128// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10129// apexUpdatable: false,
10130// javaStrictUpdtabilityLint: false,
10131// lintFileExists: true,
10132// disallowedFlagExpected: false,
10133// },
10134// {
10135// testCaseName: "non-updatable apex respects strict updatability of javalib",
10136// apexUpdatable: false,
10137// javaStrictUpdtabilityLint: true,
10138// lintFileExists: true,
10139// disallowedFlagExpected: true,
10140// },
10141// {
10142// testCaseName: "updatable apex sets strict updatability of javalib to true",
10143// apexUpdatable: true,
10144// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10145// lintFileExists: true,
10146// disallowedFlagExpected: true,
10147// },
10148// }
10149//
10150// for _, testCase := range testCases {
10151// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10152// fixtures := []android.FixturePreparer{}
10153// if testCase.lintFileExists {
10154// fixtures = append(fixtures, fs.AddToFixture())
10155// }
10156//
10157// result := testApex(t, bp, fixtures...)
10158// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10159// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10160// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10161//
10162// if disallowedFlagActual != testCase.disallowedFlagExpected {
10163// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10164// }
10165// }
10166//}
10167//
10168//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10169// bp := `
10170// apex {
10171// name: "myapex",
10172// key: "myapex.key",
10173// java_libs: ["myjavalib"],
10174// updatable: true,
10175// min_sdk_version: "29",
10176// }
10177// apex_key {
10178// name: "myapex.key",
10179// }
10180// java_library {
10181// name: "myjavalib",
10182// srcs: ["MyClass.java"],
10183// apex_available: [ "myapex" ],
10184// sdk_version: "current",
10185// min_sdk_version: "29",
10186// }
10187// `
10188//
10189// testCases := []struct {
10190// testCaseName string
10191// moduleDirectory string
10192// disallowedFlagExpected bool
10193// }{
10194// {
10195// testCaseName: "lintable module defined outside libcore",
10196// moduleDirectory: "",
10197// disallowedFlagExpected: true,
10198// },
10199// {
10200// testCaseName: "lintable module defined in libcore root directory",
10201// moduleDirectory: "libcore/",
10202// disallowedFlagExpected: false,
10203// },
10204// {
10205// testCaseName: "lintable module defined in libcore child directory",
10206// moduleDirectory: "libcore/childdir/",
10207// disallowedFlagExpected: true,
10208// },
10209// }
10210//
10211// for _, testCase := range testCases {
10212// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10213// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10214// result := testApex(t, "", lintFileCreator, bpFileCreator)
10215// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10216// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10217// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10218// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10219//
10220// if disallowedFlagActual != testCase.disallowedFlagExpected {
10221// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10222// }
10223// }
10224//}
10225//
10226//// checks transtive deps of an apex coming from bootclasspath_fragment
10227//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10228// bp := `
10229// apex {
10230// name: "myapex",
10231// key: "myapex.key",
10232// bootclasspath_fragments: ["mybootclasspathfragment"],
10233// updatable: true,
10234// min_sdk_version: "29",
10235// }
10236// apex_key {
10237// name: "myapex.key",
10238// }
10239// bootclasspath_fragment {
10240// name: "mybootclasspathfragment",
10241// contents: ["myjavalib"],
10242// apex_available: ["myapex"],
10243// hidden_api: {
10244// split_packages: ["*"],
10245// },
10246// }
10247// java_library {
10248// name: "myjavalib",
10249// srcs: ["MyClass.java"],
10250// apex_available: [ "myapex" ],
10251// sdk_version: "current",
10252// min_sdk_version: "29",
10253// compile_dex: true,
10254// }
10255// `
10256// fs := android.MockFS{
10257// "lint-baseline.xml": nil,
10258// }
10259//
10260// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10261// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10262// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10263// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10264// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10265// }
10266//}
Spandan Das66773252022-01-15 00:23:18 +000010267
Spandan Das42e89502022-05-06 22:12:55 +000010268// updatable apexes should propagate updatable=true to its apps
10269func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10270 bp := `
10271 apex {
10272 name: "myapex",
10273 key: "myapex.key",
10274 updatable: %v,
10275 apps: [
10276 "myapp",
10277 ],
10278 min_sdk_version: "30",
10279 }
10280 apex_key {
10281 name: "myapex.key",
10282 }
10283 android_app {
10284 name: "myapp",
10285 updatable: %v,
10286 apex_available: [
10287 "myapex",
10288 ],
10289 sdk_version: "current",
10290 min_sdk_version: "30",
10291 }
10292 `
10293 testCases := []struct {
10294 name string
10295 apex_is_updatable_bp bool
10296 app_is_updatable_bp bool
10297 app_is_updatable_expected bool
10298 }{
10299 {
10300 name: "Non-updatable apex respects updatable property of non-updatable app",
10301 apex_is_updatable_bp: false,
10302 app_is_updatable_bp: false,
10303 app_is_updatable_expected: false,
10304 },
10305 {
10306 name: "Non-updatable apex respects updatable property of updatable app",
10307 apex_is_updatable_bp: false,
10308 app_is_updatable_bp: true,
10309 app_is_updatable_expected: true,
10310 },
10311 {
10312 name: "Updatable apex respects updatable property of updatable app",
10313 apex_is_updatable_bp: true,
10314 app_is_updatable_bp: true,
10315 app_is_updatable_expected: true,
10316 },
10317 {
10318 name: "Updatable apex sets updatable=true on non-updatable app",
10319 apex_is_updatable_bp: true,
10320 app_is_updatable_bp: false,
10321 app_is_updatable_expected: true,
10322 },
10323 }
10324 for _, testCase := range testCases {
10325 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10326 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10327 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10328 }
10329}
10330
Kiyoung Kim487689e2022-07-26 09:48:22 +090010331func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10332 bp := `
10333 apex {
10334 name: "myapex",
10335 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010336 native_shared_libs: ["libbaz"],
10337 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010338 min_sdk_version: "29",
10339 }
10340 apex_key {
10341 name: "myapex.key",
10342 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010343 cc_binary {
10344 name: "binfoo",
10345 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010346 apex_available: ["myapex"],
10347 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010348 recovery_available: false,
10349 }
10350 cc_library {
10351 name: "libbar",
10352 srcs: ["libbar.cc"],
10353 stubs: {
10354 symbol_file: "libbar.map.txt",
10355 versions: [
10356 "29",
10357 ],
10358 },
10359 }
10360 cc_library {
10361 name: "libbaz",
10362 srcs: ["libbaz.cc"],
10363 apex_available: ["myapex"],
10364 min_sdk_version: "29",
10365 stubs: {
10366 symbol_file: "libbaz.map.txt",
10367 versions: [
10368 "29",
10369 ],
10370 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010371 }
10372 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010373 name: "libbar",
10374 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010375 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010376 variants: ["apex.29"],
10377 }
10378 cc_api_variant {
10379 name: "libbar",
10380 variant: "apex",
10381 version: "29",
10382 src: "libbar_apex_29.so",
10383 }
10384 cc_api_library {
10385 name: "libbaz",
10386 src: "libbaz_stub.so",
10387 min_sdk_version: "29",
10388 variants: ["apex.29"],
10389 }
10390 cc_api_variant {
10391 name: "libbaz",
10392 variant: "apex",
10393 version: "29",
10394 src: "libbaz_apex_29.so",
10395 }
10396 cc_api_library {
10397 name: "libqux",
10398 src: "libqux_stub.so",
10399 min_sdk_version: "29",
10400 variants: ["apex.29"],
10401 }
10402 cc_api_variant {
10403 name: "libqux",
10404 variant: "apex",
10405 version: "29",
10406 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010407 }
10408 api_imports {
10409 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010410 apex_shared_libs: [
10411 "libbar",
10412 "libbaz",
10413 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010414 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010415 }
10416 `
10417 result := testApex(t, bp)
10418
10419 hasDep := func(m android.Module, wantDep android.Module) bool {
10420 t.Helper()
10421 var found bool
10422 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10423 if dep == wantDep {
10424 found = true
10425 }
10426 })
10427 return found
10428 }
10429
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010430 // Library defines stubs and cc_api_library should be used with cc_api_library
10431 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10432 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10433 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010434
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010435 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10436 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010437
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010438 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10439 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10440 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10441 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10442
10443 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10444 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10445 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10446 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10447 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10448
10449 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10450 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10451 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10452
10453 // cc_api_library defined without original library should be linked with cc_api_library
10454 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10455 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10456 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10457}
10458
10459func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10460 bp := `
10461 apex {
10462 name: "myapex",
10463 key: "myapex.key",
10464 native_shared_libs: ["libbar"],
10465 min_sdk_version: "29",
10466 }
10467 apex_key {
10468 name: "myapex.key",
10469 }
10470 cc_binary {
10471 name: "binfoo",
10472 shared_libs: ["libbar"],
10473 recovery_available: false,
10474 }
10475 cc_library {
10476 name: "libbar",
10477 srcs: ["libbar.cc"],
10478 apex_available: ["myapex"],
10479 min_sdk_version: "29",
10480 stubs: {
10481 symbol_file: "libbar.map.txt",
10482 versions: [
10483 "29",
10484 ],
10485 },
10486 }
10487 cc_api_library {
10488 name: "libbar",
10489 src: "libbar_stub.so",
10490 variants: ["apex.29"],
10491 }
10492 cc_api_variant {
10493 name: "libbar",
10494 variant: "apex",
10495 version: "29",
10496 src: "libbar_apex_29.so",
10497 }
10498 api_imports {
10499 name: "api_imports",
10500 apex_shared_libs: [
10501 "libbar",
10502 ],
10503 }
10504 `
10505
10506 result := testApex(t, bp)
10507
10508 hasDep := func(m android.Module, wantDep android.Module) bool {
10509 t.Helper()
10510 var found bool
10511 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10512 if dep == wantDep {
10513 found = true
10514 }
10515 })
10516 return found
10517 }
10518
10519 // Library defines stubs and cc_api_library should be used with cc_api_library
10520 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10521 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10522 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10523
10524 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10525 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10526
10527 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10528 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10529 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10530 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010531}
Dennis Shend4f5d932023-01-31 20:27:21 +000010532
10533func TestTrimmedApex(t *testing.T) {
10534 bp := `
10535 apex {
10536 name: "myapex",
10537 key: "myapex.key",
10538 native_shared_libs: ["libfoo","libbaz"],
10539 min_sdk_version: "29",
10540 trim_against: "mydcla",
10541 }
10542 apex {
10543 name: "mydcla",
10544 key: "myapex.key",
10545 native_shared_libs: ["libfoo","libbar"],
10546 min_sdk_version: "29",
10547 file_contexts: ":myapex-file_contexts",
10548 dynamic_common_lib_apex: true,
10549 }
10550 apex_key {
10551 name: "myapex.key",
10552 }
10553 cc_library {
10554 name: "libfoo",
10555 shared_libs: ["libc"],
10556 apex_available: ["myapex","mydcla"],
10557 min_sdk_version: "29",
10558 }
10559 cc_library {
10560 name: "libbar",
10561 shared_libs: ["libc"],
10562 apex_available: ["myapex","mydcla"],
10563 min_sdk_version: "29",
10564 }
10565 cc_library {
10566 name: "libbaz",
10567 shared_libs: ["libc"],
10568 apex_available: ["myapex","mydcla"],
10569 min_sdk_version: "29",
10570 }
10571 cc_api_library {
10572 name: "libc",
10573 src: "libc.so",
10574 min_sdk_version: "29",
10575 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010576 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010577 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010578 }
10579 api_imports {
10580 name: "api_imports",
10581 shared_libs: [
10582 "libc",
10583 ],
10584 header_libs: [],
10585 }
10586 `
10587 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010588 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010589 apexRule := module.MaybeRule("apexRule")
10590 if apexRule.Rule == nil {
10591 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10592 }
10593
10594 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010595 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010596 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10597 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10598 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10599 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10600}
Jingwen Chendea7a642023-03-28 11:30:50 +000010601
10602func TestCannedFsConfig(t *testing.T) {
10603 ctx := testApex(t, `
10604 apex {
10605 name: "myapex",
10606 key: "myapex.key",
10607 updatable: false,
10608 }
10609
10610 apex_key {
10611 name: "myapex.key",
10612 public_key: "testkey.avbpubkey",
10613 private_key: "testkey.pem",
10614 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010615 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010616 generateFsRule := mod.Rule("generateFsConfig")
10617 cmd := generateFsRule.RuleParams.Command
10618
10619 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10620}
10621
10622func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10623 ctx := testApex(t, `
10624 apex {
10625 name: "myapex",
10626 key: "myapex.key",
10627 canned_fs_config: "my_config",
10628 updatable: false,
10629 }
10630
10631 apex_key {
10632 name: "myapex.key",
10633 public_key: "testkey.avbpubkey",
10634 private_key: "testkey.pem",
10635 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010636 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010637 generateFsRule := mod.Rule("generateFsConfig")
10638 cmd := generateFsRule.RuleParams.Command
10639
10640 // Ensure that canned_fs_config has "cat my_config" at the end
10641 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10642}
Spandan Das20fce2d2023-04-12 17:21:39 +000010643
10644func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10645 testCases := []struct {
10646 desc string
10647 hasStubs bool
10648 apexAvailable string
10649 expectedError string
10650 }{
10651 {
10652 desc: "non-stub library can have multiple apex_available",
10653 hasStubs: false,
10654 apexAvailable: `["myapex", "otherapex"]`,
10655 },
10656 {
10657 desc: "stub library should not be available to anyapex",
10658 hasStubs: true,
10659 apexAvailable: `["//apex_available:anyapex"]`,
10660 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10661 },
10662 {
10663 desc: "stub library should not be available to multiple apexes",
10664 hasStubs: true,
10665 apexAvailable: `["myapex", "otherapex"]`,
10666 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10667 },
10668 {
10669 desc: "stub library can be available to a core apex and a test apex",
10670 hasStubs: true,
10671 apexAvailable: `["myapex", "test_myapex"]`,
10672 },
10673 }
10674 bpTemplate := `
10675 cc_library {
10676 name: "libfoo",
10677 %v
10678 apex_available: %v,
10679 }
10680 apex {
10681 name: "myapex",
10682 key: "apex.key",
10683 updatable: false,
10684 native_shared_libs: ["libfoo"],
10685 }
10686 apex {
10687 name: "otherapex",
10688 key: "apex.key",
10689 updatable: false,
10690 }
10691 apex_test {
10692 name: "test_myapex",
10693 key: "apex.key",
10694 updatable: false,
10695 native_shared_libs: ["libfoo"],
10696 }
10697 apex_key {
10698 name: "apex.key",
10699 }
10700 `
10701 for _, tc := range testCases {
10702 stubs := ""
10703 if tc.hasStubs {
10704 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10705 }
10706 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10707 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10708 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10709 })
10710 if tc.expectedError == "" {
10711 testApex(t, bp, mockFsFixturePreparer)
10712 } else {
10713 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10714 }
10715 }
10716}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010717
10718func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10719 context := android.GroupFixturePreparers(
10720 android.PrepareForIntegrationTestWithAndroid,
10721 cc.PrepareForIntegrationTestWithCc,
10722 PrepareForTestWithApexBuildComponents,
10723 prepareForTestWithMyapex,
10724 filesystem.PrepareForTestWithFilesystemBuildComponents,
10725 )
10726 result := context.RunTestWithBp(t, `
10727 android_system_image {
10728 name: "myfilesystem",
10729 deps: [
10730 "libfoo",
10731 ],
10732 linker_config_src: "linker.config.json",
10733 }
10734
10735 cc_library {
10736 name: "libfoo",
10737 shared_libs: [
10738 "libbar",
10739 ],
10740 stl: "none",
10741 }
10742
10743 cc_library {
10744 name: "libbar",
10745 stl: "none",
10746 apex_available: ["myapex"],
10747 }
10748
10749 apex {
10750 name: "myapex",
10751 native_shared_libs: ["libbar"],
10752 key: "myapex.key",
10753 updatable: false,
10754 }
10755
10756 apex_key {
10757 name: "myapex.key",
10758 public_key: "testkey.avbpubkey",
10759 private_key: "testkey.pem",
10760 }
10761 `)
10762
10763 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10764 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10765 inputs.Strings(),
10766 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10767}
Yu Liueae7b362023-11-16 17:05:47 -080010768
10769var apex_default_bp = `
10770 apex_key {
10771 name: "myapex.key",
10772 public_key: "testkey.avbpubkey",
10773 private_key: "testkey.pem",
10774 }
10775
10776 filegroup {
10777 name: "myapex.manifest",
10778 srcs: ["apex_manifest.json"],
10779 }
10780
10781 filegroup {
10782 name: "myapex.androidmanifest",
10783 srcs: ["AndroidManifest.xml"],
10784 }
10785`
10786
10787func TestAconfigFilesJavaDeps(t *testing.T) {
10788 ctx := testApex(t, apex_default_bp+`
10789 apex {
10790 name: "myapex",
10791 manifest: ":myapex.manifest",
10792 androidManifest: ":myapex.androidmanifest",
10793 key: "myapex.key",
10794 java_libs: [
10795 "my_java_library_foo",
10796 "my_java_library_bar",
10797 ],
10798 updatable: false,
10799 }
10800
10801 java_library {
10802 name: "my_java_library_foo",
10803 srcs: ["foo/bar/MyClass.java"],
10804 sdk_version: "none",
10805 system_modules: "none",
10806 static_libs: ["my_java_aconfig_library_foo"],
10807 // TODO: remove //apex_available:platform
10808 apex_available: [
10809 "//apex_available:platform",
10810 "myapex",
10811 ],
10812 }
10813
10814 java_library {
10815 name: "my_java_library_bar",
10816 srcs: ["foo/bar/MyClass.java"],
10817 sdk_version: "none",
10818 system_modules: "none",
10819 static_libs: ["my_java_aconfig_library_bar"],
10820 // TODO: remove //apex_available:platform
10821 apex_available: [
10822 "//apex_available:platform",
10823 "myapex",
10824 ],
10825 }
10826
10827 aconfig_declarations {
10828 name: "my_aconfig_declarations_foo",
10829 package: "com.example.package",
10830 container: "myapex",
10831 srcs: ["foo.aconfig"],
10832 }
10833
10834 java_aconfig_library {
10835 name: "my_java_aconfig_library_foo",
10836 aconfig_declarations: "my_aconfig_declarations_foo",
10837 // TODO: remove //apex_available:platform
10838 apex_available: [
10839 "//apex_available:platform",
10840 "myapex",
10841 ],
10842 }
10843
10844 aconfig_declarations {
10845 name: "my_aconfig_declarations_bar",
10846 package: "com.example.package",
10847 container: "myapex",
10848 srcs: ["bar.aconfig"],
10849 }
10850
10851 java_aconfig_library {
10852 name: "my_java_aconfig_library_bar",
10853 aconfig_declarations: "my_aconfig_declarations_bar",
10854 // TODO: remove //apex_available:platform
10855 apex_available: [
10856 "//apex_available:platform",
10857 "myapex",
10858 ],
10859 }
10860 `)
10861
10862 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10863 s := mod.Rule("apexRule").Args["copy_commands"]
10864 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10865 if len(copyCmds) != 5 {
10866 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10867 }
10868
10869 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10870
10871 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10872 s = " " + combineAconfigRule.Args["cache_files"]
10873 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10874 if len(aconfigArgs) != 2 {
10875 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
10876 }
10877 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10878 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
10879
10880 buildParams := combineAconfigRule.BuildParams
10881 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10882 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
10883 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10884}
10885
10886func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10887 ctx := testApex(t, apex_default_bp+`
10888 apex {
10889 name: "myapex",
10890 manifest: ":myapex.manifest",
10891 androidManifest: ":myapex.androidmanifest",
10892 key: "myapex.key",
10893 java_libs: [
10894 "my_java_library_foo",
10895 ],
10896 native_shared_libs: [
10897 "my_cc_library_bar",
10898 ],
10899 binaries: [
10900 "my_cc_binary_baz",
10901 ],
10902 updatable: false,
10903 }
10904
10905 java_library {
10906 name: "my_java_library_foo",
10907 srcs: ["foo/bar/MyClass.java"],
10908 sdk_version: "none",
10909 system_modules: "none",
10910 static_libs: ["my_java_aconfig_library_foo"],
10911 // TODO: remove //apex_available:platform
10912 apex_available: [
10913 "//apex_available:platform",
10914 "myapex",
10915 ],
10916 }
10917
10918 cc_library {
10919 name: "my_cc_library_bar",
10920 srcs: ["foo/bar/MyClass.cc"],
10921 static_libs: ["my_cc_aconfig_library_bar"],
10922 // TODO: remove //apex_available:platform
10923 apex_available: [
10924 "//apex_available:platform",
10925 "myapex",
10926 ],
10927 }
10928
10929 cc_binary {
10930 name: "my_cc_binary_baz",
10931 srcs: ["foo/bar/MyClass.cc"],
10932 static_libs: ["my_cc_aconfig_library_baz"],
10933 // TODO: remove //apex_available:platform
10934 apex_available: [
10935 "//apex_available:platform",
10936 "myapex",
10937 ],
10938 }
10939
10940 aconfig_declarations {
10941 name: "my_aconfig_declarations_foo",
10942 package: "com.example.package",
10943 container: "myapex",
10944 srcs: ["foo.aconfig"],
10945 }
10946
10947 java_aconfig_library {
10948 name: "my_java_aconfig_library_foo",
10949 aconfig_declarations: "my_aconfig_declarations_foo",
10950 // TODO: remove //apex_available:platform
10951 apex_available: [
10952 "//apex_available:platform",
10953 "myapex",
10954 ],
10955 }
10956
10957 aconfig_declarations {
10958 name: "my_aconfig_declarations_bar",
10959 package: "com.example.package",
10960 container: "myapex",
10961 srcs: ["bar.aconfig"],
10962 }
10963
10964 cc_aconfig_library {
10965 name: "my_cc_aconfig_library_bar",
10966 aconfig_declarations: "my_aconfig_declarations_bar",
10967 // TODO: remove //apex_available:platform
10968 apex_available: [
10969 "//apex_available:platform",
10970 "myapex",
10971 ],
10972 }
10973
10974 aconfig_declarations {
10975 name: "my_aconfig_declarations_baz",
10976 package: "com.example.package",
10977 container: "myapex",
10978 srcs: ["baz.aconfig"],
10979 }
10980
10981 cc_aconfig_library {
10982 name: "my_cc_aconfig_library_baz",
10983 aconfig_declarations: "my_aconfig_declarations_baz",
10984 // TODO: remove //apex_available:platform
10985 apex_available: [
10986 "//apex_available:platform",
10987 "myapex",
10988 ],
10989 }
10990
10991 cc_library {
10992 name: "server_configurable_flags",
10993 srcs: ["server_configurable_flags.cc"],
10994 }
10995 `)
10996
10997 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10998 s := mod.Rule("apexRule").Args["copy_commands"]
10999 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11000 if len(copyCmds) != 9 {
11001 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11002 }
11003
11004 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11005
11006 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11007 s = " " + combineAconfigRule.Args["cache_files"]
11008 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11009 if len(aconfigArgs) != 3 {
11010 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11011 }
11012 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11013 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11014 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11015
11016 buildParams := combineAconfigRule.BuildParams
11017 if len(buildParams.Inputs) != 3 {
11018 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11019 }
11020 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11021 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11022 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11023 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11024}
11025
11026func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11027 ctx := testApex(t, apex_default_bp+`
11028 apex {
11029 name: "myapex",
11030 manifest: ":myapex.manifest",
11031 androidManifest: ":myapex.androidmanifest",
11032 key: "myapex.key",
11033 java_libs: [
11034 "my_java_library_foo",
11035 "other_java_library_bar",
11036 ],
11037 updatable: false,
11038 }
11039
11040 java_library {
11041 name: "my_java_library_foo",
11042 srcs: ["foo/bar/MyClass.java"],
11043 sdk_version: "none",
11044 system_modules: "none",
11045 static_libs: ["my_java_aconfig_library_foo"],
11046 // TODO: remove //apex_available:platform
11047 apex_available: [
11048 "//apex_available:platform",
11049 "myapex",
11050 ],
11051 }
11052
11053 java_library {
11054 name: "other_java_library_bar",
11055 srcs: ["foo/bar/MyClass.java"],
11056 sdk_version: "none",
11057 system_modules: "none",
11058 static_libs: ["other_java_aconfig_library_bar"],
11059 // TODO: remove //apex_available:platform
11060 apex_available: [
11061 "//apex_available:platform",
11062 "myapex",
11063 ],
11064 }
11065
11066 aconfig_declarations {
11067 name: "my_aconfig_declarations_foo",
11068 package: "com.example.package",
11069 container: "myapex",
11070 srcs: ["foo.aconfig"],
11071 }
11072
11073 java_aconfig_library {
11074 name: "my_java_aconfig_library_foo",
11075 aconfig_declarations: "my_aconfig_declarations_foo",
11076 // TODO: remove //apex_available:platform
11077 apex_available: [
11078 "//apex_available:platform",
11079 "myapex",
11080 ],
11081 }
11082
11083 aconfig_declarations {
11084 name: "other_aconfig_declarations_bar",
11085 package: "com.example.package",
11086 container: "otherapex",
11087 srcs: ["bar.aconfig"],
11088 }
11089
11090 java_aconfig_library {
11091 name: "other_java_aconfig_library_bar",
11092 aconfig_declarations: "other_aconfig_declarations_bar",
11093 // TODO: remove //apex_available:platform
11094 apex_available: [
11095 "//apex_available:platform",
11096 "myapex",
11097 ],
11098 }
11099 `)
11100
11101 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11102 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11103 s := " " + combineAconfigRule.Args["cache_files"]
11104 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11105 if len(aconfigArgs) != 1 {
11106 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11107 }
11108 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11109
11110 buildParams := combineAconfigRule.BuildParams
11111 if len(buildParams.Inputs) != 1 {
11112 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11113 }
11114 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11115 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11116}
11117
11118func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11119 ctx := testApex(t, apex_default_bp+`
11120 apex {
11121 name: "myapex",
11122 manifest: ":myapex.manifest",
11123 androidManifest: ":myapex.androidmanifest",
11124 key: "myapex.key",
11125 java_libs: [
11126 "my_java_library_foo",
11127 "my_java_library_bar",
11128 ],
11129 updatable: false,
11130 }
11131
11132 java_library {
11133 name: "my_java_library_foo",
11134 srcs: ["foo/bar/MyClass.java"],
11135 sdk_version: "none",
11136 system_modules: "none",
11137 static_libs: ["my_java_aconfig_library_foo"],
11138 // TODO: remove //apex_available:platform
11139 apex_available: [
11140 "//apex_available:platform",
11141 "myapex",
11142 ],
11143 }
11144
11145 java_library {
11146 name: "my_java_library_bar",
11147 srcs: ["foo/bar/MyClass.java"],
11148 sdk_version: "none",
11149 system_modules: "none",
11150 static_libs: ["my_java_aconfig_library_bar"],
11151 // TODO: remove //apex_available:platform
11152 apex_available: [
11153 "//apex_available:platform",
11154 "myapex",
11155 ],
11156 }
11157
11158 aconfig_declarations {
11159 name: "my_aconfig_declarations_foo",
11160 package: "com.example.package",
11161 container: "myapex",
11162 srcs: ["foo.aconfig"],
11163 }
11164
11165 java_aconfig_library {
11166 name: "my_java_aconfig_library_foo",
11167 aconfig_declarations: "my_aconfig_declarations_foo",
11168 // TODO: remove //apex_available:platform
11169 apex_available: [
11170 "//apex_available:platform",
11171 "myapex",
11172 ],
11173 }
11174
11175 java_aconfig_library {
11176 name: "my_java_aconfig_library_bar",
11177 aconfig_declarations: "my_aconfig_declarations_foo",
11178 // TODO: remove //apex_available:platform
11179 apex_available: [
11180 "//apex_available:platform",
11181 "myapex",
11182 ],
11183 }
11184 `)
11185
11186 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11187 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11188 s := " " + combineAconfigRule.Args["cache_files"]
11189 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11190 if len(aconfigArgs) != 1 {
11191 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11192 }
11193 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11194
11195 buildParams := combineAconfigRule.BuildParams
11196 if len(buildParams.Inputs) != 1 {
11197 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11198 }
11199 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11200 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11201}