blob: ab0c130a9a84a20726d702c837afc763bc64bcee [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Kiyoung Kim487689e2022-07-26 09:48:22 +090029 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090030 "github.com/google/blueprint/proptools"
31
32 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070037 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090038 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090039 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070040 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090041)
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Paul Duffin40b62572021-03-20 11:39:01 +000053func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090054 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010055 android.GroupFixturePreparers(
56 prepareForApexTest,
57 android.GroupFixturePreparers(preparers...),
58 ).
Paul Duffine05480a2021-03-08 15:07:14 +000059 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000060 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090061}
62
Paul Duffin40b62572021-03-20 11:39:01 +000063func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090064 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010065
66 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000067 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010068 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000069 }
Paul Duffin284165a2021-03-29 01:50:31 +010070
71 result := android.GroupFixturePreparers(
72 prepareForApexTest,
73 android.GroupFixturePreparers(preparers...),
74 optionalBpPreparer,
75 ).RunTest(t)
76
Paul Duffine05480a2021-03-08 15:07:14 +000077 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Paul Duffin810f33d2021-03-09 14:12:32 +000080func withFiles(files android.MockFS) android.FixturePreparer {
81 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090082}
83
Paul Duffin810f33d2021-03-09 14:12:32 +000084func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
85 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090086 for k, v := range targets {
87 config.Targets[k] = v
88 }
Paul Duffin810f33d2021-03-09 14:12:32 +000089 })
Jooyung Han344d5432019-08-23 11:17:39 +090090}
91
Jooyung Han35155c42020-02-06 17:33:20 +090092// withNativeBridgeTargets sets configuration with targets including:
93// - X86_64 (primary)
94// - X86 (secondary)
95// - Arm64 on X86_64 (native bridge)
96// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000097var withNativeBridgeEnabled = android.FixtureModifyConfig(
98 func(config android.Config) {
99 config.Targets[android.Android] = []android.Target{
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
108 }
109 },
110)
111
112func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
113 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
114 variables.ManifestPackageNameOverrides = specs
115 })
Jooyung Han35155c42020-02-06 17:33:20 +0900116}
117
Albert Martineefabcf2022-03-21 20:11:16 +0000118func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
119 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
120 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
121 })
122}
123
Paul Duffin810f33d2021-03-09 14:12:32 +0000124var withBinder32bit = android.FixtureModifyProductVariables(
125 func(variables android.FixtureProductVariables) {
126 variables.Binder32bit = proptools.BoolPtr(true)
127 },
128)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900129
Paul Duffin810f33d2021-03-09 14:12:32 +0000130var withUnbundledBuild = android.FixtureModifyProductVariables(
131 func(variables android.FixtureProductVariables) {
132 variables.Unbundled_build = proptools.BoolPtr(true)
133 },
134)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900135
Paul Duffin284165a2021-03-29 01:50:31 +0100136// Legacy preparer used for running tests within the apex package.
137//
138// This includes everything that was needed to run any test in the apex package prior to the
139// introduction of the test fixtures. Tests that are being converted to use fixtures directly
140// rather than through the testApex...() methods should avoid using this and instead use the
141// various preparers directly, using android.GroupFixturePreparers(...) to group them when
142// necessary.
143//
144// deprecated
145var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000146 // General preparers in alphabetical order as test infrastructure will enforce correct
147 // registration order.
148 android.PrepareForTestWithAndroidBuildComponents,
149 bpf.PrepareForTestWithBpf,
150 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100151 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000152 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
153 rust.PrepareForTestWithRustDefaultModules,
154 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800155 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000156
157 PrepareForTestWithApexBuildComponents,
158
159 // Additional apex test specific preparers.
160 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
161 filegroup {
162 name: "myapex-file_contexts",
163 srcs: [
164 "apex/myapex-file_contexts",
165 ],
166 }
167 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000169 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000170 "a.java": nil,
171 "PrebuiltAppFoo.apk": nil,
172 "PrebuiltAppFooPriv.apk": nil,
173 "apex_manifest.json": nil,
174 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000175 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
176 "system/sepolicy/apex/myapex2-file_contexts": nil,
177 "system/sepolicy/apex/otherapex-file_contexts": nil,
178 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700180 "mylib.cpp": nil,
181 "mytest.cpp": nil,
182 "mytest1.cpp": nil,
183 "mytest2.cpp": nil,
184 "mytest3.cpp": nil,
185 "myprebuilt": nil,
186 "my_include": nil,
187 "foo/bar/MyClass.java": nil,
188 "prebuilt.jar": nil,
189 "prebuilt.so": nil,
190 "vendor/foo/devkeys/test.x509.pem": nil,
191 "vendor/foo/devkeys/test.pk8": nil,
192 "testkey.x509.pem": nil,
193 "testkey.pk8": nil,
194 "testkey.override.x509.pem": nil,
195 "testkey.override.pk8": nil,
196 "vendor/foo/devkeys/testkey.avbpubkey": nil,
197 "vendor/foo/devkeys/testkey.pem": nil,
198 "NOTICE": nil,
199 "custom_notice": nil,
200 "custom_notice_for_static_lib": nil,
201 "testkey2.avbpubkey": nil,
202 "testkey2.pem": nil,
203 "myapex-arm64.apex": nil,
204 "myapex-arm.apex": nil,
205 "myapex.apks": nil,
206 "frameworks/base/api/current.txt": nil,
207 "framework/aidl/a.aidl": nil,
208 "dummy.txt": nil,
209 "baz": nil,
210 "bar/baz": nil,
211 "testdata/baz": nil,
212 "AppSet.apks": nil,
213 "foo.rs": nil,
214 "libfoo.jar": nil,
215 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000216 },
217 ),
218
219 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
220 variables.DeviceVndkVersion = proptools.StringPtr("current")
221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900228 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000229 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000230 }),
231)
232
Paul Duffin52bfaa42021-03-23 23:40:12 +0000233var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
234 "system/sepolicy/apex/myapex-file_contexts": nil,
235})
236
Jooyung Han643adc42020-02-27 13:50:06 +0900237// ensure that 'result' equals 'expected'
238func ensureEquals(t *testing.T, result string, expected string) {
239 t.Helper()
240 if result != expected {
241 t.Errorf("%q != %q", expected, result)
242 }
243}
244
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245// ensure that 'result' contains 'expected'
246func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900247 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900248 if !strings.Contains(result, expected) {
249 t.Errorf("%q is not found in %q", expected, result)
250 }
251}
252
Liz Kammer5bd365f2020-05-27 15:15:11 -0700253// ensure that 'result' contains 'expected' exactly one time
254func ensureContainsOnce(t *testing.T, result string, expected string) {
255 t.Helper()
256 count := strings.Count(result, expected)
257 if count != 1 {
258 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
259 }
260}
261
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262// ensures that 'result' does not contain 'notExpected'
263func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265 if strings.Contains(result, notExpected) {
266 t.Errorf("%q is found in %q", notExpected, result)
267 }
268}
269
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700270func ensureMatches(t *testing.T, result string, expectedRex string) {
271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900282 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283 if !android.InList(expected, result) {
284 t.Errorf("%q is not found in %v", expected, result)
285 }
286}
287
288func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if android.InList(notExpected, result) {
291 t.Errorf("%q is found in %v", notExpected, result)
292 }
293}
294
Jooyung Hane1633032019-08-01 17:41:43 +0900295func ensureListEmpty(t *testing.T, result []string) {
296 t.Helper()
297 if len(result) > 0 {
298 t.Errorf("%q is expected to be empty", result)
299 }
300}
301
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000302func ensureListNotEmpty(t *testing.T, result []string) {
303 t.Helper()
304 if len(result) == 0 {
305 t.Errorf("%q is expected to be not empty", result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// Minimal test
310func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800311 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900312 apex_defaults {
313 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900314 manifest: ":myapex.manifest",
315 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900318 native_shared_libs: [
319 "mylib",
320 "libfoo.ffi",
321 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900322 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800323 multilib: {
324 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800326 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900327 },
Jiyong Park77acec62020-06-01 21:39:15 +0900328 java_libs: [
329 "myjar",
330 "myjar_dex",
331 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000332 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333 }
334
Jiyong Park30ca9372019-02-07 16:27:23 +0900335 apex {
336 name: "myapex",
337 defaults: ["myapex-defaults"],
338 }
339
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 apex_key {
341 name: "myapex.key",
342 public_key: "testkey.avbpubkey",
343 private_key: "testkey.pem",
344 }
345
Jiyong Park809bb722019-02-13 21:33:49 +0900346 filegroup {
347 name: "myapex.manifest",
348 srcs: ["apex_manifest.json"],
349 }
350
351 filegroup {
352 name: "myapex.androidmanifest",
353 srcs: ["AndroidManifest.xml"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 cc_library {
357 name: "mylib",
358 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900359 shared_libs: [
360 "mylib2",
361 "libbar.ffi",
362 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 system_shared_libs: [],
364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000365 // TODO: remove //apex_available:platform
366 apex_available: [
367 "//apex_available:platform",
368 "myapex",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 }
371
Alex Light3d673592019-01-18 14:37:31 -0800372 cc_binary {
373 name: "foo",
374 srcs: ["mylib.cpp"],
375 compile_multilib: "both",
376 multilib: {
377 lib32: {
378 suffix: "32",
379 },
380 lib64: {
381 suffix: "64",
382 },
383 },
384 symlinks: ["foo_link_"],
385 symlink_preferred_arch: true,
386 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800387 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 apex_available: [ "myapex", "com.android.gki.*" ],
389 }
390
Jiyong Park99644e92020-11-17 22:21:02 +0900391 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000392 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900393 srcs: ["foo.rs"],
394 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400395 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900396 apex_available: ["myapex"],
397 }
398
399 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000400 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900401 srcs: ["foo.rs"],
402 crate_name: "foo",
403 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900404 shared_libs: ["libfoo.shared_from_rust"],
405 }
406
407 cc_library_shared {
408 name: "libfoo.shared_from_rust",
409 srcs: ["mylib.cpp"],
410 system_shared_libs: [],
411 stl: "none",
412 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900413 }
414
415 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000416 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900417 srcs: ["foo.rs"],
418 crate_name: "foo",
419 apex_available: ["myapex"],
420 }
421
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900422 rust_ffi_shared {
423 name: "libfoo.ffi",
424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
429 rust_ffi_shared {
430 name: "libbar.ffi",
431 srcs: ["foo.rs"],
432 crate_name: "bar",
433 apex_available: ["myapex"],
434 }
435
Yifan Hongd22a84a2020-07-28 17:37:46 -0700436 apex {
437 name: "com.android.gki.fake",
438 binaries: ["foo"],
439 key: "myapex.key",
440 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000441 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
465 }
466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Jooyung Hana0503a52023-08-23 13:12:50 +0900600 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
603 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
604 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100605
Jooyung Hana0503a52023-08-23 13:12:50 +0900606 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100607 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100608 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
609 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
610 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800611}
612
Jooyung Hanf21c7972019-12-16 22:32:06 +0900613func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800614 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 apex_defaults {
616 name: "myapex-defaults",
617 key: "myapex.key",
618 prebuilts: ["myetc"],
619 native_shared_libs: ["mylib"],
620 java_libs: ["myjar"],
621 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900622 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800623 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000624 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900625 }
626
627 prebuilt_etc {
628 name: "myetc",
629 src: "myprebuilt",
630 }
631
632 apex {
633 name: "myapex",
634 defaults: ["myapex-defaults"],
635 }
636
637 apex_key {
638 name: "myapex.key",
639 public_key: "testkey.avbpubkey",
640 private_key: "testkey.pem",
641 }
642
643 cc_library {
644 name: "mylib",
645 system_shared_libs: [],
646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900648 }
649
650 java_library {
651 name: "myjar",
652 srcs: ["foo/bar/MyClass.java"],
653 sdk_version: "none",
654 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000655 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900656 }
657
658 android_app {
659 name: "AppFoo",
660 srcs: ["foo/bar/MyClass.java"],
661 sdk_version: "none",
662 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000663 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900664 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900665
666 runtime_resource_overlay {
667 name: "rro",
668 theme: "blue",
669 }
670
markchien2f59ec92020-09-02 16:23:38 +0800671 bpf {
672 name: "bpf",
673 srcs: ["bpf.c", "bpf2.c"],
674 }
675
Ken Chenfad7f9d2021-11-10 22:02:57 +0800676 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800677 name: "netdTest",
678 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800679 sub_dir: "netd",
680 }
681
Jooyung Hanf21c7972019-12-16 22:32:06 +0900682 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900683 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 "etc/myetc",
685 "javalib/myjar.jar",
686 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000687 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900688 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800689 "etc/bpf/bpf.o",
690 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800691 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900692 })
693}
694
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800696 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697 apex {
698 name: "myapex",
699 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000700 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900701 }
702
703 apex_key {
704 name: "myapex.key",
705 public_key: "testkey.avbpubkey",
706 private_key: "testkey.pem",
707 }
708 `)
709
Jooyung Hana0503a52023-08-23 13:12:50 +0900710 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900711 args := module.Rule("apexRule").Args
712 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
713 t.Error("manifest should be apex_manifest.pb, but " + manifest)
714 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900715}
716
Liz Kammer4854a7d2021-05-27 14:28:27 -0400717func TestApexManifestMinSdkVersion(t *testing.T) {
718 ctx := testApex(t, `
719 apex_defaults {
720 name: "my_defaults",
721 key: "myapex.key",
722 product_specific: true,
723 file_contexts: ":my-file-contexts",
724 updatable: false,
725 }
726 apex {
727 name: "myapex_30",
728 min_sdk_version: "30",
729 defaults: ["my_defaults"],
730 }
731
732 apex {
733 name: "myapex_current",
734 min_sdk_version: "current",
735 defaults: ["my_defaults"],
736 }
737
738 apex {
739 name: "myapex_none",
740 defaults: ["my_defaults"],
741 }
742
743 apex_key {
744 name: "myapex.key",
745 public_key: "testkey.avbpubkey",
746 private_key: "testkey.pem",
747 }
748
749 filegroup {
750 name: "my-file-contexts",
751 srcs: ["product_specific_file_contexts"],
752 }
753 `, withFiles(map[string][]byte{
754 "product_specific_file_contexts": nil,
755 }), android.FixtureModifyProductVariables(
756 func(variables android.FixtureProductVariables) {
757 variables.Unbundled_build = proptools.BoolPtr(true)
758 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
759 }), android.FixtureMergeEnv(map[string]string{
760 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
761 }))
762
763 testCases := []struct {
764 module string
765 minSdkVersion string
766 }{
767 {
768 module: "myapex_30",
769 minSdkVersion: "30",
770 },
771 {
772 module: "myapex_current",
773 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
774 },
775 {
776 module: "myapex_none",
777 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
778 },
779 }
780 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900781 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400782 args := module.Rule("apexRule").Args
783 optFlags := args["opt_flags"]
784 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
785 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
786 }
787 }
788}
789
Jooyung Hanaf730952023-02-28 14:13:38 +0900790func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900791 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900792 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900793 if vendor {
794 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900795 }
796 ctx := testApex(t, `
797 apex {
798 name: "myapex",
799 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900800 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900801 `+prop+`
802 }
803
804 apex_key {
805 name: "myapex.key",
806 public_key: "testkey.avbpubkey",
807 private_key: "testkey.pem",
808 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900809 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900810
Jooyung Hana0503a52023-08-23 13:12:50 +0900811 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900812 if vendor {
813 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
814 rule.RuleParams.Command,
815 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900816 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900817 android.AssertStringDoesContain(t, "should force-label as system_file",
818 rule.RuleParams.Command,
819 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900820 }
821 }
822}
823
Jiyong Park25fc6a92018-11-18 18:02:45 +0900824func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800825 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826 apex {
827 name: "myapex",
828 key: "myapex.key",
829 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900830 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000831 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900832 }
833
834 apex_key {
835 name: "myapex.key",
836 public_key: "testkey.avbpubkey",
837 private_key: "testkey.pem",
838 }
839
840 cc_library {
841 name: "mylib",
842 srcs: ["mylib.cpp"],
843 shared_libs: ["mylib2", "mylib3"],
844 system_shared_libs: [],
845 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000846 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900847 }
848
849 cc_library {
850 name: "mylib2",
851 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900852 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900853 system_shared_libs: [],
854 stl: "none",
855 stubs: {
856 versions: ["1", "2", "3"],
857 },
858 }
859
860 cc_library {
861 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900862 srcs: ["mylib.cpp"],
863 shared_libs: ["mylib4"],
864 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900865 stl: "none",
866 stubs: {
867 versions: ["10", "11", "12"],
868 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000869 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900870 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900871
872 cc_library {
873 name: "mylib4",
874 srcs: ["mylib.cpp"],
875 system_shared_libs: [],
876 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000877 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900878 }
Jiyong Park105dc322021-06-11 17:22:09 +0900879
880 rust_binary {
881 name: "foo.rust",
882 srcs: ["foo.rs"],
883 shared_libs: ["libfoo.shared_from_rust"],
884 prefer_rlib: true,
885 apex_available: ["myapex"],
886 }
887
888 cc_library_shared {
889 name: "libfoo.shared_from_rust",
890 srcs: ["mylib.cpp"],
891 system_shared_libs: [],
892 stl: "none",
893 stubs: {
894 versions: ["10", "11", "12"],
895 },
896 }
897
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 `)
899
Jooyung Hana0503a52023-08-23 13:12:50 +0900900 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900901 copyCmds := apexRule.Args["copy_commands"]
902
903 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800904 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905
906 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800907 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900908
909 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800910 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900911
Colin Crossaede88c2020-08-11 12:17:01 -0700912 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913
914 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900915 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900916 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900917 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918
919 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700920 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700922 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900923
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700924 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
925 // is replaced by sharing of "cFlags" in cc/builder.go.
926 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
927 // module variable representing "cflags". So it was not detected by ensureNotContains.
928 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
929 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
930 // including the original cflags's "-include mylib.h".
931 //
Jiyong Park64379952018-12-13 18:37:29 +0900932 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700933 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
934 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900935
Jiyong Park85cc35a2022-07-17 11:30:47 +0900936 // Ensure that genstub for platform-provided lib is invoked with --systemapi
937 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
938 // Ensure that genstub for apex-provided lib is invoked with --apex
939 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900940
Jooyung Hana0503a52023-08-23 13:12:50 +0900941 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942 "lib64/mylib.so",
943 "lib64/mylib3.so",
944 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900945 "bin/foo.rust",
946 "lib64/libc++.so", // by the implicit dependency from foo.rust
947 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900948 })
Jiyong Park105dc322021-06-11 17:22:09 +0900949
950 // Ensure that stub dependency from a rust module is not included
951 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
952 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700953 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900954 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
955 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900956
Jooyung Hana0503a52023-08-23 13:12:50 +0900957 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900958 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959}
960
Jiyong Park1bc84122021-06-22 20:23:05 +0900961func TestApexCanUsePrivateApis(t *testing.T) {
962 ctx := testApex(t, `
963 apex {
964 name: "myapex",
965 key: "myapex.key",
966 native_shared_libs: ["mylib"],
967 binaries: ["foo.rust"],
968 updatable: false,
969 platform_apis: true,
970 }
971
972 apex_key {
973 name: "myapex.key",
974 public_key: "testkey.avbpubkey",
975 private_key: "testkey.pem",
976 }
977
978 cc_library {
979 name: "mylib",
980 srcs: ["mylib.cpp"],
981 shared_libs: ["mylib2"],
982 system_shared_libs: [],
983 stl: "none",
984 apex_available: [ "myapex" ],
985 }
986
987 cc_library {
988 name: "mylib2",
989 srcs: ["mylib.cpp"],
990 cflags: ["-include mylib.h"],
991 system_shared_libs: [],
992 stl: "none",
993 stubs: {
994 versions: ["1", "2", "3"],
995 },
996 }
997
998 rust_binary {
999 name: "foo.rust",
1000 srcs: ["foo.rs"],
1001 shared_libs: ["libfoo.shared_from_rust"],
1002 prefer_rlib: true,
1003 apex_available: ["myapex"],
1004 }
1005
1006 cc_library_shared {
1007 name: "libfoo.shared_from_rust",
1008 srcs: ["mylib.cpp"],
1009 system_shared_libs: [],
1010 stl: "none",
1011 stubs: {
1012 versions: ["10", "11", "12"],
1013 },
1014 }
1015 `)
1016
Jooyung Hana0503a52023-08-23 13:12:50 +09001017 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001018 copyCmds := apexRule.Args["copy_commands"]
1019
1020 // Ensure that indirect stubs dep is not included
1021 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1022 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1023
1024 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1025 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001026 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001027 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1028 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001029 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001030 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1031 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1032}
1033
Colin Cross7812fd32020-09-25 12:35:10 -07001034func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001036 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001037 apex {
1038 name: "myapex",
1039 key: "myapex.key",
1040 native_shared_libs: ["mylib", "mylib3"],
1041 min_sdk_version: "29",
1042 }
1043
1044 apex_key {
1045 name: "myapex.key",
1046 public_key: "testkey.avbpubkey",
1047 private_key: "testkey.pem",
1048 }
1049
1050 cc_library {
1051 name: "mylib",
1052 srcs: ["mylib.cpp"],
1053 shared_libs: ["mylib2", "mylib3"],
1054 system_shared_libs: [],
1055 stl: "none",
1056 apex_available: [ "myapex" ],
1057 min_sdk_version: "28",
1058 }
1059
1060 cc_library {
1061 name: "mylib2",
1062 srcs: ["mylib.cpp"],
1063 cflags: ["-include mylib.h"],
1064 system_shared_libs: [],
1065 stl: "none",
1066 stubs: {
1067 versions: ["28", "29", "30", "current"],
1068 },
1069 min_sdk_version: "28",
1070 }
1071
1072 cc_library {
1073 name: "mylib3",
1074 srcs: ["mylib.cpp"],
1075 shared_libs: ["mylib4"],
1076 system_shared_libs: [],
1077 stl: "none",
1078 stubs: {
1079 versions: ["28", "29", "30", "current"],
1080 },
1081 apex_available: [ "myapex" ],
1082 min_sdk_version: "28",
1083 }
1084
1085 cc_library {
1086 name: "mylib4",
1087 srcs: ["mylib.cpp"],
1088 system_shared_libs: [],
1089 stl: "none",
1090 apex_available: [ "myapex" ],
1091 min_sdk_version: "28",
1092 }
1093 `)
1094
Jooyung Hana0503a52023-08-23 13:12:50 +09001095 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001096 copyCmds := apexRule.Args["copy_commands"]
1097
1098 // Ensure that direct non-stubs dep is always included
1099 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1100
1101 // Ensure that indirect stubs dep is not included
1102 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1103
1104 // Ensure that direct stubs dep is included
1105 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1106
1107 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1108
Jiyong Park55549df2021-02-26 23:57:23 +09001109 // Ensure that mylib is linking with the latest version of stub for mylib2
1110 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001111 // ... and not linking to the non-stub (impl) variant of mylib2
1112 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1113
1114 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1115 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1116 // .. and not linking to the stubs variant of mylib3
1117 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1118
1119 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001120 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001121 ensureNotContains(t, mylib2Cflags, "-include ")
1122
Jiyong Park85cc35a2022-07-17 11:30:47 +09001123 // Ensure that genstub is invoked with --systemapi
1124 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001125
Jooyung Hana0503a52023-08-23 13:12:50 +09001126 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001127 "lib64/mylib.so",
1128 "lib64/mylib3.so",
1129 "lib64/mylib4.so",
1130 })
1131}
1132
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001133func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1134 t.Parallel()
1135 // myapex (Z)
1136 // mylib -----------------.
1137 // |
1138 // otherapex (29) |
1139 // libstub's versions: 29 Z current
1140 // |
1141 // <platform> |
1142 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001143 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001144 apex {
1145 name: "myapex",
1146 key: "myapex.key",
1147 native_shared_libs: ["mylib"],
1148 min_sdk_version: "Z", // non-final
1149 }
1150
1151 cc_library {
1152 name: "mylib",
1153 srcs: ["mylib.cpp"],
1154 shared_libs: ["libstub"],
1155 apex_available: ["myapex"],
1156 min_sdk_version: "Z",
1157 }
1158
1159 apex_key {
1160 name: "myapex.key",
1161 public_key: "testkey.avbpubkey",
1162 private_key: "testkey.pem",
1163 }
1164
1165 apex {
1166 name: "otherapex",
1167 key: "myapex.key",
1168 native_shared_libs: ["libstub"],
1169 min_sdk_version: "29",
1170 }
1171
1172 cc_library {
1173 name: "libstub",
1174 srcs: ["mylib.cpp"],
1175 stubs: {
1176 versions: ["29", "Z", "current"],
1177 },
1178 apex_available: ["otherapex"],
1179 min_sdk_version: "29",
1180 }
1181
1182 // platform module depending on libstub from otherapex should use the latest stub("current")
1183 cc_library {
1184 name: "libplatform",
1185 srcs: ["mylib.cpp"],
1186 shared_libs: ["libstub"],
1187 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001188 `,
1189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1190 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1191 variables.Platform_sdk_final = proptools.BoolPtr(false)
1192 variables.Platform_version_active_codenames = []string{"Z"}
1193 }),
1194 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001195
Jiyong Park55549df2021-02-26 23:57:23 +09001196 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001198 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001200 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001201
1202 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1203 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1204 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1205 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1206 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1207}
1208
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001209func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001210 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001211 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001212 name: "myapex2",
1213 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001214 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001215 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001216 }
1217
1218 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001219 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001220 public_key: "testkey.avbpubkey",
1221 private_key: "testkey.pem",
1222 }
1223
1224 cc_library {
1225 name: "mylib",
1226 srcs: ["mylib.cpp"],
1227 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001228 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001229 system_shared_libs: [],
1230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001231 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001232 }
1233
1234 cc_library {
1235 name: "libfoo",
1236 srcs: ["mylib.cpp"],
1237 shared_libs: ["libbar"],
1238 system_shared_libs: [],
1239 stl: "none",
1240 stubs: {
1241 versions: ["10", "20", "30"],
1242 },
1243 }
1244
1245 cc_library {
1246 name: "libbar",
1247 srcs: ["mylib.cpp"],
1248 system_shared_libs: [],
1249 stl: "none",
1250 }
1251
Jiyong Park678c8812020-02-07 17:25:49 +09001252 cc_library_static {
1253 name: "libbaz",
1254 srcs: ["mylib.cpp"],
1255 system_shared_libs: [],
1256 stl: "none",
1257 apex_available: [ "myapex2" ],
1258 }
1259
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001260 `)
1261
Jooyung Hana0503a52023-08-23 13:12:50 +09001262 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001263 copyCmds := apexRule.Args["copy_commands"]
1264
1265 // Ensure that direct non-stubs dep is always included
1266 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1267
1268 // Ensure that indirect stubs dep is not included
1269 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1270
1271 // Ensure that dependency of stubs is not included
1272 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1273
Colin Crossaede88c2020-08-11 12:17:01 -07001274 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001275
1276 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001277 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001278 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001282
1283 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1284 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001285
Jooyung Hana0503a52023-08-23 13:12:50 +09001286 fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001287 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001288
Jooyung Hana0503a52023-08-23 13:12:50 +09001289 flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001290 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001291}
1292
Jooyung Hand3639552019-08-09 12:57:43 +09001293func TestApexWithRuntimeLibsDependency(t *testing.T) {
1294 /*
1295 myapex
1296 |
1297 v (runtime_libs)
1298 mylib ------+------> libfoo [provides stub]
1299 |
1300 `------> libbar
1301 */
Colin Cross1c460562021-02-16 17:55:47 -08001302 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001303 apex {
1304 name: "myapex",
1305 key: "myapex.key",
1306 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001307 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001308 }
1309
1310 apex_key {
1311 name: "myapex.key",
1312 public_key: "testkey.avbpubkey",
1313 private_key: "testkey.pem",
1314 }
1315
1316 cc_library {
1317 name: "mylib",
1318 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001319 static_libs: ["libstatic"],
1320 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001321 runtime_libs: ["libfoo", "libbar"],
1322 system_shared_libs: [],
1323 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001324 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001325 }
1326
1327 cc_library {
1328 name: "libfoo",
1329 srcs: ["mylib.cpp"],
1330 system_shared_libs: [],
1331 stl: "none",
1332 stubs: {
1333 versions: ["10", "20", "30"],
1334 },
1335 }
1336
1337 cc_library {
1338 name: "libbar",
1339 srcs: ["mylib.cpp"],
1340 system_shared_libs: [],
1341 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001342 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001343 }
1344
Liz Kammer5f108fa2023-05-11 14:33:17 -04001345 cc_library {
1346 name: "libstatic",
1347 srcs: ["mylib.cpp"],
1348 system_shared_libs: [],
1349 stl: "none",
1350 apex_available: [ "myapex" ],
1351 runtime_libs: ["libstatic_to_runtime"],
1352 }
1353
1354 cc_library {
1355 name: "libshared",
1356 srcs: ["mylib.cpp"],
1357 system_shared_libs: [],
1358 stl: "none",
1359 apex_available: [ "myapex" ],
1360 runtime_libs: ["libshared_to_runtime"],
1361 }
1362
1363 cc_library {
1364 name: "libstatic_to_runtime",
1365 srcs: ["mylib.cpp"],
1366 system_shared_libs: [],
1367 stl: "none",
1368 apex_available: [ "myapex" ],
1369 }
1370
1371 cc_library {
1372 name: "libshared_to_runtime",
1373 srcs: ["mylib.cpp"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 apex_available: [ "myapex" ],
1377 }
Jooyung Hand3639552019-08-09 12:57:43 +09001378 `)
1379
Jooyung Hana0503a52023-08-23 13:12:50 +09001380 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001381 copyCmds := apexRule.Args["copy_commands"]
1382
1383 // Ensure that direct non-stubs dep is always included
1384 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1385
1386 // Ensure that indirect stubs dep is not included
1387 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1388
1389 // Ensure that runtime_libs dep in included
1390 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001391 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1392 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1393
1394 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001395
Jooyung Hana0503a52023-08-23 13:12:50 +09001396 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001397 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1398 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001399}
1400
Paul Duffina02cae32021-03-09 01:44:06 +00001401var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1402 cc.PrepareForTestWithCcBuildComponents,
1403 PrepareForTestWithApexBuildComponents,
1404 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001405 apex {
1406 name: "com.android.runtime",
1407 key: "com.android.runtime.key",
1408 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001409 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001410 }
1411
1412 apex_key {
1413 name: "com.android.runtime.key",
1414 public_key: "testkey.avbpubkey",
1415 private_key: "testkey.pem",
1416 }
Paul Duffina02cae32021-03-09 01:44:06 +00001417 `),
1418 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1419)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001420
Paul Duffina02cae32021-03-09 01:44:06 +00001421func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001422 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001423 cc_library {
1424 name: "libc",
1425 no_libcrt: true,
1426 nocrt: true,
1427 stl: "none",
1428 system_shared_libs: [],
1429 stubs: { versions: ["1"] },
1430 apex_available: ["com.android.runtime"],
1431
1432 sanitize: {
1433 hwaddress: true,
1434 }
1435 }
1436
1437 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001438 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001439 no_libcrt: true,
1440 nocrt: true,
1441 stl: "none",
1442 system_shared_libs: [],
1443 srcs: [""],
1444 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001445 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001446
1447 sanitize: {
1448 never: true,
1449 },
Spandan Das4de7b492023-05-05 21:13:01 +00001450 apex_available: [
1451 "//apex_available:anyapex",
1452 "//apex_available:platform",
1453 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001454 } `)
1455 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001456
Jooyung Hana0503a52023-08-23 13:12:50 +09001457 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001458 "lib64/bionic/libc.so",
1459 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1460 })
1461
Colin Cross4c4c1be2022-02-10 11:41:18 -08001462 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001463
1464 installed := hwasan.Description("install libclang_rt.hwasan")
1465 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1466
1467 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1468 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1469 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1470}
1471
1472func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001473 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001474 prepareForTestOfRuntimeApexWithHwasan,
1475 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1476 variables.SanitizeDevice = []string{"hwaddress"}
1477 }),
1478 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001479 cc_library {
1480 name: "libc",
1481 no_libcrt: true,
1482 nocrt: true,
1483 stl: "none",
1484 system_shared_libs: [],
1485 stubs: { versions: ["1"] },
1486 apex_available: ["com.android.runtime"],
1487 }
1488
1489 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001490 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001491 no_libcrt: true,
1492 nocrt: true,
1493 stl: "none",
1494 system_shared_libs: [],
1495 srcs: [""],
1496 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001497 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001498
1499 sanitize: {
1500 never: true,
1501 },
Spandan Das4de7b492023-05-05 21:13:01 +00001502 apex_available: [
1503 "//apex_available:anyapex",
1504 "//apex_available:platform",
1505 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001506 }
Paul Duffina02cae32021-03-09 01:44:06 +00001507 `)
1508 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001509
Jooyung Hana0503a52023-08-23 13:12:50 +09001510 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001511 "lib64/bionic/libc.so",
1512 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1513 })
1514
Colin Cross4c4c1be2022-02-10 11:41:18 -08001515 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001516
1517 installed := hwasan.Description("install libclang_rt.hwasan")
1518 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1519
1520 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1521 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1522 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1523}
1524
Jooyung Han61b66e92020-03-21 14:21:46 +00001525func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1526 testcases := []struct {
1527 name string
1528 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001529 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001530 shouldLink string
1531 shouldNotLink []string
1532 }{
1533 {
Jiyong Park55549df2021-02-26 23:57:23 +09001534 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001535 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001536 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001537 shouldLink: "current",
1538 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001539 },
1540 {
Jiyong Park55549df2021-02-26 23:57:23 +09001541 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001542 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001543 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001544 shouldLink: "current",
1545 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001546 },
1547 }
1548 for _, tc := range testcases {
1549 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001550 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001551 apex {
1552 name: "myapex",
1553 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001554 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001555 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001556 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001557 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001558
Jooyung Han61b66e92020-03-21 14:21:46 +00001559 apex_key {
1560 name: "myapex.key",
1561 public_key: "testkey.avbpubkey",
1562 private_key: "testkey.pem",
1563 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001564
Jooyung Han61b66e92020-03-21 14:21:46 +00001565 cc_library {
1566 name: "mylib",
1567 srcs: ["mylib.cpp"],
1568 vendor_available: true,
1569 shared_libs: ["libbar"],
1570 system_shared_libs: [],
1571 stl: "none",
1572 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001573 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001574 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001575
Jooyung Han61b66e92020-03-21 14:21:46 +00001576 cc_library {
1577 name: "libbar",
1578 srcs: ["mylib.cpp"],
1579 system_shared_libs: [],
1580 stl: "none",
1581 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001582 llndk: {
1583 symbol_file: "libbar.map.txt",
1584 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001585 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001586 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001587 withUnbundledBuild,
1588 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001589
Jooyung Han61b66e92020-03-21 14:21:46 +00001590 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001591 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001592 "lib64/mylib.so",
1593 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001594
Jooyung Han61b66e92020-03-21 14:21:46 +00001595 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001596 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001597 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1598 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001599
Steven Moreland2c4000c2021-04-27 02:08:49 +00001600 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1601 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001602 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001603 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001604 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001605
Steven Moreland2c4000c2021-04-27 02:08:49 +00001606 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001607 ver := tc.shouldLink
1608 if tc.shouldLink == "current" {
1609 ver = strconv.Itoa(android.FutureApiLevelInt)
1610 }
1611 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001612 })
1613 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001614}
1615
Jiyong Park25fc6a92018-11-18 18:02:45 +09001616func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001617 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001618 apex {
1619 name: "myapex",
1620 key: "myapex.key",
1621 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001622 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001623 }
1624
1625 apex_key {
1626 name: "myapex.key",
1627 public_key: "testkey.avbpubkey",
1628 private_key: "testkey.pem",
1629 }
1630
1631 cc_library {
1632 name: "mylib",
1633 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001634 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001635 shared_libs: ["libdl#27"],
1636 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001637 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001638 }
1639
1640 cc_library_shared {
1641 name: "mylib_shared",
1642 srcs: ["mylib.cpp"],
1643 shared_libs: ["libdl#27"],
1644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001645 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001646 }
1647
1648 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001649 name: "libBootstrap",
1650 srcs: ["mylib.cpp"],
1651 stl: "none",
1652 bootstrap: true,
1653 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001654 `)
1655
Jooyung Hana0503a52023-08-23 13:12:50 +09001656 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001657 copyCmds := apexRule.Args["copy_commands"]
1658
1659 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001660 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001661 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1662 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001663
1664 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001665 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001666
Colin Crossaede88c2020-08-11 12:17:01 -07001667 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1668 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1669 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670
1671 // For dependency to libc
1672 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001673 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001675 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001676 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001677 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1678 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001679
1680 // For dependency to libm
1681 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001682 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001684 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001685 // ... and is not compiling with the stub
1686 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1687 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1688
1689 // For dependency to libdl
1690 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001691 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001692 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001693 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1694 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001695 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001696 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001697 // ... Cflags from stub is correctly exported to mylib
1698 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1699 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001700
1701 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001702 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1703 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1704 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1705 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001706}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001707
Jooyung Han749dc692020-04-15 11:03:39 +09001708func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001709 // there are three links between liba --> libz.
1710 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001711 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001712 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001713 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001714 apex {
1715 name: "myapex",
1716 key: "myapex.key",
1717 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001718 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001719 }
1720
1721 apex {
1722 name: "otherapex",
1723 key: "myapex.key",
1724 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001725 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001726 }
1727
1728 apex_key {
1729 name: "myapex.key",
1730 public_key: "testkey.avbpubkey",
1731 private_key: "testkey.pem",
1732 }
1733
1734 cc_library {
1735 name: "libx",
1736 shared_libs: ["liba"],
1737 system_shared_libs: [],
1738 stl: "none",
1739 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001740 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001741 }
1742
1743 cc_library {
1744 name: "liby",
1745 shared_libs: ["liba"],
1746 system_shared_libs: [],
1747 stl: "none",
1748 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001749 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001750 }
1751
1752 cc_library {
1753 name: "liba",
1754 shared_libs: ["libz"],
1755 system_shared_libs: [],
1756 stl: "none",
1757 apex_available: [
1758 "//apex_available:anyapex",
1759 "//apex_available:platform",
1760 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001761 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001762 }
1763
1764 cc_library {
1765 name: "libz",
1766 system_shared_libs: [],
1767 stl: "none",
1768 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001769 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001770 },
1771 }
Jooyung Han749dc692020-04-15 11:03:39 +09001772 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001773
1774 expectLink := func(from, from_variant, to, to_variant string) {
1775 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1776 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1777 }
1778 expectNoLink := func(from, from_variant, to, to_variant string) {
1779 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1780 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1781 }
1782 // platform liba is linked to non-stub version
1783 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001784 // liba in myapex is linked to current
1785 expectLink("liba", "shared_apex29", "libz", "shared_current")
1786 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001787 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001788 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001789 // liba in otherapex is linked to current
1790 expectLink("liba", "shared_apex30", "libz", "shared_current")
1791 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001792 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1793 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001794}
1795
Jooyung Hanaed150d2020-04-02 01:41:41 +09001796func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001797 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001798 apex {
1799 name: "myapex",
1800 key: "myapex.key",
1801 native_shared_libs: ["libx"],
1802 min_sdk_version: "R",
1803 }
1804
1805 apex_key {
1806 name: "myapex.key",
1807 public_key: "testkey.avbpubkey",
1808 private_key: "testkey.pem",
1809 }
1810
1811 cc_library {
1812 name: "libx",
1813 shared_libs: ["libz"],
1814 system_shared_libs: [],
1815 stl: "none",
1816 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001817 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001818 }
1819
1820 cc_library {
1821 name: "libz",
1822 system_shared_libs: [],
1823 stl: "none",
1824 stubs: {
1825 versions: ["29", "R"],
1826 },
1827 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001828 `,
1829 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1830 variables.Platform_version_active_codenames = []string{"R"}
1831 }),
1832 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001833
1834 expectLink := func(from, from_variant, to, to_variant string) {
1835 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1836 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1837 }
1838 expectNoLink := func(from, from_variant, to, to_variant string) {
1839 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1840 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1841 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001842 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1843 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001844 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1845 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001846}
1847
Jooyung Han4c4da062021-06-23 10:23:16 +09001848func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1849 testApex(t, `
1850 apex {
1851 name: "myapex",
1852 key: "myapex.key",
1853 java_libs: ["libx"],
1854 min_sdk_version: "S",
1855 }
1856
1857 apex_key {
1858 name: "myapex.key",
1859 public_key: "testkey.avbpubkey",
1860 private_key: "testkey.pem",
1861 }
1862
1863 java_library {
1864 name: "libx",
1865 srcs: ["a.java"],
1866 apex_available: [ "myapex" ],
1867 sdk_version: "current",
1868 min_sdk_version: "S", // should be okay
1869 }
1870 `,
1871 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1872 variables.Platform_version_active_codenames = []string{"S"}
1873 variables.Platform_sdk_codename = proptools.StringPtr("S")
1874 }),
1875 )
1876}
1877
Jooyung Han749dc692020-04-15 11:03:39 +09001878func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001879 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001880 apex {
1881 name: "myapex",
1882 key: "myapex.key",
1883 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001884 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001885 }
1886
1887 apex_key {
1888 name: "myapex.key",
1889 public_key: "testkey.avbpubkey",
1890 private_key: "testkey.pem",
1891 }
1892
1893 cc_library {
1894 name: "libx",
1895 shared_libs: ["libz"],
1896 system_shared_libs: [],
1897 stl: "none",
1898 apex_available: [ "myapex" ],
1899 }
1900
1901 cc_library {
1902 name: "libz",
1903 system_shared_libs: [],
1904 stl: "none",
1905 stubs: {
1906 versions: ["1", "2"],
1907 },
1908 }
1909 `)
1910
1911 expectLink := func(from, from_variant, to, to_variant string) {
1912 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1913 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1914 }
1915 expectNoLink := func(from, from_variant, to, to_variant string) {
1916 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1917 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1918 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001919 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001920 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001921 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001922 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001923}
1924
Jooyung Handfc864c2023-03-20 18:19:07 +09001925func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001926 ctx := testApex(t, `
1927 apex {
1928 name: "myapex",
1929 key: "myapex.key",
1930 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001931 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001932 vendor: true,
1933 min_sdk_version: "29",
1934 }
1935
1936 apex_key {
1937 name: "myapex.key",
1938 public_key: "testkey.avbpubkey",
1939 private_key: "testkey.pem",
1940 }
1941
1942 cc_library {
1943 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001944 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001945 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001946 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001947 shared_libs: ["libbar"],
1948 }
1949
1950 cc_library {
1951 name: "libbar",
1952 stubs: { versions: ["29", "30"] },
1953 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001954 }
1955 `)
1956
1957 vendorVariant := "android_vendor.29_arm64_armv8-a"
1958
Jooyung Handfc864c2023-03-20 18:19:07 +09001959 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1960
1961 // Ensure that mylib links with "current" LLNDK
1962 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1963 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1964
1965 // Ensure that mylib is targeting 29
1966 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1967 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1968
1969 // Ensure that the correct variant of crtbegin_so is used.
1970 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1971 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001972
1973 // Ensure that the crtbegin_so used by the APEX is targeting 29
1974 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1975 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1976}
1977
Jooyung Han4495f842023-04-25 16:39:59 +09001978func TestTrackAllowedDeps(t *testing.T) {
1979 ctx := testApex(t, `
1980 apex {
1981 name: "myapex",
1982 key: "myapex.key",
1983 updatable: true,
1984 native_shared_libs: [
1985 "mylib",
1986 "yourlib",
1987 ],
1988 min_sdk_version: "29",
1989 }
1990
1991 apex {
1992 name: "myapex2",
1993 key: "myapex.key",
1994 updatable: false,
1995 native_shared_libs: ["yourlib"],
1996 }
1997
1998 apex_key {
1999 name: "myapex.key",
2000 public_key: "testkey.avbpubkey",
2001 private_key: "testkey.pem",
2002 }
2003
2004 cc_library {
2005 name: "mylib",
2006 srcs: ["mylib.cpp"],
2007 shared_libs: ["libbar"],
2008 min_sdk_version: "29",
2009 apex_available: ["myapex"],
2010 }
2011
2012 cc_library {
2013 name: "libbar",
2014 stubs: { versions: ["29", "30"] },
2015 }
2016
2017 cc_library {
2018 name: "yourlib",
2019 srcs: ["mylib.cpp"],
2020 min_sdk_version: "29",
2021 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2022 }
2023 `, withFiles(android.MockFS{
2024 "packages/modules/common/build/allowed_deps.txt": nil,
2025 }))
2026
2027 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2028 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2029 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002030 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002031 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002032 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002033
Jooyung Hana0503a52023-08-23 13:12:50 +09002034 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han4495f842023-04-25 16:39:59 +09002035 flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
2036 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2037 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2038 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2039 flatlist, "mylib:(minSdkVersion:29)")
2040 android.AssertStringListContains(t, "track platform-available lib",
2041 flatlist, "yourlib(minSdkVersion:29)")
2042}
2043
2044func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2045 ctx := testApex(t, `
2046 apex {
2047 name: "myapex",
2048 key: "myapex.key",
2049 updatable: true,
2050 min_sdk_version: "29",
2051 }
2052
2053 apex_key {
2054 name: "myapex.key",
2055 public_key: "testkey.avbpubkey",
2056 private_key: "testkey.pem",
2057 }
2058 `)
2059 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2060 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2061 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2062 }
2063}
2064
Jooyung Han03b51852020-02-26 22:45:42 +09002065func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002066 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002067 apex {
2068 name: "myapex",
2069 key: "myapex.key",
2070 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002071 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002072 }
2073
2074 apex_key {
2075 name: "myapex.key",
2076 public_key: "testkey.avbpubkey",
2077 private_key: "testkey.pem",
2078 }
2079
2080 cc_library {
2081 name: "libx",
2082 system_shared_libs: [],
2083 stl: "none",
2084 apex_available: [ "myapex" ],
2085 stubs: {
2086 versions: ["1", "2"],
2087 },
2088 }
2089
2090 cc_library {
2091 name: "libz",
2092 shared_libs: ["libx"],
2093 system_shared_libs: [],
2094 stl: "none",
2095 }
2096 `)
2097
2098 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002099 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002100 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2101 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2102 }
2103 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002104 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002105 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2106 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2107 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002108 expectLink("libz", "shared", "libx", "shared_current")
2109 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002110 expectNoLink("libz", "shared", "libz", "shared_1")
2111 expectNoLink("libz", "shared", "libz", "shared")
2112}
2113
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002114var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2115 func(variables android.FixtureProductVariables) {
2116 variables.SanitizeDevice = []string{"hwaddress"}
2117 },
2118)
2119
Jooyung Han75568392020-03-20 04:29:24 +09002120func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002121 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002122 apex {
2123 name: "myapex",
2124 key: "myapex.key",
2125 native_shared_libs: ["libx"],
2126 min_sdk_version: "29",
2127 }
2128
2129 apex_key {
2130 name: "myapex.key",
2131 public_key: "testkey.avbpubkey",
2132 private_key: "testkey.pem",
2133 }
2134
2135 cc_library {
2136 name: "libx",
2137 shared_libs: ["libbar"],
2138 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002139 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002140 }
2141
2142 cc_library {
2143 name: "libbar",
2144 stubs: {
2145 versions: ["29", "30"],
2146 },
2147 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002148 `,
2149 prepareForTestWithSantitizeHwaddress,
2150 )
Jooyung Han03b51852020-02-26 22:45:42 +09002151 expectLink := func(from, from_variant, to, to_variant string) {
2152 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2153 libFlags := ld.Args["libFlags"]
2154 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2155 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002156 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002157}
2158
Jooyung Han75568392020-03-20 04:29:24 +09002159func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002160 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002161 apex {
2162 name: "myapex",
2163 key: "myapex.key",
2164 native_shared_libs: ["libx"],
2165 min_sdk_version: "29",
2166 }
2167
2168 apex_key {
2169 name: "myapex.key",
2170 public_key: "testkey.avbpubkey",
2171 private_key: "testkey.pem",
2172 }
2173
2174 cc_library {
2175 name: "libx",
2176 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002177 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002178 }
Jooyung Han75568392020-03-20 04:29:24 +09002179 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002180
2181 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002182 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002183 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002184 // note that platform variant is not.
2185 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002186 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002187}
2188
Jooyung Han749dc692020-04-15 11:03:39 +09002189func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2190 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002191 apex {
2192 name: "myapex",
2193 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002194 native_shared_libs: ["mylib"],
2195 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002196 }
2197
2198 apex_key {
2199 name: "myapex.key",
2200 public_key: "testkey.avbpubkey",
2201 private_key: "testkey.pem",
2202 }
Jooyung Han749dc692020-04-15 11:03:39 +09002203
2204 cc_library {
2205 name: "mylib",
2206 srcs: ["mylib.cpp"],
2207 system_shared_libs: [],
2208 stl: "none",
2209 apex_available: [
2210 "myapex",
2211 ],
2212 min_sdk_version: "30",
2213 }
2214 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002215
2216 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2217 apex {
2218 name: "myapex",
2219 key: "myapex.key",
2220 native_shared_libs: ["libfoo.ffi"],
2221 min_sdk_version: "29",
2222 }
2223
2224 apex_key {
2225 name: "myapex.key",
2226 public_key: "testkey.avbpubkey",
2227 private_key: "testkey.pem",
2228 }
2229
2230 rust_ffi_shared {
2231 name: "libfoo.ffi",
2232 srcs: ["foo.rs"],
2233 crate_name: "foo",
2234 apex_available: [
2235 "myapex",
2236 ],
2237 min_sdk_version: "30",
2238 }
2239 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002240
2241 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2242 apex {
2243 name: "myapex",
2244 key: "myapex.key",
2245 java_libs: ["libfoo"],
2246 min_sdk_version: "29",
2247 }
2248
2249 apex_key {
2250 name: "myapex.key",
2251 public_key: "testkey.avbpubkey",
2252 private_key: "testkey.pem",
2253 }
2254
2255 java_import {
2256 name: "libfoo",
2257 jars: ["libfoo.jar"],
2258 apex_available: [
2259 "myapex",
2260 ],
2261 min_sdk_version: "30",
2262 }
2263 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002264
2265 // Skip check for modules compiling against core API surface
2266 testApex(t, `
2267 apex {
2268 name: "myapex",
2269 key: "myapex.key",
2270 java_libs: ["libfoo"],
2271 min_sdk_version: "29",
2272 }
2273
2274 apex_key {
2275 name: "myapex.key",
2276 public_key: "testkey.avbpubkey",
2277 private_key: "testkey.pem",
2278 }
2279
2280 java_library {
2281 name: "libfoo",
2282 srcs: ["Foo.java"],
2283 apex_available: [
2284 "myapex",
2285 ],
2286 // Compile against core API surface
2287 sdk_version: "core_current",
2288 min_sdk_version: "30",
2289 }
2290 `)
2291
Jooyung Han749dc692020-04-15 11:03:39 +09002292}
2293
2294func TestApexMinSdkVersion_Okay(t *testing.T) {
2295 testApex(t, `
2296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 native_shared_libs: ["libfoo"],
2300 java_libs: ["libbar"],
2301 min_sdk_version: "29",
2302 }
2303
2304 apex_key {
2305 name: "myapex.key",
2306 public_key: "testkey.avbpubkey",
2307 private_key: "testkey.pem",
2308 }
2309
2310 cc_library {
2311 name: "libfoo",
2312 srcs: ["mylib.cpp"],
2313 shared_libs: ["libfoo_dep"],
2314 apex_available: ["myapex"],
2315 min_sdk_version: "29",
2316 }
2317
2318 cc_library {
2319 name: "libfoo_dep",
2320 srcs: ["mylib.cpp"],
2321 apex_available: ["myapex"],
2322 min_sdk_version: "29",
2323 }
2324
2325 java_library {
2326 name: "libbar",
2327 sdk_version: "current",
2328 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002329 static_libs: [
2330 "libbar_dep",
2331 "libbar_import_dep",
2332 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002333 apex_available: ["myapex"],
2334 min_sdk_version: "29",
2335 }
2336
2337 java_library {
2338 name: "libbar_dep",
2339 sdk_version: "current",
2340 srcs: ["a.java"],
2341 apex_available: ["myapex"],
2342 min_sdk_version: "29",
2343 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002344
2345 java_import {
2346 name: "libbar_import_dep",
2347 jars: ["libbar.jar"],
2348 apex_available: ["myapex"],
2349 min_sdk_version: "29",
2350 }
Jooyung Han03b51852020-02-26 22:45:42 +09002351 `)
2352}
2353
Colin Cross8ca61c12022-10-06 21:00:14 -07002354func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2355 // Tests that an apex dependency with min_sdk_version higher than the
2356 // min_sdk_version of the apex is allowed as long as the dependency's
2357 // min_sdk_version is less than or equal to the api level that the
2358 // architecture was introduced in. In this case, arm64 didn't exist
2359 // until api level 21, so the arm64 code will never need to run on
2360 // an api level 20 device, even if other architectures of the apex
2361 // will.
2362 testApex(t, `
2363 apex {
2364 name: "myapex",
2365 key: "myapex.key",
2366 native_shared_libs: ["libfoo"],
2367 min_sdk_version: "20",
2368 }
2369
2370 apex_key {
2371 name: "myapex.key",
2372 public_key: "testkey.avbpubkey",
2373 private_key: "testkey.pem",
2374 }
2375
2376 cc_library {
2377 name: "libfoo",
2378 srcs: ["mylib.cpp"],
2379 apex_available: ["myapex"],
2380 min_sdk_version: "21",
2381 stl: "none",
2382 }
2383 `)
2384}
2385
Artur Satayev8cf899a2020-04-15 17:29:42 +01002386func TestJavaStableSdkVersion(t *testing.T) {
2387 testCases := []struct {
2388 name string
2389 expectedError string
2390 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002391 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002392 }{
2393 {
2394 name: "Non-updatable apex with non-stable dep",
2395 bp: `
2396 apex {
2397 name: "myapex",
2398 java_libs: ["myjar"],
2399 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002400 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002401 }
2402 apex_key {
2403 name: "myapex.key",
2404 public_key: "testkey.avbpubkey",
2405 private_key: "testkey.pem",
2406 }
2407 java_library {
2408 name: "myjar",
2409 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002410 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002411 apex_available: ["myapex"],
2412 }
2413 `,
2414 },
2415 {
2416 name: "Updatable apex with stable dep",
2417 bp: `
2418 apex {
2419 name: "myapex",
2420 java_libs: ["myjar"],
2421 key: "myapex.key",
2422 updatable: true,
2423 min_sdk_version: "29",
2424 }
2425 apex_key {
2426 name: "myapex.key",
2427 public_key: "testkey.avbpubkey",
2428 private_key: "testkey.pem",
2429 }
2430 java_library {
2431 name: "myjar",
2432 srcs: ["foo/bar/MyClass.java"],
2433 sdk_version: "current",
2434 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002435 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002436 }
2437 `,
2438 },
2439 {
2440 name: "Updatable apex with non-stable dep",
2441 expectedError: "cannot depend on \"myjar\"",
2442 bp: `
2443 apex {
2444 name: "myapex",
2445 java_libs: ["myjar"],
2446 key: "myapex.key",
2447 updatable: true,
2448 }
2449 apex_key {
2450 name: "myapex.key",
2451 public_key: "testkey.avbpubkey",
2452 private_key: "testkey.pem",
2453 }
2454 java_library {
2455 name: "myjar",
2456 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002457 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002458 apex_available: ["myapex"],
2459 }
2460 `,
2461 },
2462 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002463 name: "Updatable apex with non-stable legacy core platform dep",
2464 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2465 bp: `
2466 apex {
2467 name: "myapex",
2468 java_libs: ["myjar-uses-legacy"],
2469 key: "myapex.key",
2470 updatable: true,
2471 }
2472 apex_key {
2473 name: "myapex.key",
2474 public_key: "testkey.avbpubkey",
2475 private_key: "testkey.pem",
2476 }
2477 java_library {
2478 name: "myjar-uses-legacy",
2479 srcs: ["foo/bar/MyClass.java"],
2480 sdk_version: "core_platform",
2481 apex_available: ["myapex"],
2482 }
2483 `,
2484 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2485 },
2486 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002487 name: "Updatable apex with non-stable transitive dep",
2488 // This is not actually detecting that the transitive dependency is unstable, rather it is
2489 // detecting that the transitive dependency is building against a wider API surface than the
2490 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002491 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002492 bp: `
2493 apex {
2494 name: "myapex",
2495 java_libs: ["myjar"],
2496 key: "myapex.key",
2497 updatable: true,
2498 }
2499 apex_key {
2500 name: "myapex.key",
2501 public_key: "testkey.avbpubkey",
2502 private_key: "testkey.pem",
2503 }
2504 java_library {
2505 name: "myjar",
2506 srcs: ["foo/bar/MyClass.java"],
2507 sdk_version: "current",
2508 apex_available: ["myapex"],
2509 static_libs: ["transitive-jar"],
2510 }
2511 java_library {
2512 name: "transitive-jar",
2513 srcs: ["foo/bar/MyClass.java"],
2514 sdk_version: "core_platform",
2515 apex_available: ["myapex"],
2516 }
2517 `,
2518 },
2519 }
2520
2521 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002522 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2523 continue
2524 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002525 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002526 errorHandler := android.FixtureExpectsNoErrors
2527 if test.expectedError != "" {
2528 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002529 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002530 android.GroupFixturePreparers(
2531 java.PrepareForTestWithJavaDefaultModules,
2532 PrepareForTestWithApexBuildComponents,
2533 prepareForTestWithMyapex,
2534 android.OptionalFixturePreparer(test.preparer),
2535 ).
2536 ExtendWithErrorHandler(errorHandler).
2537 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002538 })
2539 }
2540}
2541
Jooyung Han749dc692020-04-15 11:03:39 +09002542func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2543 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2544 apex {
2545 name: "myapex",
2546 key: "myapex.key",
2547 native_shared_libs: ["mylib"],
2548 min_sdk_version: "29",
2549 }
2550
2551 apex_key {
2552 name: "myapex.key",
2553 public_key: "testkey.avbpubkey",
2554 private_key: "testkey.pem",
2555 }
2556
2557 cc_library {
2558 name: "mylib",
2559 srcs: ["mylib.cpp"],
2560 shared_libs: ["mylib2"],
2561 system_shared_libs: [],
2562 stl: "none",
2563 apex_available: [
2564 "myapex",
2565 ],
2566 min_sdk_version: "29",
2567 }
2568
2569 // indirect part of the apex
2570 cc_library {
2571 name: "mylib2",
2572 srcs: ["mylib.cpp"],
2573 system_shared_libs: [],
2574 stl: "none",
2575 apex_available: [
2576 "myapex",
2577 ],
2578 min_sdk_version: "30",
2579 }
2580 `)
2581}
2582
2583func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2584 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2585 apex {
2586 name: "myapex",
2587 key: "myapex.key",
2588 apps: ["AppFoo"],
2589 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002590 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 android_app {
2600 name: "AppFoo",
2601 srcs: ["foo/bar/MyClass.java"],
2602 sdk_version: "current",
2603 min_sdk_version: "29",
2604 system_modules: "none",
2605 stl: "none",
2606 static_libs: ["bar"],
2607 apex_available: [ "myapex" ],
2608 }
2609
2610 java_library {
2611 name: "bar",
2612 sdk_version: "current",
2613 srcs: ["a.java"],
2614 apex_available: [ "myapex" ],
2615 }
2616 `)
2617}
2618
2619func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002620 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002621 apex {
2622 name: "myapex",
2623 key: "myapex.key",
2624 native_shared_libs: ["mylib"],
2625 min_sdk_version: "29",
2626 }
2627
2628 apex_key {
2629 name: "myapex.key",
2630 public_key: "testkey.avbpubkey",
2631 private_key: "testkey.pem",
2632 }
2633
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002634 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002635 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2636 cc_library {
2637 name: "mylib",
2638 srcs: ["mylib.cpp"],
2639 shared_libs: ["mylib2"],
2640 system_shared_libs: [],
2641 stl: "none",
2642 apex_available: ["myapex", "otherapex"],
2643 min_sdk_version: "29",
2644 }
2645
2646 cc_library {
2647 name: "mylib2",
2648 srcs: ["mylib.cpp"],
2649 system_shared_libs: [],
2650 stl: "none",
2651 apex_available: ["otherapex"],
2652 stubs: { versions: ["29", "30"] },
2653 min_sdk_version: "30",
2654 }
2655
2656 apex {
2657 name: "otherapex",
2658 key: "myapex.key",
2659 native_shared_libs: ["mylib", "mylib2"],
2660 min_sdk_version: "30",
2661 }
2662 `)
2663 expectLink := func(from, from_variant, to, to_variant string) {
2664 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2665 libFlags := ld.Args["libFlags"]
2666 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2667 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002668 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002669 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002670}
2671
Jooyung Haned124c32021-01-26 11:43:46 +09002672func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002673 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2674 func(variables android.FixtureProductVariables) {
2675 variables.Platform_sdk_codename = proptools.StringPtr("S")
2676 variables.Platform_version_active_codenames = []string{"S"}
2677 },
2678 )
Jooyung Haned124c32021-01-26 11:43:46 +09002679 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2680 apex {
2681 name: "myapex",
2682 key: "myapex.key",
2683 native_shared_libs: ["libfoo"],
2684 min_sdk_version: "S",
2685 }
2686 apex_key {
2687 name: "myapex.key",
2688 public_key: "testkey.avbpubkey",
2689 private_key: "testkey.pem",
2690 }
2691 cc_library {
2692 name: "libfoo",
2693 shared_libs: ["libbar"],
2694 apex_available: ["myapex"],
2695 min_sdk_version: "29",
2696 }
2697 cc_library {
2698 name: "libbar",
2699 apex_available: ["myapex"],
2700 }
2701 `, withSAsActiveCodeNames)
2702}
2703
2704func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002705 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2706 variables.Platform_sdk_codename = proptools.StringPtr("S")
2707 variables.Platform_version_active_codenames = []string{"S", "T"}
2708 })
Colin Cross1c460562021-02-16 17:55:47 -08002709 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002710 apex {
2711 name: "myapex",
2712 key: "myapex.key",
2713 native_shared_libs: ["libfoo"],
2714 min_sdk_version: "S",
2715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 cc_library {
2722 name: "libfoo",
2723 shared_libs: ["libbar"],
2724 apex_available: ["myapex"],
2725 min_sdk_version: "S",
2726 }
2727 cc_library {
2728 name: "libbar",
2729 stubs: {
2730 symbol_file: "libbar.map.txt",
2731 versions: ["30", "S", "T"],
2732 },
2733 }
2734 `, withSAsActiveCodeNames)
2735
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002736 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002737 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2738 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002739 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002740}
2741
Jiyong Park7c2ee712018-12-07 00:42:25 +09002742func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002743 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002744 apex {
2745 name: "myapex",
2746 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002747 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002748 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002749 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002750 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002751 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002752 }
2753
2754 apex_key {
2755 name: "myapex.key",
2756 public_key: "testkey.avbpubkey",
2757 private_key: "testkey.pem",
2758 }
2759
2760 prebuilt_etc {
2761 name: "myetc",
2762 src: "myprebuilt",
2763 sub_dir: "foo/bar",
2764 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002765
2766 cc_library {
2767 name: "mylib",
2768 srcs: ["mylib.cpp"],
2769 relative_install_path: "foo/bar",
2770 system_shared_libs: [],
2771 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002772 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002773 }
2774
2775 cc_binary {
2776 name: "mybin",
2777 srcs: ["mylib.cpp"],
2778 relative_install_path: "foo/bar",
2779 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002780 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002781 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002782 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002783
2784 rust_binary {
2785 name: "mybin.rust",
2786 srcs: ["foo.rs"],
2787 relative_install_path: "rust_subdir",
2788 apex_available: [ "myapex" ],
2789 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002790 `)
2791
Jooyung Hana0503a52023-08-23 13:12:50 +09002792 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002793 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002794
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002795 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002796 ensureContains(t, cmd, "/etc ")
2797 ensureContains(t, cmd, "/etc/foo ")
2798 ensureContains(t, cmd, "/etc/foo/bar ")
2799 ensureContains(t, cmd, "/lib64 ")
2800 ensureContains(t, cmd, "/lib64/foo ")
2801 ensureContains(t, cmd, "/lib64/foo/bar ")
2802 ensureContains(t, cmd, "/lib ")
2803 ensureContains(t, cmd, "/lib/foo ")
2804 ensureContains(t, cmd, "/lib/foo/bar ")
2805 ensureContains(t, cmd, "/bin ")
2806 ensureContains(t, cmd, "/bin/foo ")
2807 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002808 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002809}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002810
Jooyung Han35155c42020-02-06 17:33:20 +09002811func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002812 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002813 apex {
2814 name: "myapex",
2815 key: "myapex.key",
2816 multilib: {
2817 both: {
2818 native_shared_libs: ["mylib"],
2819 binaries: ["mybin"],
2820 },
2821 },
2822 compile_multilib: "both",
2823 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002824 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002825 }
2826
2827 apex_key {
2828 name: "myapex.key",
2829 public_key: "testkey.avbpubkey",
2830 private_key: "testkey.pem",
2831 }
2832
2833 cc_library {
2834 name: "mylib",
2835 relative_install_path: "foo/bar",
2836 system_shared_libs: [],
2837 stl: "none",
2838 apex_available: [ "myapex" ],
2839 native_bridge_supported: true,
2840 }
2841
2842 cc_binary {
2843 name: "mybin",
2844 relative_install_path: "foo/bar",
2845 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002846 stl: "none",
2847 apex_available: [ "myapex" ],
2848 native_bridge_supported: true,
2849 compile_multilib: "both", // default is "first" for binary
2850 multilib: {
2851 lib64: {
2852 suffix: "64",
2853 },
2854 },
2855 }
2856 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002857 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002858 "bin/foo/bar/mybin",
2859 "bin/foo/bar/mybin64",
2860 "bin/arm/foo/bar/mybin",
2861 "bin/arm64/foo/bar/mybin64",
2862 "lib/foo/bar/mylib.so",
2863 "lib/arm/foo/bar/mylib.so",
2864 "lib64/foo/bar/mylib.so",
2865 "lib64/arm64/foo/bar/mylib.so",
2866 })
2867}
2868
Jooyung Han85d61762020-06-24 23:50:26 +09002869func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002870 result := android.GroupFixturePreparers(
2871 prepareForApexTest,
2872 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2873 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002874 apex {
2875 name: "myapex",
2876 key: "myapex.key",
2877 binaries: ["mybin"],
2878 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002879 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002880 }
2881 apex_key {
2882 name: "myapex.key",
2883 public_key: "testkey.avbpubkey",
2884 private_key: "testkey.pem",
2885 }
2886 cc_binary {
2887 name: "mybin",
2888 vendor: true,
2889 shared_libs: ["libfoo"],
2890 }
2891 cc_library {
2892 name: "libfoo",
2893 proprietary: true,
2894 }
2895 `)
2896
Jooyung Hana0503a52023-08-23 13:12:50 +09002897 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002898 "bin/mybin",
2899 "lib64/libfoo.so",
2900 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2901 "lib64/libc++.so",
2902 })
2903
Jooyung Hana0503a52023-08-23 13:12:50 +09002904 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002905 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002906 name := apexBundle.BaseModuleName()
2907 prefix := "TARGET_"
2908 var builder strings.Builder
2909 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002910 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002911 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002912 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002913
Jooyung Hana0503a52023-08-23 13:12:50 +09002914 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002915 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2916 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002917}
2918
Jooyung Hanc5a96762022-02-04 11:54:50 +09002919func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2920 testApexError(t, `Trying to include a VNDK library`, `
2921 apex {
2922 name: "myapex",
2923 key: "myapex.key",
2924 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2925 vendor: true,
2926 use_vndk_as_stable: true,
2927 updatable: false,
2928 }
2929 apex_key {
2930 name: "myapex.key",
2931 public_key: "testkey.avbpubkey",
2932 private_key: "testkey.pem",
2933 }`)
2934}
2935
Jooyung Handf78e212020-07-22 15:54:47 +09002936func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002937 // myapex myapex2
2938 // | |
2939 // mybin ------. mybin2
2940 // \ \ / |
2941 // (stable) .---\--------` |
2942 // \ / \ |
2943 // \ / \ /
2944 // libvndk libvendor
2945 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002946 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002947 apex {
2948 name: "myapex",
2949 key: "myapex.key",
2950 binaries: ["mybin"],
2951 vendor: true,
2952 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002953 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002954 }
2955 apex_key {
2956 name: "myapex.key",
2957 public_key: "testkey.avbpubkey",
2958 private_key: "testkey.pem",
2959 }
2960 cc_binary {
2961 name: "mybin",
2962 vendor: true,
2963 shared_libs: ["libvndk", "libvendor"],
2964 }
2965 cc_library {
2966 name: "libvndk",
2967 vndk: {
2968 enabled: true,
2969 },
2970 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002971 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002972 }
2973 cc_library {
2974 name: "libvendor",
2975 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002976 stl: "none",
2977 }
2978 apex {
2979 name: "myapex2",
2980 key: "myapex.key",
2981 binaries: ["mybin2"],
2982 vendor: true,
2983 use_vndk_as_stable: false,
2984 updatable: false,
2985 }
2986 cc_binary {
2987 name: "mybin2",
2988 vendor: true,
2989 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002990 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002991 `,
2992 android.FixtureModifyConfig(func(config android.Config) {
2993 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2994 }),
2995 )
Jooyung Handf78e212020-07-22 15:54:47 +09002996
Jiyong Parkf58c46e2021-04-01 21:35:20 +09002997 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09002998
Jooyung Han91f92032022-02-04 12:36:33 +09002999 for _, tc := range []struct {
3000 name string
3001 apexName string
3002 moduleName string
3003 moduleVariant string
3004 libs []string
3005 contents []string
3006 requireVndkNamespace bool
3007 }{
3008 {
3009 name: "use_vndk_as_stable",
3010 apexName: "myapex",
3011 moduleName: "mybin",
3012 moduleVariant: vendorVariant + "_apex10000",
3013 libs: []string{
3014 // should link with vendor variants of VNDK libs(libvndk/libc++)
3015 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3016 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3017 // unstable Vendor libs as APEX variant
3018 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3019 },
3020 contents: []string{
3021 "bin/mybin",
3022 "lib64/libvendor.so",
3023 // VNDK libs (libvndk/libc++) are not included
3024 },
3025 requireVndkNamespace: true,
3026 },
3027 {
3028 name: "!use_vndk_as_stable",
3029 apexName: "myapex2",
3030 moduleName: "mybin2",
3031 moduleVariant: vendorVariant + "_myapex2",
3032 libs: []string{
3033 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3034 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3035 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3036 // unstable vendor libs have "merged" APEX variants
3037 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3038 },
3039 contents: []string{
3040 "bin/mybin2",
3041 "lib64/libvendor.so",
3042 // VNDK libs are included as well
3043 "lib64/libvndk.so",
3044 "lib64/libc++.so",
3045 },
3046 requireVndkNamespace: false,
3047 },
3048 } {
3049 t.Run(tc.name, func(t *testing.T) {
3050 // Check linked libs
3051 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3052 libs := names(ldRule.Args["libFlags"])
3053 for _, lib := range tc.libs {
3054 ensureListContains(t, libs, lib)
3055 }
3056 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003057 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003058
Jooyung Han91f92032022-02-04 12:36:33 +09003059 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003060 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003061 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3062 if tc.requireVndkNamespace {
3063 ensureListContains(t, requireNativeLibs, ":vndk")
3064 } else {
3065 ensureListNotContains(t, requireNativeLibs, ":vndk")
3066 }
3067 })
3068 }
Jooyung Handf78e212020-07-22 15:54:47 +09003069}
3070
Justin Yun13decfb2021-03-08 19:25:55 +09003071func TestProductVariant(t *testing.T) {
3072 ctx := testApex(t, `
3073 apex {
3074 name: "myapex",
3075 key: "myapex.key",
3076 updatable: false,
3077 product_specific: true,
3078 binaries: ["foo"],
3079 }
3080
3081 apex_key {
3082 name: "myapex.key",
3083 public_key: "testkey.avbpubkey",
3084 private_key: "testkey.pem",
3085 }
3086
3087 cc_binary {
3088 name: "foo",
3089 product_available: true,
3090 apex_available: ["myapex"],
3091 srcs: ["foo.cpp"],
3092 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003093 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003094
3095 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003096 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003097 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3098 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3099 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3100 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3101}
3102
Jooyung Han8e5685d2020-09-21 11:02:57 +09003103func TestApex_withPrebuiltFirmware(t *testing.T) {
3104 testCases := []struct {
3105 name string
3106 additionalProp string
3107 }{
3108 {"system apex with prebuilt_firmware", ""},
3109 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3110 }
3111 for _, tc := range testCases {
3112 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003113 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003114 apex {
3115 name: "myapex",
3116 key: "myapex.key",
3117 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003118 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003119 `+tc.additionalProp+`
3120 }
3121 apex_key {
3122 name: "myapex.key",
3123 public_key: "testkey.avbpubkey",
3124 private_key: "testkey.pem",
3125 }
3126 prebuilt_firmware {
3127 name: "myfirmware",
3128 src: "myfirmware.bin",
3129 filename_from_src: true,
3130 `+tc.additionalProp+`
3131 }
3132 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003133 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003134 "etc/firmware/myfirmware.bin",
3135 })
3136 })
3137 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003138}
3139
Jooyung Hanefb184e2020-06-25 17:14:25 +09003140func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003141 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003142 apex {
3143 name: "myapex",
3144 key: "myapex.key",
3145 vendor: true,
3146 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003147 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003148 }
3149
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155
3156 cc_library {
3157 name: "mylib",
3158 vendor_available: true,
3159 }
3160 `)
3161
Jooyung Hana0503a52023-08-23 13:12:50 +09003162 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003163 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003164 name := apexBundle.BaseModuleName()
3165 prefix := "TARGET_"
3166 var builder strings.Builder
3167 data.Custom(&builder, name, prefix, "", data)
3168 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003169 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003170}
3171
Jooyung Han2ed99d02020-06-24 23:26:26 +09003172func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003173 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003174 apex {
3175 name: "myapex",
3176 key: "myapex.key",
3177 vintf_fragments: ["fragment.xml"],
3178 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003179 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003180 }
3181 apex_key {
3182 name: "myapex.key",
3183 public_key: "testkey.avbpubkey",
3184 private_key: "testkey.pem",
3185 }
3186 cc_binary {
3187 name: "mybin",
3188 }
3189 `)
3190
Jooyung Hana0503a52023-08-23 13:12:50 +09003191 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003192 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003193 name := apexBundle.BaseModuleName()
3194 prefix := "TARGET_"
3195 var builder strings.Builder
3196 data.Custom(&builder, name, prefix, "", data)
3197 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003198 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003199 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003200}
3201
Jiyong Park16e91a02018-12-20 18:18:08 +09003202func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003203 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003204 apex {
3205 name: "myapex",
3206 key: "myapex.key",
3207 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003208 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 }
3210
3211 apex_key {
3212 name: "myapex.key",
3213 public_key: "testkey.avbpubkey",
3214 private_key: "testkey.pem",
3215 }
3216
3217 cc_library {
3218 name: "mylib",
3219 srcs: ["mylib.cpp"],
3220 system_shared_libs: [],
3221 stl: "none",
3222 stubs: {
3223 versions: ["1", "2", "3"],
3224 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003225 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003226 }
3227
3228 cc_binary {
3229 name: "not_in_apex",
3230 srcs: ["mylib.cpp"],
3231 static_libs: ["mylib"],
3232 static_executable: true,
3233 system_shared_libs: [],
3234 stl: "none",
3235 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003236 `)
3237
Colin Cross7113d202019-11-20 16:39:12 -08003238 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003239
3240 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003241 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003242}
Jiyong Park9335a262018-12-24 11:31:58 +09003243
3244func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003245 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003246 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003247 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003248 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003249 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003250 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003251 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003252 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003253 }
3254
3255 cc_library {
3256 name: "mylib",
3257 srcs: ["mylib.cpp"],
3258 system_shared_libs: [],
3259 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003260 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003261 }
3262
3263 apex_key {
3264 name: "myapex.key",
3265 public_key: "testkey.avbpubkey",
3266 private_key: "testkey.pem",
3267 }
3268
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003269 android_app_certificate {
3270 name: "myapex.certificate",
3271 certificate: "testkey",
3272 }
3273
3274 android_app_certificate {
3275 name: "myapex.certificate.override",
3276 certificate: "testkey.override",
3277 }
3278
Jiyong Park9335a262018-12-24 11:31:58 +09003279 `)
3280
3281 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003282 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003283
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003284 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3285 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003286 "vendor/foo/devkeys/testkey.avbpubkey")
3287 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003288 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3289 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003290 "vendor/foo/devkeys/testkey.pem")
3291 }
3292
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003293 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003294 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003295 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003296 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003297 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003298 }
3299}
Jiyong Park58e364a2019-01-19 19:24:06 +09003300
Jooyung Hanf121a652019-12-17 14:30:11 +09003301func TestCertificate(t *testing.T) {
3302 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003303 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003304 apex {
3305 name: "myapex",
3306 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003307 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003308 }
3309 apex_key {
3310 name: "myapex.key",
3311 public_key: "testkey.avbpubkey",
3312 private_key: "testkey.pem",
3313 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003314 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003315 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3316 if actual := rule.Args["certificates"]; actual != expected {
3317 t.Errorf("certificates should be %q, not %q", expected, actual)
3318 }
3319 })
3320 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003321 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003322 apex {
3323 name: "myapex_keytest",
3324 key: "myapex.key",
3325 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003326 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003327 }
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333 android_app_certificate {
3334 name: "myapex.certificate.override",
3335 certificate: "testkey.override",
3336 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003337 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003338 expected := "testkey.override.x509.pem testkey.override.pk8"
3339 if actual := rule.Args["certificates"]; actual != expected {
3340 t.Errorf("certificates should be %q, not %q", expected, actual)
3341 }
3342 })
3343 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003344 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003345 apex {
3346 name: "myapex",
3347 key: "myapex.key",
3348 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003349 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003350 }
3351 apex_key {
3352 name: "myapex.key",
3353 public_key: "testkey.avbpubkey",
3354 private_key: "testkey.pem",
3355 }
3356 android_app_certificate {
3357 name: "myapex.certificate",
3358 certificate: "testkey",
3359 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003360 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003361 expected := "testkey.x509.pem testkey.pk8"
3362 if actual := rule.Args["certificates"]; actual != expected {
3363 t.Errorf("certificates should be %q, not %q", expected, actual)
3364 }
3365 })
3366 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003367 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003368 apex {
3369 name: "myapex_keytest",
3370 key: "myapex.key",
3371 file_contexts: ":myapex-file_contexts",
3372 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003373 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 }
3375 apex_key {
3376 name: "myapex.key",
3377 public_key: "testkey.avbpubkey",
3378 private_key: "testkey.pem",
3379 }
3380 android_app_certificate {
3381 name: "myapex.certificate.override",
3382 certificate: "testkey.override",
3383 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003384 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003385 expected := "testkey.override.x509.pem testkey.override.pk8"
3386 if actual := rule.Args["certificates"]; actual != expected {
3387 t.Errorf("certificates should be %q, not %q", expected, actual)
3388 }
3389 })
3390 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003391 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003392 apex {
3393 name: "myapex",
3394 key: "myapex.key",
3395 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003396 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 }
3398 apex_key {
3399 name: "myapex.key",
3400 public_key: "testkey.avbpubkey",
3401 private_key: "testkey.pem",
3402 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003403 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003404 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3405 if actual := rule.Args["certificates"]; actual != expected {
3406 t.Errorf("certificates should be %q, not %q", expected, actual)
3407 }
3408 })
3409 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003410 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 apex {
3412 name: "myapex_keytest",
3413 key: "myapex.key",
3414 file_contexts: ":myapex-file_contexts",
3415 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003416 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003417 }
3418 apex_key {
3419 name: "myapex.key",
3420 public_key: "testkey.avbpubkey",
3421 private_key: "testkey.pem",
3422 }
3423 android_app_certificate {
3424 name: "myapex.certificate.override",
3425 certificate: "testkey.override",
3426 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003427 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003428 expected := "testkey.override.x509.pem testkey.override.pk8"
3429 if actual := rule.Args["certificates"]; actual != expected {
3430 t.Errorf("certificates should be %q, not %q", expected, actual)
3431 }
3432 })
3433}
3434
Jiyong Park58e364a2019-01-19 19:24:06 +09003435func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003436 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003437 apex {
3438 name: "myapex",
3439 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003440 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003442 }
3443
3444 apex {
3445 name: "otherapex",
3446 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003447 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003448 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003449 }
3450
3451 apex_key {
3452 name: "myapex.key",
3453 public_key: "testkey.avbpubkey",
3454 private_key: "testkey.pem",
3455 }
3456
3457 cc_library {
3458 name: "mylib",
3459 srcs: ["mylib.cpp"],
3460 system_shared_libs: [],
3461 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003462 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003463 "myapex",
3464 "otherapex",
3465 ],
Jooyung Han24282772020-03-21 23:20:55 +09003466 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003467 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003468 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003469 cc_library {
3470 name: "mylib2",
3471 srcs: ["mylib.cpp"],
3472 system_shared_libs: [],
3473 stl: "none",
3474 apex_available: [
3475 "myapex",
3476 "otherapex",
3477 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003478 static_libs: ["mylib3"],
3479 recovery_available: true,
3480 min_sdk_version: "29",
3481 }
3482 cc_library {
3483 name: "mylib3",
3484 srcs: ["mylib.cpp"],
3485 system_shared_libs: [],
3486 stl: "none",
3487 apex_available: [
3488 "myapex",
3489 "otherapex",
3490 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003491 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003492 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003493 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003494 `)
3495
Jooyung Hanc87a0592020-03-02 17:44:33 +09003496 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003497 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003498 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003499
Vinh Tranf9754732023-01-19 22:41:46 -05003500 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003501 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003503
Vinh Tranf9754732023-01-19 22:41:46 -05003504 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003505 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003506 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003507
Colin Crossaede88c2020-08-11 12:17:01 -07003508 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3509 // each variant defines additional macros to distinguish which apex variant it is built for
3510
3511 // non-APEX variant does not have __ANDROID_APEX__ defined
3512 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3513 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3514
Vinh Tranf9754732023-01-19 22:41:46 -05003515 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003516 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3517 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003518
Jooyung Hanc87a0592020-03-02 17:44:33 +09003519 // non-APEX variant does not have __ANDROID_APEX__ defined
3520 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3521 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3522
Vinh Tranf9754732023-01-19 22:41:46 -05003523 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003524 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003525 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003526}
Jiyong Park7e636d02019-01-28 16:16:54 +09003527
3528func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003529 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003530 apex {
3531 name: "myapex",
3532 key: "myapex.key",
3533 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003534 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003535 }
3536
3537 apex_key {
3538 name: "myapex.key",
3539 public_key: "testkey.avbpubkey",
3540 private_key: "testkey.pem",
3541 }
3542
3543 cc_library_headers {
3544 name: "mylib_headers",
3545 export_include_dirs: ["my_include"],
3546 system_shared_libs: [],
3547 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003548 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003549 }
3550
3551 cc_library {
3552 name: "mylib",
3553 srcs: ["mylib.cpp"],
3554 system_shared_libs: [],
3555 stl: "none",
3556 header_libs: ["mylib_headers"],
3557 export_header_lib_headers: ["mylib_headers"],
3558 stubs: {
3559 versions: ["1", "2", "3"],
3560 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003561 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003562 }
3563
3564 cc_library {
3565 name: "otherlib",
3566 srcs: ["mylib.cpp"],
3567 system_shared_libs: [],
3568 stl: "none",
3569 shared_libs: ["mylib"],
3570 }
3571 `)
3572
Colin Cross7113d202019-11-20 16:39:12 -08003573 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003574
3575 // Ensure that the include path of the header lib is exported to 'otherlib'
3576 ensureContains(t, cFlags, "-Imy_include")
3577}
Alex Light9670d332019-01-29 18:07:33 -08003578
Jiyong Park7cd10e32020-01-14 09:22:18 +09003579type fileInApex struct {
3580 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003581 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003582 isLink bool
3583}
3584
Jooyung Han1724d582022-12-21 10:17:44 +09003585func (f fileInApex) String() string {
3586 return f.src + ":" + f.path
3587}
3588
3589func (f fileInApex) match(expectation string) bool {
3590 parts := strings.Split(expectation, ":")
3591 if len(parts) == 1 {
3592 match, _ := path.Match(parts[0], f.path)
3593 return match
3594 }
3595 if len(parts) == 2 {
3596 matchSrc, _ := path.Match(parts[0], f.src)
3597 matchDst, _ := path.Match(parts[1], f.path)
3598 return matchSrc && matchDst
3599 }
3600 panic("invalid expected file specification: " + expectation)
3601}
3602
Jooyung Hana57af4a2020-01-23 05:36:59 +00003603func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003604 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003605 module := ctx.ModuleForTests(moduleName, variant)
3606 apexRule := module.MaybeRule("apexRule")
3607 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003608 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003610 for _, cmd := range strings.Split(copyCmds, "&&") {
3611 cmd = strings.TrimSpace(cmd)
3612 if cmd == "" {
3613 continue
3614 }
3615 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003618 switch terms[0] {
3619 case "mkdir":
3620 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003621 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003622 t.Fatal("copyCmds contains invalid cp command", cmd)
3623 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003624 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003625 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 isLink = false
3627 case "ln":
3628 if len(terms) != 3 && len(terms) != 4 {
3629 // ln LINK TARGET or ln -s LINK TARGET
3630 t.Fatal("copyCmds contains invalid ln command", cmd)
3631 }
3632 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003633 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003634 isLink = true
3635 default:
3636 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3637 }
3638 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003640 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003641 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003642 }
Jooyung Han1724d582022-12-21 10:17:44 +09003643 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003644 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 }
3646 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003647 return ret
3648}
3649
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003650func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003651 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 var failed bool
3653 var surplus []string
3654 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003656 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003657 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003658 if file.match(expected) {
3659 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003660 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003661 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003662 }
3663 }
Jooyung Han1724d582022-12-21 10:17:44 +09003664 if !matchFound {
3665 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003666 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003668
Jooyung Han31c470b2019-10-18 16:26:59 +09003669 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003670 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003671 t.Log("surplus files", surplus)
3672 failed = true
3673 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003674
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003675 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003676 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003677 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003678 if !filesMatched[expected] {
3679 missing = append(missing, expected)
3680 }
3681 }
3682 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003683 t.Log("missing files", missing)
3684 failed = true
3685 }
3686 if failed {
3687 t.Fail()
3688 }
3689}
3690
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003691func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3692 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3693}
3694
3695func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3696 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3697 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3698 if deapexer.Output != nil {
3699 outputs = append(outputs, deapexer.Output.String())
3700 }
3701 for _, output := range deapexer.ImplicitOutputs {
3702 outputs = append(outputs, output.String())
3703 }
3704 actualFiles := make([]fileInApex, 0, len(outputs))
3705 for _, output := range outputs {
3706 dir := "/deapexer/"
3707 pos := strings.LastIndex(output, dir)
3708 if pos == -1 {
3709 t.Fatal("Unknown deapexer output ", output)
3710 }
3711 path := output[pos+len(dir):]
3712 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3713 }
3714 assertFileListEquals(t, files, actualFiles)
3715}
3716
Jooyung Han344d5432019-08-23 11:17:39 +09003717func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003718 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003719 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003720 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003721 "etc/llndk.libraries.29.txt",
3722 "etc/vndkcore.libraries.29.txt",
3723 "etc/vndksp.libraries.29.txt",
3724 "etc/vndkprivate.libraries.29.txt",
3725 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003726 }
3727 testCases := []struct {
3728 vndkVersion string
3729 expectedFiles []string
3730 }{
3731 {
3732 vndkVersion: "current",
3733 expectedFiles: append(commonFiles,
3734 "lib/libvndk.so",
3735 "lib/libvndksp.so",
3736 "lib64/libvndk.so",
3737 "lib64/libvndksp.so"),
3738 },
3739 {
3740 vndkVersion: "",
3741 expectedFiles: append(commonFiles,
3742 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3743 "lib/libvndksp.so",
3744 "lib64/libvndksp.so"),
3745 },
3746 }
3747 for _, tc := range testCases {
3748 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3749 ctx := testApex(t, `
3750 apex_vndk {
3751 name: "com.android.vndk.current",
3752 key: "com.android.vndk.current.key",
3753 updatable: false,
3754 }
3755
3756 apex_key {
3757 name: "com.android.vndk.current.key",
3758 public_key: "testkey.avbpubkey",
3759 private_key: "testkey.pem",
3760 }
3761
3762 cc_library {
3763 name: "libvndk",
3764 srcs: ["mylib.cpp"],
3765 vendor_available: true,
3766 product_available: true,
3767 vndk: {
3768 enabled: true,
3769 },
3770 system_shared_libs: [],
3771 stl: "none",
3772 apex_available: [ "com.android.vndk.current" ],
3773 }
3774
3775 cc_library {
3776 name: "libvndksp",
3777 srcs: ["mylib.cpp"],
3778 vendor_available: true,
3779 product_available: true,
3780 vndk: {
3781 enabled: true,
3782 support_system_process: true,
3783 },
3784 system_shared_libs: [],
3785 stl: "none",
3786 apex_available: [ "com.android.vndk.current" ],
3787 }
3788
3789 // VNDK-Ext should not cause any problems
3790
3791 cc_library {
3792 name: "libvndk.ext",
3793 srcs: ["mylib2.cpp"],
3794 vendor: true,
3795 vndk: {
3796 enabled: true,
3797 extends: "libvndk",
3798 },
3799 system_shared_libs: [],
3800 stl: "none",
3801 }
3802
3803 cc_library {
3804 name: "libvndksp.ext",
3805 srcs: ["mylib2.cpp"],
3806 vendor: true,
3807 vndk: {
3808 enabled: true,
3809 support_system_process: true,
3810 extends: "libvndksp",
3811 },
3812 system_shared_libs: [],
3813 stl: "none",
3814 }
3815 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3816 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003817 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003818 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003819 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003820 })
3821 }
Jooyung Han344d5432019-08-23 11:17:39 +09003822}
3823
3824func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003825 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003826 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003827 name: "com.android.vndk.current",
3828 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003830 }
3831
3832 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003833 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 public_key: "testkey.avbpubkey",
3835 private_key: "testkey.pem",
3836 }
3837
3838 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003839 name: "libvndk",
3840 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003841 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003842 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003843 vndk: {
3844 enabled: true,
3845 },
3846 system_shared_libs: [],
3847 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003848 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003849 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003850
3851 cc_prebuilt_library_shared {
3852 name: "libvndk.arm",
3853 srcs: ["libvndk.arm.so"],
3854 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003855 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003856 vndk: {
3857 enabled: true,
3858 },
3859 enabled: false,
3860 arch: {
3861 arm: {
3862 enabled: true,
3863 },
3864 },
3865 system_shared_libs: [],
3866 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003867 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003868 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 `+vndkLibrariesTxtFiles("current"),
3870 withFiles(map[string][]byte{
3871 "libvndk.so": nil,
3872 "libvndk.arm.so": nil,
3873 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003874 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003875 "lib/libvndk.so",
3876 "lib/libvndk.arm.so",
3877 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003878 "lib/libc++.so",
3879 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003880 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003881 })
Jooyung Han344d5432019-08-23 11:17:39 +09003882}
3883
Jooyung Han39edb6c2019-11-06 16:53:07 +09003884func vndkLibrariesTxtFiles(vers ...string) (result string) {
3885 for _, v := range vers {
3886 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003887 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003888 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003889 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003890 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003891 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003892 }
3893 `
3894 }
Justin Yund5784122023-10-25 13:25:32 +09003895 result += `
3896 llndk_libraries_txt {
3897 name: "llndk.libraries.txt",
3898 }
3899 llndk_libraries_txt_for_apex {
3900 name: "llndk.libraries.txt.apex",
3901 stem: "llndk.libraries.txt",
3902 insert_vndk_version: true,
3903 }
3904 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003906 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003907 result += `
3908 prebuilt_etc {
3909 name: "` + txt + `.libraries.` + v + `.txt",
3910 src: "dummy.txt",
3911 }
3912 `
3913 }
3914 }
3915 }
3916 return
3917}
3918
Jooyung Han344d5432019-08-23 11:17:39 +09003919func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003920 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003921 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003922 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003923 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003924 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003926 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003927 }
3928
3929 apex_key {
3930 name: "myapex.key",
3931 public_key: "testkey.avbpubkey",
3932 private_key: "testkey.pem",
3933 }
3934
Jooyung Han31c470b2019-10-18 16:26:59 +09003935 vndk_prebuilt_shared {
3936 name: "libvndk27",
3937 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003938 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003939 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003940 vndk: {
3941 enabled: true,
3942 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003943 target_arch: "arm64",
3944 arch: {
3945 arm: {
3946 srcs: ["libvndk27_arm.so"],
3947 },
3948 arm64: {
3949 srcs: ["libvndk27_arm64.so"],
3950 },
3951 },
Colin Cross2807f002021-03-02 10:15:29 -08003952 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003953 }
3954
3955 vndk_prebuilt_shared {
3956 name: "libvndk27",
3957 version: "27",
3958 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003959 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003960 vndk: {
3961 enabled: true,
3962 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003963 target_arch: "x86_64",
3964 arch: {
3965 x86: {
3966 srcs: ["libvndk27_x86.so"],
3967 },
3968 x86_64: {
3969 srcs: ["libvndk27_x86_64.so"],
3970 },
3971 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003972 }
3973 `+vndkLibrariesTxtFiles("27"),
3974 withFiles(map[string][]byte{
3975 "libvndk27_arm.so": nil,
3976 "libvndk27_arm64.so": nil,
3977 "libvndk27_x86.so": nil,
3978 "libvndk27_x86_64.so": nil,
3979 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003980
Jooyung Hana0503a52023-08-23 13:12:50 +09003981 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003982 "lib/libvndk27_arm.so",
3983 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003984 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 })
Jooyung Han344d5432019-08-23 11:17:39 +09003986}
3987
Jooyung Han90eee022019-10-01 20:02:42 +09003988func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003989 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003990 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003991 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003992 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003993 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003994 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003995 }
3996 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003997 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003998 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003999 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004000 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004001 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004002 }
4003 apex_key {
4004 name: "myapex.key",
4005 public_key: "testkey.avbpubkey",
4006 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004007 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004008
4009 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004010 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004011 apexManifestRule := module.Rule("apexManifestRule")
4012 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004013 }
4014
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004015 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004016 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004017}
4018
Jooyung Han344d5432019-08-23 11:17:39 +09004019func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004020 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004021 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004022 name: "com.android.vndk.current",
4023 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004025 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004026 }
4027
4028 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004029 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 public_key: "testkey.avbpubkey",
4031 private_key: "testkey.pem",
4032 }
4033
4034 cc_library {
4035 name: "libvndk",
4036 srcs: ["mylib.cpp"],
4037 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004038 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004039 native_bridge_supported: true,
4040 host_supported: true,
4041 vndk: {
4042 enabled: true,
4043 },
4044 system_shared_libs: [],
4045 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004046 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004047 }
Colin Cross2807f002021-03-02 10:15:29 -08004048 `+vndkLibrariesTxtFiles("current"),
4049 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004050
Jooyung Hana0503a52023-08-23 13:12:50 +09004051 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 "lib/libvndk.so",
4053 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004054 "lib/libc++.so",
4055 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004056 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 })
Jooyung Han344d5432019-08-23 11:17:39 +09004058}
4059
4060func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004061 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004062 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004063 name: "com.android.vndk.current",
4064 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004065 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004066 native_bridge_supported: true,
4067 }
4068
4069 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004070 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 cc_library {
4076 name: "libvndk",
4077 srcs: ["mylib.cpp"],
4078 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004079 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004080 native_bridge_supported: true,
4081 host_supported: true,
4082 vndk: {
4083 enabled: true,
4084 },
4085 system_shared_libs: [],
4086 stl: "none",
4087 }
4088 `)
4089}
4090
Jooyung Han31c470b2019-10-18 16:26:59 +09004091func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004092 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004093 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004094 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004095 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004096 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004097 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004098 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004099 }
4100
4101 apex_key {
4102 name: "myapex.key",
4103 public_key: "testkey.avbpubkey",
4104 private_key: "testkey.pem",
4105 }
4106
4107 vndk_prebuilt_shared {
4108 name: "libvndk27",
4109 version: "27",
4110 target_arch: "arm",
4111 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004112 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004113 vndk: {
4114 enabled: true,
4115 },
4116 arch: {
4117 arm: {
4118 srcs: ["libvndk27.so"],
4119 }
4120 },
4121 }
4122
4123 vndk_prebuilt_shared {
4124 name: "libvndk27",
4125 version: "27",
4126 target_arch: "arm",
4127 binder32bit: true,
4128 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004129 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 vndk: {
4131 enabled: true,
4132 },
4133 arch: {
4134 arm: {
4135 srcs: ["libvndk27binder32.so"],
4136 }
4137 },
Colin Cross2807f002021-03-02 10:15:29 -08004138 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004139 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004140 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004141 withFiles(map[string][]byte{
4142 "libvndk27.so": nil,
4143 "libvndk27binder32.so": nil,
4144 }),
4145 withBinder32bit,
4146 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004147 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004148 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4149 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004150 },
4151 }),
4152 )
4153
Jooyung Hana0503a52023-08-23 13:12:50 +09004154 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004156 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004157 })
4158}
4159
Jooyung Han45a96772020-06-15 14:59:42 +09004160func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004161 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004162 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004163 name: "com.android.vndk.current",
4164 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004165 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004166 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004167 }
4168
4169 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004170 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004171 public_key: "testkey.avbpubkey",
4172 private_key: "testkey.pem",
4173 }
4174
4175 cc_library {
4176 name: "libz",
4177 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004178 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004179 vndk: {
4180 enabled: true,
4181 },
4182 stubs: {
4183 symbol_file: "libz.map.txt",
4184 versions: ["30"],
4185 }
4186 }
4187 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4188 "libz.map.txt": nil,
4189 }))
4190
Jooyung Hana0503a52023-08-23 13:12:50 +09004191 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004192 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4193 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004194 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004195 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4196 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4197 "*/*",
4198 })
Jooyung Han45a96772020-06-15 14:59:42 +09004199}
4200
Jooyung Hane3f02812023-05-08 13:54:50 +09004201func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4202 ctx := testApex(t, "",
4203 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4204 variables.DeviceVndkVersion = proptools.StringPtr("27")
4205 }),
4206 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4207 cc.RegisterVendorSnapshotModules(ctx)
4208 }),
4209 withFiles(map[string][]byte{
4210 "vendor/foo/Android.bp": []byte(`
4211 apex {
4212 name: "myapex",
4213 binaries: ["foo"],
4214 key: "myapex.key",
4215 min_sdk_version: "27",
4216 vendor: true,
4217 }
4218
4219 cc_binary {
4220 name: "foo",
4221 vendor: true,
4222 srcs: ["abc.cpp"],
4223 shared_libs: [
4224 "libllndk",
4225 "libvndk",
4226 ],
4227 nocrt: true,
4228 system_shared_libs: [],
4229 min_sdk_version: "27",
4230 }
4231
4232 apex_key {
4233 name: "myapex.key",
4234 public_key: "testkey.avbpubkey",
4235 private_key: "testkey.pem",
4236 }
4237 `),
4238 // Simulate VNDK prebuilts with vendor_snapshot
4239 "prebuilts/vndk/Android.bp": []byte(`
4240 vndk_prebuilt_shared {
4241 name: "libllndk",
4242 version: "27",
4243 vendor_available: true,
4244 product_available: true,
4245 target_arch: "arm64",
4246 arch: {
4247 arm64: {
4248 srcs: ["libllndk.so"],
4249 },
4250 },
4251 }
4252
4253 vndk_prebuilt_shared {
4254 name: "libvndk",
4255 version: "27",
4256 vendor_available: true,
4257 product_available: true,
4258 target_arch: "arm64",
4259 arch: {
4260 arm64: {
4261 srcs: ["libvndk.so"],
4262 },
4263 },
4264 vndk: {
4265 enabled: true,
4266 },
4267 min_sdk_version: "27",
4268 }
4269
4270 vndk_prebuilt_shared {
4271 name: "libc++",
4272 version: "27",
4273 target_arch: "arm64",
4274 vendor_available: true,
4275 product_available: true,
4276 vndk: {
4277 enabled: true,
4278 support_system_process: true,
4279 },
4280 arch: {
4281 arm64: {
4282 srcs: ["libc++.so"],
4283 },
4284 },
4285 min_sdk_version: "apex_inherit",
4286 }
4287
4288 vendor_snapshot {
4289 name: "vendor_snapshot",
4290 version: "27",
4291 arch: {
4292 arm64: {
4293 vndk_libs: [
4294 "libc++",
4295 "libllndk",
4296 "libvndk",
4297 ],
4298 static_libs: [
4299 "libc++demangle",
4300 "libclang_rt.builtins",
4301 "libunwind",
4302 ],
4303 },
4304 }
4305 }
4306
4307 vendor_snapshot_static {
4308 name: "libclang_rt.builtins",
4309 version: "27",
4310 target_arch: "arm64",
4311 vendor: true,
4312 arch: {
4313 arm64: {
4314 src: "libclang_rt.builtins-aarch64-android.a",
4315 },
4316 },
4317 }
4318
4319 vendor_snapshot_static {
4320 name: "libc++demangle",
4321 version: "27",
4322 target_arch: "arm64",
4323 compile_multilib: "64",
4324 vendor: true,
4325 arch: {
4326 arm64: {
4327 src: "libc++demangle.a",
4328 },
4329 },
4330 min_sdk_version: "apex_inherit",
4331 }
4332
4333 vendor_snapshot_static {
4334 name: "libunwind",
4335 version: "27",
4336 target_arch: "arm64",
4337 compile_multilib: "64",
4338 vendor: true,
4339 arch: {
4340 arm64: {
4341 src: "libunwind.a",
4342 },
4343 },
4344 min_sdk_version: "apex_inherit",
4345 }
4346 `),
4347 }))
4348
4349 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004350 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004351 "bin/foo",
4352 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4353 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4354 })
4355
4356 // Should link foo with prebuilt libraries (shared/static)
4357 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4358 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4359 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4360 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4361 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4362
4363 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004364 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004365 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4366 ensureListContains(t, requireNativeLibs, "libllndk.so")
4367}
4368
Jooyung Hane1633032019-08-01 17:41:43 +09004369func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004370 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004371 apex {
4372 name: "myapex_nodep",
4373 key: "myapex.key",
4374 native_shared_libs: ["lib_nodep"],
4375 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004376 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004377 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004378 }
4379
4380 apex {
4381 name: "myapex_dep",
4382 key: "myapex.key",
4383 native_shared_libs: ["lib_dep"],
4384 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004385 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004386 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004387 }
4388
4389 apex {
4390 name: "myapex_provider",
4391 key: "myapex.key",
4392 native_shared_libs: ["libfoo"],
4393 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004394 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004395 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004396 }
4397
4398 apex {
4399 name: "myapex_selfcontained",
4400 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004401 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004402 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004404 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004405 }
4406
4407 apex_key {
4408 name: "myapex.key",
4409 public_key: "testkey.avbpubkey",
4410 private_key: "testkey.pem",
4411 }
4412
4413 cc_library {
4414 name: "lib_nodep",
4415 srcs: ["mylib.cpp"],
4416 system_shared_libs: [],
4417 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004418 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004419 }
4420
4421 cc_library {
4422 name: "lib_dep",
4423 srcs: ["mylib.cpp"],
4424 shared_libs: ["libfoo"],
4425 system_shared_libs: [],
4426 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004427 apex_available: [
4428 "myapex_dep",
4429 "myapex_provider",
4430 "myapex_selfcontained",
4431 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004432 }
4433
4434 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004435 name: "lib_dep_on_bar",
4436 srcs: ["mylib.cpp"],
4437 shared_libs: ["libbar"],
4438 system_shared_libs: [],
4439 stl: "none",
4440 apex_available: [
4441 "myapex_selfcontained",
4442 ],
4443 }
4444
4445
4446 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004447 name: "libfoo",
4448 srcs: ["mytest.cpp"],
4449 stubs: {
4450 versions: ["1"],
4451 },
4452 system_shared_libs: [],
4453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004454 apex_available: [
4455 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004456 ],
4457 }
4458
4459 cc_library {
4460 name: "libbar",
4461 srcs: ["mytest.cpp"],
4462 stubs: {
4463 versions: ["1"],
4464 },
4465 system_shared_libs: [],
4466 stl: "none",
4467 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004468 "myapex_selfcontained",
4469 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004470 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004471
Jooyung Hane1633032019-08-01 17:41:43 +09004472 `)
4473
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004474 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004475 var provideNativeLibs, requireNativeLibs []string
4476
Jooyung Hana0503a52023-08-23 13:12:50 +09004477 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004478 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4479 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004480 ensureListEmpty(t, provideNativeLibs)
4481 ensureListEmpty(t, requireNativeLibs)
4482
Jooyung Hana0503a52023-08-23 13:12:50 +09004483 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004484 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4485 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004486 ensureListEmpty(t, provideNativeLibs)
4487 ensureListContains(t, requireNativeLibs, "libfoo.so")
4488
Jooyung Hana0503a52023-08-23 13:12:50 +09004489 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004490 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4491 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004492 ensureListContains(t, provideNativeLibs, "libfoo.so")
4493 ensureListEmpty(t, requireNativeLibs)
4494
Jooyung Hana0503a52023-08-23 13:12:50 +09004495 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004496 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4497 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004498 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004499 ensureListEmpty(t, requireNativeLibs)
4500}
4501
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004502func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4503 ctx := testApex(t, `
4504 apex {
4505 name: "myapex",
4506 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004507 native_shared_libs: ["mylib"],
4508 updatable: false,
4509 }
4510
4511 apex_key {
4512 name: "myapex.key",
4513 public_key: "testkey.avbpubkey",
4514 private_key: "testkey.pem",
4515 }
4516
4517 cc_library {
4518 name: "mylib",
4519 srcs: ["mylib.cpp"],
4520 system_shared_libs: [],
4521 stl: "none",
4522 apex_available: [
4523 "//apex_available:platform",
4524 "myapex",
4525 ],
4526 }
4527 `, android.FixtureMergeEnv(map[string]string{
4528 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4529 }))
4530
Jooyung Hana0503a52023-08-23 13:12:50 +09004531 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004532 apexManifestRule := module.Rule("apexManifestRule")
4533 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4534}
4535
Vinh Tran8f5310f2022-10-07 18:16:47 -04004536func TestCompileMultilibProp(t *testing.T) {
4537 testCases := []struct {
4538 compileMultiLibProp string
4539 containedLibs []string
4540 notContainedLibs []string
4541 }{
4542 {
4543 containedLibs: []string{
4544 "image.apex/lib64/mylib.so",
4545 "image.apex/lib/mylib.so",
4546 },
4547 compileMultiLibProp: `compile_multilib: "both",`,
4548 },
4549 {
4550 containedLibs: []string{"image.apex/lib64/mylib.so"},
4551 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4552 compileMultiLibProp: `compile_multilib: "first",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib64/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4557 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4558 },
4559 {
4560 containedLibs: []string{"image.apex/lib64/mylib.so"},
4561 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4562 compileMultiLibProp: `compile_multilib: "64",`,
4563 },
4564 {
4565 containedLibs: []string{"image.apex/lib/mylib.so"},
4566 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4567 compileMultiLibProp: `compile_multilib: "32",`,
4568 },
4569 }
4570 for _, testCase := range testCases {
4571 ctx := testApex(t, fmt.Sprintf(`
4572 apex {
4573 name: "myapex",
4574 key: "myapex.key",
4575 %s
4576 native_shared_libs: ["mylib"],
4577 updatable: false,
4578 }
4579 apex_key {
4580 name: "myapex.key",
4581 public_key: "testkey.avbpubkey",
4582 private_key: "testkey.pem",
4583 }
4584 cc_library {
4585 name: "mylib",
4586 srcs: ["mylib.cpp"],
4587 apex_available: [
4588 "//apex_available:platform",
4589 "myapex",
4590 ],
4591 }
4592 `, testCase.compileMultiLibProp),
4593 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004594 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004595 apexRule := module.Rule("apexRule")
4596 copyCmds := apexRule.Args["copy_commands"]
4597 for _, containedLib := range testCase.containedLibs {
4598 ensureContains(t, copyCmds, containedLib)
4599 }
4600 for _, notContainedLib := range testCase.notContainedLibs {
4601 ensureNotContains(t, copyCmds, notContainedLib)
4602 }
4603 }
4604}
4605
Alex Light0851b882019-02-07 13:20:53 -08004606func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004607 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004608 apex {
4609 name: "myapex",
4610 key: "myapex.key",
4611 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004612 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004613 }
4614
4615 apex_key {
4616 name: "myapex.key",
4617 public_key: "testkey.avbpubkey",
4618 private_key: "testkey.pem",
4619 }
4620
4621 cc_library {
4622 name: "mylib_common",
4623 srcs: ["mylib.cpp"],
4624 system_shared_libs: [],
4625 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004626 apex_available: [
4627 "//apex_available:platform",
4628 "myapex",
4629 ],
Alex Light0851b882019-02-07 13:20:53 -08004630 }
4631 `)
4632
Jooyung Hana0503a52023-08-23 13:12:50 +09004633 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004634 apexRule := module.Rule("apexRule")
4635 copyCmds := apexRule.Args["copy_commands"]
4636
4637 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4638 t.Log("Apex was a test apex!")
4639 t.Fail()
4640 }
4641 // Ensure that main rule creates an output
4642 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4643
4644 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004645 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004646
4647 // Ensure that both direct and indirect deps are copied into apex
4648 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4649
Colin Cross7113d202019-11-20 16:39:12 -08004650 // Ensure that the platform variant ends with _shared
4651 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004652
Colin Cross56a83212020-09-15 18:30:11 -07004653 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004654 t.Log("Found mylib_common not in any apex!")
4655 t.Fail()
4656 }
4657}
4658
4659func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004660 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004661 apex_test {
4662 name: "myapex",
4663 key: "myapex.key",
4664 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004665 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004666 }
4667
4668 apex_key {
4669 name: "myapex.key",
4670 public_key: "testkey.avbpubkey",
4671 private_key: "testkey.pem",
4672 }
4673
4674 cc_library {
4675 name: "mylib_common_test",
4676 srcs: ["mylib.cpp"],
4677 system_shared_libs: [],
4678 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004679 // TODO: remove //apex_available:platform
4680 apex_available: [
4681 "//apex_available:platform",
4682 "myapex",
4683 ],
Alex Light0851b882019-02-07 13:20:53 -08004684 }
4685 `)
4686
Jooyung Hana0503a52023-08-23 13:12:50 +09004687 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004688 apexRule := module.Rule("apexRule")
4689 copyCmds := apexRule.Args["copy_commands"]
4690
4691 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4692 t.Log("Apex was not a test apex!")
4693 t.Fail()
4694 }
4695 // Ensure that main rule creates an output
4696 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4697
4698 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004699 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004700
4701 // Ensure that both direct and indirect deps are copied into apex
4702 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4703
Colin Cross7113d202019-11-20 16:39:12 -08004704 // Ensure that the platform variant ends with _shared
4705 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004706}
4707
Jooyung Han85707de2023-12-01 14:21:13 +09004708func TestLibzVendorIsntStable(t *testing.T) {
4709 ctx := testApex(t, `
4710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
4713 updatable: false,
4714 binaries: ["mybin"],
4715 }
4716 apex {
4717 name: "myvendorapex",
4718 key: "myapex.key",
4719 file_contexts: "myvendorapex_file_contexts",
4720 vendor: true,
4721 updatable: false,
4722 binaries: ["mybin"],
4723 }
4724 apex_key {
4725 name: "myapex.key",
4726 public_key: "testkey.avbpubkey",
4727 private_key: "testkey.pem",
4728 }
4729 cc_binary {
4730 name: "mybin",
4731 vendor_available: true,
4732 system_shared_libs: [],
4733 stl: "none",
4734 shared_libs: ["libz"],
4735 apex_available: ["//apex_available:anyapex"],
4736 }
4737 cc_library {
4738 name: "libz",
4739 vendor_available: true,
4740 system_shared_libs: [],
4741 stl: "none",
4742 stubs: {
4743 versions: ["28", "30"],
4744 },
4745 target: {
4746 vendor: {
4747 no_stubs: true,
4748 },
4749 },
4750 }
4751 `, withFiles(map[string][]byte{
4752 "myvendorapex_file_contexts": nil,
4753 }))
4754
4755 // libz provides stubs for core variant.
4756 {
4757 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4758 "bin/mybin",
4759 })
4760 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4761 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4762 }
4763 // libz doesn't provide stubs for vendor variant.
4764 {
4765 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4766 "bin/mybin",
4767 "lib64/libz.so",
4768 })
4769 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4770 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4771 }
4772}
4773
Alex Light9670d332019-01-29 18:07:33 -08004774func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004775 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004776 apex {
4777 name: "myapex",
4778 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004779 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004780 multilib: {
4781 first: {
4782 native_shared_libs: ["mylib_common"],
4783 }
4784 },
4785 target: {
4786 android: {
4787 multilib: {
4788 first: {
4789 native_shared_libs: ["mylib"],
4790 }
4791 }
4792 },
4793 host: {
4794 multilib: {
4795 first: {
4796 native_shared_libs: ["mylib2"],
4797 }
4798 }
4799 }
4800 }
4801 }
4802
4803 apex_key {
4804 name: "myapex.key",
4805 public_key: "testkey.avbpubkey",
4806 private_key: "testkey.pem",
4807 }
4808
4809 cc_library {
4810 name: "mylib",
4811 srcs: ["mylib.cpp"],
4812 system_shared_libs: [],
4813 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004814 // TODO: remove //apex_available:platform
4815 apex_available: [
4816 "//apex_available:platform",
4817 "myapex",
4818 ],
Alex Light9670d332019-01-29 18:07:33 -08004819 }
4820
4821 cc_library {
4822 name: "mylib_common",
4823 srcs: ["mylib.cpp"],
4824 system_shared_libs: [],
4825 stl: "none",
4826 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004827 // TODO: remove //apex_available:platform
4828 apex_available: [
4829 "//apex_available:platform",
4830 "myapex",
4831 ],
Alex Light9670d332019-01-29 18:07:33 -08004832 }
4833
4834 cc_library {
4835 name: "mylib2",
4836 srcs: ["mylib.cpp"],
4837 system_shared_libs: [],
4838 stl: "none",
4839 compile_multilib: "first",
4840 }
4841 `)
4842
Jooyung Hana0503a52023-08-23 13:12:50 +09004843 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004844 copyCmds := apexRule.Args["copy_commands"]
4845
4846 // Ensure that main rule creates an output
4847 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4848
4849 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004850 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4851 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4852 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004853
4854 // Ensure that both direct and indirect deps are copied into apex
4855 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4856 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4857 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4858
Colin Cross7113d202019-11-20 16:39:12 -08004859 // Ensure that the platform variant ends with _shared
4860 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4861 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4862 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004863}
Jiyong Park04480cf2019-02-06 00:16:29 +09004864
Jiyong Park59140302020-12-14 18:44:04 +09004865func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004866 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004867 apex {
4868 name: "myapex",
4869 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004870 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004871 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004872 arch: {
4873 arm64: {
4874 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004875 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004876 },
4877 x86_64: {
4878 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004879 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004880 },
4881 }
4882 }
4883
4884 apex_key {
4885 name: "myapex.key",
4886 public_key: "testkey.avbpubkey",
4887 private_key: "testkey.pem",
4888 }
4889
4890 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004891 name: "mylib.generic",
4892 srcs: ["mylib.cpp"],
4893 system_shared_libs: [],
4894 stl: "none",
4895 // TODO: remove //apex_available:platform
4896 apex_available: [
4897 "//apex_available:platform",
4898 "myapex",
4899 ],
4900 }
4901
4902 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004903 name: "mylib.arm64",
4904 srcs: ["mylib.cpp"],
4905 system_shared_libs: [],
4906 stl: "none",
4907 // TODO: remove //apex_available:platform
4908 apex_available: [
4909 "//apex_available:platform",
4910 "myapex",
4911 ],
4912 }
4913
4914 cc_library {
4915 name: "mylib.x64",
4916 srcs: ["mylib.cpp"],
4917 system_shared_libs: [],
4918 stl: "none",
4919 // TODO: remove //apex_available:platform
4920 apex_available: [
4921 "//apex_available:platform",
4922 "myapex",
4923 ],
4924 }
4925 `)
4926
Jooyung Hana0503a52023-08-23 13:12:50 +09004927 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004928 copyCmds := apexRule.Args["copy_commands"]
4929
4930 // Ensure that apex variant is created for the direct dep
4931 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004932 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004933 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4934
4935 // Ensure that both direct and indirect deps are copied into apex
4936 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4937 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4938}
4939
Jiyong Park04480cf2019-02-06 00:16:29 +09004940func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004941 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004942 apex {
4943 name: "myapex",
4944 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004945 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004946 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004947 }
4948
4949 apex_key {
4950 name: "myapex.key",
4951 public_key: "testkey.avbpubkey",
4952 private_key: "testkey.pem",
4953 }
4954
4955 sh_binary {
4956 name: "myscript",
4957 src: "mylib.cpp",
4958 filename: "myscript.sh",
4959 sub_dir: "script",
4960 }
4961 `)
4962
Jooyung Hana0503a52023-08-23 13:12:50 +09004963 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004964 copyCmds := apexRule.Args["copy_commands"]
4965
4966 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4967}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004968
Jooyung Han91df2082019-11-20 01:49:42 +09004969func TestApexInVariousPartition(t *testing.T) {
4970 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004971 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004972 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004973 {"", "system"},
4974 {"product_specific: true", "product"},
4975 {"soc_specific: true", "vendor"},
4976 {"proprietary: true", "vendor"},
4977 {"vendor: true", "vendor"},
4978 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004979 }
4980 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004981 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004982 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004983 apex {
4984 name: "myapex",
4985 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004986 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004987 `+tc.propName+`
4988 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004989
Jooyung Han91df2082019-11-20 01:49:42 +09004990 apex_key {
4991 name: "myapex.key",
4992 public_key: "testkey.avbpubkey",
4993 private_key: "testkey.pem",
4994 }
4995 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004996
Jooyung Hana0503a52023-08-23 13:12:50 +09004997 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004998 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004999 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005000 if actual != expected {
5001 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5002 }
Jooyung Han91df2082019-11-20 01:49:42 +09005003 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005004 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005005}
Jiyong Park67882562019-03-21 01:11:21 +09005006
Jooyung Han580eb4f2020-06-24 19:33:06 +09005007func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005008 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005009 apex {
5010 name: "myapex",
5011 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005012 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005013 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005014
Jooyung Han580eb4f2020-06-24 19:33:06 +09005015 apex_key {
5016 name: "myapex.key",
5017 public_key: "testkey.avbpubkey",
5018 private_key: "testkey.pem",
5019 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005020 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005021 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005022 rule := module.Output("file_contexts")
5023 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5024}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025
Jooyung Han580eb4f2020-06-24 19:33:06 +09005026func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005027 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005028 apex {
5029 name: "myapex",
5030 key: "myapex.key",
5031 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005032 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005033 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005034
Jooyung Han580eb4f2020-06-24 19:33:06 +09005035 apex_key {
5036 name: "myapex.key",
5037 public_key: "testkey.avbpubkey",
5038 private_key: "testkey.pem",
5039 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005040 `, withFiles(map[string][]byte{
5041 "my_own_file_contexts": nil,
5042 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005046 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005047 apex {
5048 name: "myapex",
5049 key: "myapex.key",
5050 product_specific: true,
5051 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005052 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005053 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005054
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055 apex_key {
5056 name: "myapex.key",
5057 public_key: "testkey.avbpubkey",
5058 private_key: "testkey.pem",
5059 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005060 `)
5061
Colin Cross1c460562021-02-16 17:55:47 -08005062 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005063 apex {
5064 name: "myapex",
5065 key: "myapex.key",
5066 product_specific: true,
5067 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005068 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005069 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005070
Jooyung Han580eb4f2020-06-24 19:33:06 +09005071 apex_key {
5072 name: "myapex.key",
5073 public_key: "testkey.avbpubkey",
5074 private_key: "testkey.pem",
5075 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076 `, withFiles(map[string][]byte{
5077 "product_specific_file_contexts": nil,
5078 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005079 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005080 rule := module.Output("file_contexts")
5081 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5082}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005083
Jooyung Han580eb4f2020-06-24 19:33:06 +09005084func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005085 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005086 apex {
5087 name: "myapex",
5088 key: "myapex.key",
5089 product_specific: true,
5090 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005091 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005092 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005093
Jooyung Han580eb4f2020-06-24 19:33:06 +09005094 apex_key {
5095 name: "myapex.key",
5096 public_key: "testkey.avbpubkey",
5097 private_key: "testkey.pem",
5098 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005099
Jooyung Han580eb4f2020-06-24 19:33:06 +09005100 filegroup {
5101 name: "my-file-contexts",
5102 srcs: ["product_specific_file_contexts"],
5103 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005104 `, withFiles(map[string][]byte{
5105 "product_specific_file_contexts": nil,
5106 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005107 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005108 rule := module.Output("file_contexts")
5109 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005110}
5111
Jiyong Park67882562019-03-21 01:11:21 +09005112func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005113 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005114 apex_key {
5115 name: "myapex.key",
5116 public_key: ":my.avbpubkey",
5117 private_key: ":my.pem",
5118 product_specific: true,
5119 }
5120
5121 filegroup {
5122 name: "my.avbpubkey",
5123 srcs: ["testkey2.avbpubkey"],
5124 }
5125
5126 filegroup {
5127 name: "my.pem",
5128 srcs: ["testkey2.pem"],
5129 }
5130 `)
5131
5132 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5133 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005134 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005135 if actual_pubkey != expected_pubkey {
5136 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5137 }
5138 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005139 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005140 if actual_privkey != expected_privkey {
5141 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5142 }
5143}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005144
5145func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005146 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005147 prebuilt_apex {
5148 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005149 arch: {
5150 arm64: {
5151 src: "myapex-arm64.apex",
5152 },
5153 arm: {
5154 src: "myapex-arm.apex",
5155 },
5156 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005157 }
5158 `)
5159
Wei Li340ee8e2022-03-18 17:33:24 -07005160 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5161 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005162
Jiyong Parkc95714e2019-03-29 14:23:10 +09005163 expectedInput := "myapex-arm64.apex"
5164 if prebuilt.inputApex.String() != expectedInput {
5165 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5166 }
Wei Li340ee8e2022-03-18 17:33:24 -07005167 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5168 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5169 rule := testingModule.Rule("genProvenanceMetaData")
5170 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5171 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5172 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5173 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005174
5175 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5176 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005177}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005178
Paul Duffinc0609c62021-03-01 17:27:16 +00005179func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005180 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005181 prebuilt_apex {
5182 name: "myapex",
5183 }
5184 `)
5185}
5186
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005187func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005188 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005189 prebuilt_apex {
5190 name: "myapex",
5191 src: "myapex-arm.apex",
5192 filename: "notmyapex.apex",
5193 }
5194 `)
5195
Wei Li340ee8e2022-03-18 17:33:24 -07005196 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5197 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005198
5199 expected := "notmyapex.apex"
5200 if p.installFilename != expected {
5201 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5202 }
Wei Li340ee8e2022-03-18 17:33:24 -07005203 rule := testingModule.Rule("genProvenanceMetaData")
5204 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5205 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5206 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5207 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005208}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005209
Samiul Islam7c02e262021-09-08 17:48:28 +01005210func TestApexSetFilenameOverride(t *testing.T) {
5211 testApex(t, `
5212 apex_set {
5213 name: "com.company.android.myapex",
5214 apex_name: "com.android.myapex",
5215 set: "company-myapex.apks",
5216 filename: "com.company.android.myapex.apex"
5217 }
5218 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5219
5220 testApex(t, `
5221 apex_set {
5222 name: "com.company.android.myapex",
5223 apex_name: "com.android.myapex",
5224 set: "company-myapex.apks",
5225 filename: "com.company.android.myapex.capex"
5226 }
5227 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5228
5229 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5230 apex_set {
5231 name: "com.company.android.myapex",
5232 apex_name: "com.android.myapex",
5233 set: "company-myapex.apks",
5234 filename: "some-random-suffix"
5235 }
5236 `)
5237}
5238
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005239func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005240 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005241 prebuilt_apex {
5242 name: "myapex.prebuilt",
5243 src: "myapex-arm.apex",
5244 overrides: [
5245 "myapex",
5246 ],
5247 }
5248 `)
5249
Wei Li340ee8e2022-03-18 17:33:24 -07005250 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5251 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005252
5253 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005254 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005255 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005256 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005257 }
Wei Li340ee8e2022-03-18 17:33:24 -07005258 rule := testingModule.Rule("genProvenanceMetaData")
5259 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5260 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5261 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5262 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005263}
5264
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005265func TestPrebuiltApexName(t *testing.T) {
5266 testApex(t, `
5267 prebuilt_apex {
5268 name: "com.company.android.myapex",
5269 apex_name: "com.android.myapex",
5270 src: "company-myapex-arm.apex",
5271 }
5272 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5273
5274 testApex(t, `
5275 apex_set {
5276 name: "com.company.android.myapex",
5277 apex_name: "com.android.myapex",
5278 set: "company-myapex.apks",
5279 }
5280 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5281}
5282
5283func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5284 _ = android.GroupFixturePreparers(
5285 java.PrepareForTestWithJavaDefaultModules,
5286 PrepareForTestWithApexBuildComponents,
5287 android.FixtureWithRootAndroidBp(`
5288 platform_bootclasspath {
5289 name: "platform-bootclasspath",
5290 fragments: [
5291 {
5292 apex: "com.android.art",
5293 module: "art-bootclasspath-fragment",
5294 },
5295 ],
5296 }
5297
5298 prebuilt_apex {
5299 name: "com.company.android.art",
5300 apex_name: "com.android.art",
5301 src: "com.company.android.art-arm.apex",
5302 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5303 }
5304
5305 prebuilt_bootclasspath_fragment {
5306 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005307 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005308 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005309 hidden_api: {
5310 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5311 metadata: "my-bootclasspath-fragment/metadata.csv",
5312 index: "my-bootclasspath-fragment/index.csv",
5313 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5314 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5315 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005316 }
5317
5318 java_import {
5319 name: "core-oj",
5320 jars: ["prebuilt.jar"],
5321 }
5322 `),
5323 ).RunTest(t)
5324}
5325
Paul Duffin092153d2021-01-26 11:42:39 +00005326// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5327// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005328func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005329 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005330
Paul Duffin89886cb2021-02-05 16:44:03 +00005331 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005332 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005333 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005334 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005335 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005336 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005337 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5338 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5339 android.NormalizePathForTesting(dexJarBuildPath))
5340 }
5341
5342 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005343 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005344 // Make sure the import has been given the correct path to the dex jar.
5345 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5346 dexJarBuildPath := p.DexJarInstallPath()
5347 stem := android.RemoveOptionalPrebuiltPrefix(name)
5348 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5349 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5350 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005351 }
5352
Paul Duffin39853512021-02-26 11:09:39 +00005353 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005354 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005355 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005356 android.AssertArrayString(t, "Check if there is no source variant",
5357 []string{"android_common"},
5358 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005359 }
5360
5361 t.Run("prebuilt only", func(t *testing.T) {
5362 bp := `
5363 prebuilt_apex {
5364 name: "myapex",
5365 arch: {
5366 arm64: {
5367 src: "myapex-arm64.apex",
5368 },
5369 arm: {
5370 src: "myapex-arm.apex",
5371 },
5372 },
Paul Duffin39853512021-02-26 11:09:39 +00005373 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005374 }
5375
5376 java_import {
5377 name: "libfoo",
5378 jars: ["libfoo.jar"],
5379 }
Paul Duffin39853512021-02-26 11:09:39 +00005380
5381 java_sdk_library_import {
5382 name: "libbar",
5383 public: {
5384 jars: ["libbar.jar"],
5385 },
5386 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005387 `
5388
5389 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5390 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5391
Martin Stjernholm44825602021-09-17 01:44:12 +01005392 deapexerName := deapexerModuleName("myapex")
5393 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5394
Paul Duffinf6932af2021-02-26 18:21:56 +00005395 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005396 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005397 rule := deapexer.Rule("deapexer")
5398 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5399 t.Errorf("expected: %q, found: %q", expected, actual)
5400 }
5401
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005402 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005403 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005404 rule = prebuiltApex.Rule("android/soong/android.Cp")
5405 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5406 t.Errorf("expected: %q, found: %q", expected, actual)
5407 }
5408
Paul Duffin89886cb2021-02-05 16:44:03 +00005409 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005410 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005411
5412 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005413 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005414 })
5415
5416 t.Run("prebuilt with source preferred", func(t *testing.T) {
5417
5418 bp := `
5419 prebuilt_apex {
5420 name: "myapex",
5421 arch: {
5422 arm64: {
5423 src: "myapex-arm64.apex",
5424 },
5425 arm: {
5426 src: "myapex-arm.apex",
5427 },
5428 },
Paul Duffin39853512021-02-26 11:09:39 +00005429 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005430 }
5431
5432 java_import {
5433 name: "libfoo",
5434 jars: ["libfoo.jar"],
5435 }
5436
5437 java_library {
5438 name: "libfoo",
5439 }
Paul Duffin39853512021-02-26 11:09:39 +00005440
5441 java_sdk_library_import {
5442 name: "libbar",
5443 public: {
5444 jars: ["libbar.jar"],
5445 },
5446 }
5447
5448 java_sdk_library {
5449 name: "libbar",
5450 srcs: ["foo/bar/MyClass.java"],
5451 unsafe_ignore_missing_latest_api: true,
5452 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005453 `
5454
5455 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5456 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5457
Paul Duffin89886cb2021-02-05 16:44:03 +00005458 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005459 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005460 ensureNoSourceVariant(t, ctx, "libfoo")
5461
5462 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005463 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005464 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005465 })
5466
5467 t.Run("prebuilt preferred with source", func(t *testing.T) {
5468 bp := `
5469 prebuilt_apex {
5470 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005471 arch: {
5472 arm64: {
5473 src: "myapex-arm64.apex",
5474 },
5475 arm: {
5476 src: "myapex-arm.apex",
5477 },
5478 },
Paul Duffin39853512021-02-26 11:09:39 +00005479 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005480 }
5481
5482 java_import {
5483 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005484 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005485 jars: ["libfoo.jar"],
5486 }
5487
5488 java_library {
5489 name: "libfoo",
5490 }
Paul Duffin39853512021-02-26 11:09:39 +00005491
5492 java_sdk_library_import {
5493 name: "libbar",
5494 prefer: true,
5495 public: {
5496 jars: ["libbar.jar"],
5497 },
5498 }
5499
5500 java_sdk_library {
5501 name: "libbar",
5502 srcs: ["foo/bar/MyClass.java"],
5503 unsafe_ignore_missing_latest_api: true,
5504 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005505 `
5506
5507 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5508 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5509
Paul Duffin89886cb2021-02-05 16:44:03 +00005510 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005511 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005512 ensureNoSourceVariant(t, ctx, "libfoo")
5513
5514 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005515 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005516 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005517 })
5518}
5519
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005520func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005521 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005522 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005523 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5524 // is disabled.
5525 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5526 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005527
Paul Duffin37856732021-02-26 14:24:15 +00005528 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5529 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005530 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005531 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005532 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005533 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005534 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005535 foundLibfooJar = true
5536 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005537 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 }
5539 }
5540 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005541 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 +00005542 }
5543 }
5544
Paul Duffin40a3f652021-07-19 13:11:24 +01005545 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005546 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005547 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005548 var rule android.TestingBuildParams
5549
5550 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5551 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005552 }
5553
Paul Duffin40a3f652021-07-19 13:11:24 +01005554 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5555 t.Helper()
5556 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5557 var rule android.TestingBuildParams
5558
5559 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5560 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5561 }
5562
Paul Duffin89f570a2021-06-16 01:42:33 +01005563 fragment := java.ApexVariantReference{
5564 Apex: proptools.StringPtr("myapex"),
5565 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5566 }
5567
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005568 t.Run("prebuilt only", func(t *testing.T) {
5569 bp := `
5570 prebuilt_apex {
5571 name: "myapex",
5572 arch: {
5573 arm64: {
5574 src: "myapex-arm64.apex",
5575 },
5576 arm: {
5577 src: "myapex-arm.apex",
5578 },
5579 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005580 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5581 }
5582
5583 prebuilt_bootclasspath_fragment {
5584 name: "my-bootclasspath-fragment",
5585 contents: ["libfoo", "libbar"],
5586 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005587 hidden_api: {
5588 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5589 metadata: "my-bootclasspath-fragment/metadata.csv",
5590 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005591 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5592 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5593 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005594 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005595 }
5596
5597 java_import {
5598 name: "libfoo",
5599 jars: ["libfoo.jar"],
5600 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005601 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005602 }
Paul Duffin37856732021-02-26 14:24:15 +00005603
5604 java_sdk_library_import {
5605 name: "libbar",
5606 public: {
5607 jars: ["libbar.jar"],
5608 },
5609 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005610 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005611 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005612 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005613 `
5614
Paul Duffin89f570a2021-06-16 01:42:33 +01005615 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005616 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5617 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005618
Paul Duffin537ea3d2021-05-14 10:38:00 +01005619 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005620 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005621 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005622 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005623 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005624 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 +01005625 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005626 })
5627
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005628 t.Run("apex_set only", func(t *testing.T) {
5629 bp := `
5630 apex_set {
5631 name: "myapex",
5632 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005633 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005634 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005635 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5636 }
5637
5638 java_import {
5639 name: "myjavalib",
5640 jars: ["myjavalib.jar"],
5641 apex_available: ["myapex"],
5642 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005643 }
5644
5645 prebuilt_bootclasspath_fragment {
5646 name: "my-bootclasspath-fragment",
5647 contents: ["libfoo", "libbar"],
5648 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005649 hidden_api: {
5650 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5651 metadata: "my-bootclasspath-fragment/metadata.csv",
5652 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005653 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5654 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5655 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005656 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005657 }
5658
Liz Kammer2dc72442023-04-20 10:10:48 -04005659 prebuilt_systemserverclasspath_fragment {
5660 name: "my-systemserverclasspath-fragment",
5661 contents: ["libbaz"],
5662 apex_available: ["myapex"],
5663 }
5664
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005665 java_import {
5666 name: "libfoo",
5667 jars: ["libfoo.jar"],
5668 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005669 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005670 }
5671
5672 java_sdk_library_import {
5673 name: "libbar",
5674 public: {
5675 jars: ["libbar.jar"],
5676 },
5677 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005678 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005679 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005680 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005681
5682 java_sdk_library_import {
5683 name: "libbaz",
5684 public: {
5685 jars: ["libbaz.jar"],
5686 },
5687 apex_available: ["myapex"],
5688 shared_library: false,
5689 permitted_packages: ["baz"],
5690 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005691 `
5692
Paul Duffin89f570a2021-06-16 01:42:33 +01005693 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005694 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5695 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5696
Paul Duffin537ea3d2021-05-14 10:38:00 +01005697 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005698 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005699 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005700 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005701 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005702 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 +01005703 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005704
5705 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5706
5707 overrideNames := []string{
5708 "",
5709 "myjavalib.myapex",
5710 "libfoo.myapex",
5711 "libbar.myapex",
5712 "libbaz.myapex",
5713 }
5714 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5715 for i, e := range mkEntries {
5716 g := e.OverrideName
5717 if w := overrideNames[i]; w != g {
5718 t.Errorf("Expected override name %q, got %q", w, g)
5719 }
5720 }
5721
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005722 })
5723
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005724 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5725 bp := `
5726 prebuilt_apex {
5727 name: "myapex",
5728 arch: {
5729 arm64: {
5730 src: "myapex-arm64.apex",
5731 },
5732 arm: {
5733 src: "myapex-arm.apex",
5734 },
5735 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005736 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5737 }
5738
5739 prebuilt_bootclasspath_fragment {
5740 name: "my-bootclasspath-fragment",
5741 contents: ["libfoo", "libbar"],
5742 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005743 hidden_api: {
5744 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5745 metadata: "my-bootclasspath-fragment/metadata.csv",
5746 index: "my-bootclasspath-fragment/index.csv",
5747 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5748 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5749 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005750 }
5751
5752 java_import {
5753 name: "libfoo",
5754 jars: ["libfoo.jar"],
5755 apex_available: ["myapex"],
5756 }
5757
5758 java_library {
5759 name: "libfoo",
5760 srcs: ["foo/bar/MyClass.java"],
5761 apex_available: ["myapex"],
5762 }
Paul Duffin37856732021-02-26 14:24:15 +00005763
5764 java_sdk_library_import {
5765 name: "libbar",
5766 public: {
5767 jars: ["libbar.jar"],
5768 },
5769 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005770 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005771 }
5772
5773 java_sdk_library {
5774 name: "libbar",
5775 srcs: ["foo/bar/MyClass.java"],
5776 unsafe_ignore_missing_latest_api: true,
5777 apex_available: ["myapex"],
5778 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005779 `
5780
5781 // In this test the source (java_library) libfoo is active since the
5782 // prebuilt (java_import) defaults to prefer:false. However the
5783 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5784 // find the dex boot jar in it. We either need to disable the source libfoo
5785 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005786 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005787 // dexbootjar check is skipped if AllowMissingDependencies is true
5788 preparerAllowMissingDeps := android.GroupFixturePreparers(
5789 preparer,
5790 android.PrepareForTestWithAllowMissingDependencies,
5791 )
5792 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005793 })
5794
5795 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5796 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005797 apex {
5798 name: "myapex",
5799 key: "myapex.key",
5800 updatable: false,
5801 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5802 }
5803
5804 apex_key {
5805 name: "myapex.key",
5806 public_key: "testkey.avbpubkey",
5807 private_key: "testkey.pem",
5808 }
5809
5810 bootclasspath_fragment {
5811 name: "my-bootclasspath-fragment",
5812 contents: ["libfoo", "libbar"],
5813 apex_available: ["myapex"],
5814 hidden_api: {
5815 split_packages: ["*"],
5816 },
5817 }
5818
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005819 prebuilt_apex {
5820 name: "myapex",
5821 arch: {
5822 arm64: {
5823 src: "myapex-arm64.apex",
5824 },
5825 arm: {
5826 src: "myapex-arm.apex",
5827 },
5828 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005829 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5830 }
5831
5832 prebuilt_bootclasspath_fragment {
5833 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005834 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005835 contents: ["libfoo", "libbar"],
5836 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005837 hidden_api: {
5838 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5839 metadata: "my-bootclasspath-fragment/metadata.csv",
5840 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005841 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5842 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5843 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005844 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005845 }
5846
5847 java_import {
5848 name: "libfoo",
5849 prefer: true,
5850 jars: ["libfoo.jar"],
5851 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005852 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005853 }
5854
5855 java_library {
5856 name: "libfoo",
5857 srcs: ["foo/bar/MyClass.java"],
5858 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005859 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005860 }
Paul Duffin37856732021-02-26 14:24:15 +00005861
5862 java_sdk_library_import {
5863 name: "libbar",
5864 prefer: true,
5865 public: {
5866 jars: ["libbar.jar"],
5867 },
5868 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005869 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005870 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005871 }
5872
5873 java_sdk_library {
5874 name: "libbar",
5875 srcs: ["foo/bar/MyClass.java"],
5876 unsafe_ignore_missing_latest_api: true,
5877 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005878 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005879 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005880 `
5881
Paul Duffin89f570a2021-06-16 01:42:33 +01005882 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005883 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5884 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005885
Paul Duffin537ea3d2021-05-14 10:38:00 +01005886 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005887 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005888 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005889 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005890 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005891 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 +01005892 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005893 })
5894
5895 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5896 bp := `
5897 apex {
5898 name: "myapex",
5899 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005900 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005901 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005902 }
5903
5904 apex_key {
5905 name: "myapex.key",
5906 public_key: "testkey.avbpubkey",
5907 private_key: "testkey.pem",
5908 }
5909
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005910 bootclasspath_fragment {
5911 name: "my-bootclasspath-fragment",
5912 contents: ["libfoo", "libbar"],
5913 apex_available: ["myapex"],
5914 hidden_api: {
5915 split_packages: ["*"],
5916 },
5917 }
5918
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005919 prebuilt_apex {
5920 name: "myapex",
5921 arch: {
5922 arm64: {
5923 src: "myapex-arm64.apex",
5924 },
5925 arm: {
5926 src: "myapex-arm.apex",
5927 },
5928 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005929 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5930 }
5931
5932 prebuilt_bootclasspath_fragment {
5933 name: "my-bootclasspath-fragment",
5934 contents: ["libfoo", "libbar"],
5935 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005936 hidden_api: {
5937 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5938 metadata: "my-bootclasspath-fragment/metadata.csv",
5939 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005940 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5941 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5942 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005943 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005944 }
5945
5946 java_import {
5947 name: "libfoo",
5948 jars: ["libfoo.jar"],
5949 apex_available: ["myapex"],
5950 }
5951
5952 java_library {
5953 name: "libfoo",
5954 srcs: ["foo/bar/MyClass.java"],
5955 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005956 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005957 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005958 }
Paul Duffin37856732021-02-26 14:24:15 +00005959
5960 java_sdk_library_import {
5961 name: "libbar",
5962 public: {
5963 jars: ["libbar.jar"],
5964 },
5965 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005966 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005967 }
5968
5969 java_sdk_library {
5970 name: "libbar",
5971 srcs: ["foo/bar/MyClass.java"],
5972 unsafe_ignore_missing_latest_api: true,
5973 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005974 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005975 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005976 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005977 `
5978
Paul Duffin89f570a2021-06-16 01:42:33 +01005979 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005980 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5981 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 +00005982
Paul Duffin537ea3d2021-05-14 10:38:00 +01005983 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005984 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005985 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5986 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005987 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5988 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 +01005989 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005990 })
5991
5992 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5993 bp := `
5994 apex {
5995 name: "myapex",
5996 enabled: false,
5997 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005998 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005999 }
6000
6001 apex_key {
6002 name: "myapex.key",
6003 public_key: "testkey.avbpubkey",
6004 private_key: "testkey.pem",
6005 }
6006
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006007 bootclasspath_fragment {
6008 name: "my-bootclasspath-fragment",
6009 enabled: false,
6010 contents: ["libfoo", "libbar"],
6011 apex_available: ["myapex"],
6012 hidden_api: {
6013 split_packages: ["*"],
6014 },
6015 }
6016
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006017 prebuilt_apex {
6018 name: "myapex",
6019 arch: {
6020 arm64: {
6021 src: "myapex-arm64.apex",
6022 },
6023 arm: {
6024 src: "myapex-arm.apex",
6025 },
6026 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006027 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6028 }
6029
6030 prebuilt_bootclasspath_fragment {
6031 name: "my-bootclasspath-fragment",
6032 contents: ["libfoo", "libbar"],
6033 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006034 hidden_api: {
6035 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6036 metadata: "my-bootclasspath-fragment/metadata.csv",
6037 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006038 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6039 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6040 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006041 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006042 }
6043
6044 java_import {
6045 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006046 jars: ["libfoo.jar"],
6047 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006048 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006049 }
6050
6051 java_library {
6052 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006053 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006054 srcs: ["foo/bar/MyClass.java"],
6055 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006056 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006057 }
Paul Duffin37856732021-02-26 14:24:15 +00006058
6059 java_sdk_library_import {
6060 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006061 public: {
6062 jars: ["libbar.jar"],
6063 },
6064 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006065 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006066 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006067 }
6068
6069 java_sdk_library {
6070 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006071 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006072 srcs: ["foo/bar/MyClass.java"],
6073 unsafe_ignore_missing_latest_api: true,
6074 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006075 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006076 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006077 `
6078
Paul Duffin89f570a2021-06-16 01:42:33 +01006079 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006080 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6081 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006082
Paul Duffin537ea3d2021-05-14 10:38:00 +01006083 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006084 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006085 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006086 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006087 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006088 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 +01006089 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006090 })
6091}
6092
Roland Levillain630846d2019-06-26 12:48:34 +01006093func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006094 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006095 apex_test {
6096 name: "myapex",
6097 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006098 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006099 tests: [
6100 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006101 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006102 ],
6103 }
6104
6105 apex_key {
6106 name: "myapex.key",
6107 public_key: "testkey.avbpubkey",
6108 private_key: "testkey.pem",
6109 }
6110
Liz Kammer1c14a212020-05-12 15:26:55 -07006111 filegroup {
6112 name: "fg",
6113 srcs: [
6114 "baz",
6115 "bar/baz"
6116 ],
6117 }
6118
Roland Levillain630846d2019-06-26 12:48:34 +01006119 cc_test {
6120 name: "mytest",
6121 gtest: false,
6122 srcs: ["mytest.cpp"],
6123 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006124 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006125 system_shared_libs: [],
6126 static_executable: true,
6127 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006128 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006129 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006130
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006131 cc_library {
6132 name: "mylib",
6133 srcs: ["mylib.cpp"],
6134 system_shared_libs: [],
6135 stl: "none",
6136 }
6137
Liz Kammer5bd365f2020-05-27 15:15:11 -07006138 filegroup {
6139 name: "fg2",
6140 srcs: [
6141 "testdata/baz"
6142 ],
6143 }
6144
Roland Levillain9b5fde92019-06-28 15:41:19 +01006145 cc_test {
6146 name: "mytests",
6147 gtest: false,
6148 srcs: [
6149 "mytest1.cpp",
6150 "mytest2.cpp",
6151 "mytest3.cpp",
6152 ],
6153 test_per_src: true,
6154 relative_install_path: "test",
6155 system_shared_libs: [],
6156 static_executable: true,
6157 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006158 data: [
6159 ":fg",
6160 ":fg2",
6161 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006162 }
Roland Levillain630846d2019-06-26 12:48:34 +01006163 `)
6164
Jooyung Hana0503a52023-08-23 13:12:50 +09006165 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006166 copyCmds := apexRule.Args["copy_commands"]
6167
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006168 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006169 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006170 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006171
Liz Kammer1c14a212020-05-12 15:26:55 -07006172 //Ensure that test data are copied into apex.
6173 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6174 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6175
Roland Levillain9b5fde92019-06-28 15:41:19 +01006176 // Ensure that test deps built with `test_per_src` are copied into apex.
6177 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6178 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6179 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006180
6181 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006182 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006183 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006184 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006185 prefix := "TARGET_"
6186 var builder strings.Builder
6187 data.Custom(&builder, name, prefix, "", data)
6188 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006189 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6190 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6191 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6192 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006193 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006194}
6195
Jooyung Hand48f3c32019-08-23 11:18:57 +09006196func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6197 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 native_shared_libs: ["libfoo"],
6202 }
6203
6204 apex_key {
6205 name: "myapex.key",
6206 public_key: "testkey.avbpubkey",
6207 private_key: "testkey.pem",
6208 }
6209
6210 cc_library {
6211 name: "libfoo",
6212 stl: "none",
6213 system_shared_libs: [],
6214 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006215 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006216 }
6217 `)
6218 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6219 apex {
6220 name: "myapex",
6221 key: "myapex.key",
6222 java_libs: ["myjar"],
6223 }
6224
6225 apex_key {
6226 name: "myapex.key",
6227 public_key: "testkey.avbpubkey",
6228 private_key: "testkey.pem",
6229 }
6230
6231 java_library {
6232 name: "myjar",
6233 srcs: ["foo/bar/MyClass.java"],
6234 sdk_version: "none",
6235 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006236 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006237 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006238 }
6239 `)
6240}
6241
Bill Peckhama41a6962021-01-11 10:58:54 -08006242func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006243 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006244 apex {
6245 name: "myapex",
6246 key: "myapex.key",
6247 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006248 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006249 }
6250
6251 apex_key {
6252 name: "myapex.key",
6253 public_key: "testkey.avbpubkey",
6254 private_key: "testkey.pem",
6255 }
6256
6257 java_import {
6258 name: "myjavaimport",
6259 apex_available: ["myapex"],
6260 jars: ["my.jar"],
6261 compile_dex: true,
6262 }
6263 `)
6264
Jooyung Hana0503a52023-08-23 13:12:50 +09006265 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006266 apexRule := module.Rule("apexRule")
6267 copyCmds := apexRule.Args["copy_commands"]
6268 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6269}
6270
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006271func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006272 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006273 apex {
6274 name: "myapex",
6275 key: "myapex.key",
6276 apps: [
6277 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006278 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006279 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006280 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006281 }
6282
6283 apex_key {
6284 name: "myapex.key",
6285 public_key: "testkey.avbpubkey",
6286 private_key: "testkey.pem",
6287 }
6288
6289 android_app {
6290 name: "AppFoo",
6291 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006292 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006293 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006294 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006295 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006296 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006297 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006298
6299 android_app {
6300 name: "AppFooPriv",
6301 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006302 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006303 system_modules: "none",
6304 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006305 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006306 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006307 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006308 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006309
6310 cc_library_shared {
6311 name: "libjni",
6312 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006313 shared_libs: ["libfoo"],
6314 stl: "none",
6315 system_shared_libs: [],
6316 apex_available: [ "myapex" ],
6317 sdk_version: "current",
6318 }
6319
6320 cc_library_shared {
6321 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006322 stl: "none",
6323 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006324 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006325 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006326 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006327 `)
6328
Jooyung Hana0503a52023-08-23 13:12:50 +09006329 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006330 apexRule := module.Rule("apexRule")
6331 copyCmds := apexRule.Args["copy_commands"]
6332
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006333 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6334 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006335 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006336
Colin Crossaede88c2020-08-11 12:17:01 -07006337 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006338 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006339 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006340 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006341 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006342 // JNI libraries including transitive deps are
6343 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006344 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006345 // ... embedded inside APK (jnilibs.zip)
6346 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6347 // ... and not directly inside the APEX
6348 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6349 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006350
6351 apexBundle := module.Module().(*apexBundle)
6352 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6353 var builder strings.Builder
6354 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6355 androidMk := builder.String()
6356 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6357 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6358 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6359 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6360 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6361 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 +01006362}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006363
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006364func TestApexWithAppImportBuildId(t *testing.T) {
6365 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6366 for _, id := range invalidBuildIds {
6367 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6368 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6369 variables.BuildId = proptools.StringPtr(id)
6370 })
6371 testApexError(t, message, `apex {
6372 name: "myapex",
6373 key: "myapex.key",
6374 apps: ["AppFooPrebuilt"],
6375 updatable: false,
6376 }
6377
6378 apex_key {
6379 name: "myapex.key",
6380 public_key: "testkey.avbpubkey",
6381 private_key: "testkey.pem",
6382 }
6383
6384 android_app_import {
6385 name: "AppFooPrebuilt",
6386 apk: "PrebuiltAppFoo.apk",
6387 presigned: true,
6388 apex_available: ["myapex"],
6389 }
6390 `, fixture)
6391 }
6392}
6393
Dario Frenicde2a032019-10-27 00:29:22 +01006394func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006395 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006396 apex {
6397 name: "myapex",
6398 key: "myapex.key",
6399 apps: [
6400 "AppFooPrebuilt",
6401 "AppFooPrivPrebuilt",
6402 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006403 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006404 }
6405
6406 apex_key {
6407 name: "myapex.key",
6408 public_key: "testkey.avbpubkey",
6409 private_key: "testkey.pem",
6410 }
6411
6412 android_app_import {
6413 name: "AppFooPrebuilt",
6414 apk: "PrebuiltAppFoo.apk",
6415 presigned: true,
6416 dex_preopt: {
6417 enabled: false,
6418 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006419 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006420 }
6421
6422 android_app_import {
6423 name: "AppFooPrivPrebuilt",
6424 apk: "PrebuiltAppFooPriv.apk",
6425 privileged: true,
6426 presigned: true,
6427 dex_preopt: {
6428 enabled: false,
6429 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006430 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006431 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006432 }
6433 `)
6434
Jooyung Hana0503a52023-08-23 13:12:50 +09006435 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006436 apexRule := module.Rule("apexRule")
6437 copyCmds := apexRule.Args["copy_commands"]
6438
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006439 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6440 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006441}
6442
6443func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006444 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006445 apex {
6446 name: "myapex",
6447 key: "myapex.key",
6448 apps: [
6449 "AppFoo",
6450 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006451 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006452 }
6453
6454 apex_key {
6455 name: "myapex.key",
6456 public_key: "testkey.avbpubkey",
6457 private_key: "testkey.pem",
6458 }
6459
6460 android_app {
6461 name: "AppFoo",
6462 srcs: ["foo/bar/MyClass.java"],
6463 sdk_version: "none",
6464 system_modules: "none",
6465 apex_available: [ "myapex" ],
6466 }
6467
6468 android_app_import {
6469 name: "AppFoo",
6470 apk: "AppFooPrebuilt.apk",
6471 filename: "AppFooPrebuilt.apk",
6472 presigned: true,
6473 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006474 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006475 }
6476 `, withFiles(map[string][]byte{
6477 "AppFooPrebuilt.apk": nil,
6478 }))
6479
Jooyung Hana0503a52023-08-23 13:12:50 +09006480 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006481 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006482 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006483}
6484
Dario Freni6f3937c2019-12-20 22:58:03 +00006485func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006486 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006487 apex {
6488 name: "myapex",
6489 key: "myapex.key",
6490 apps: [
6491 "TesterHelpAppFoo",
6492 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006493 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006494 }
6495
6496 apex_key {
6497 name: "myapex.key",
6498 public_key: "testkey.avbpubkey",
6499 private_key: "testkey.pem",
6500 }
6501
6502 android_test_helper_app {
6503 name: "TesterHelpAppFoo",
6504 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006505 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006506 }
6507
6508 `)
6509
Jooyung Hana0503a52023-08-23 13:12:50 +09006510 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006511 apexRule := module.Rule("apexRule")
6512 copyCmds := apexRule.Args["copy_commands"]
6513
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006514 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006515}
6516
Jooyung Han18020ea2019-11-13 10:50:48 +09006517func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6518 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006519 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006520 apex {
6521 name: "myapex",
6522 key: "myapex.key",
6523 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006524 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006525 }
6526
6527 apex_key {
6528 name: "myapex.key",
6529 public_key: "testkey.avbpubkey",
6530 private_key: "testkey.pem",
6531 }
6532
6533 apex {
6534 name: "otherapex",
6535 key: "myapex.key",
6536 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006537 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006538 }
6539
6540 cc_defaults {
6541 name: "libfoo-defaults",
6542 apex_available: ["otherapex"],
6543 }
6544
6545 cc_library {
6546 name: "libfoo",
6547 defaults: ["libfoo-defaults"],
6548 stl: "none",
6549 system_shared_libs: [],
6550 }`)
6551}
6552
Paul Duffine52e66f2020-03-30 17:54:29 +01006553func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006554 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006555 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 apex {
6557 name: "myapex",
6558 key: "myapex.key",
6559 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006560 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 }
6562
6563 apex_key {
6564 name: "myapex.key",
6565 public_key: "testkey.avbpubkey",
6566 private_key: "testkey.pem",
6567 }
6568
6569 apex {
6570 name: "otherapex",
6571 key: "otherapex.key",
6572 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006573 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006574 }
6575
6576 apex_key {
6577 name: "otherapex.key",
6578 public_key: "testkey.avbpubkey",
6579 private_key: "testkey.pem",
6580 }
6581
6582 cc_library {
6583 name: "libfoo",
6584 stl: "none",
6585 system_shared_libs: [],
6586 apex_available: ["otherapex"],
6587 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006588}
Jiyong Park127b40b2019-09-30 16:04:35 +09006589
Paul Duffine52e66f2020-03-30 17:54:29 +01006590func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006591 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006592 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006593.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006594.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006595.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006596.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006597.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006598.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006599 apex {
6600 name: "myapex",
6601 key: "myapex.key",
6602 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006603 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006604 }
6605
6606 apex_key {
6607 name: "myapex.key",
6608 public_key: "testkey.avbpubkey",
6609 private_key: "testkey.pem",
6610 }
6611
Jiyong Park127b40b2019-09-30 16:04:35 +09006612 cc_library {
6613 name: "libfoo",
6614 stl: "none",
6615 shared_libs: ["libbar"],
6616 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006617 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006618 }
6619
6620 cc_library {
6621 name: "libbar",
6622 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006623 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006624 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006625 apex_available: ["myapex"],
6626 }
6627
6628 cc_library {
6629 name: "libbaz",
6630 stl: "none",
6631 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006632 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006633}
Jiyong Park127b40b2019-09-30 16:04:35 +09006634
Liz Kammer5f108fa2023-05-11 14:33:17 -04006635func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6636 testApex(t, `
6637 apex {
6638 name: "myapex",
6639 key: "myapex.key",
6640 native_shared_libs: ["libfoo"],
6641 updatable: false,
6642 }
6643
6644 apex_key {
6645 name: "myapex.key",
6646 public_key: "testkey.avbpubkey",
6647 private_key: "testkey.pem",
6648 }
6649
6650 cc_library {
6651 name: "libfoo",
6652 stl: "none",
6653 static_libs: ["libbar"],
6654 system_shared_libs: [],
6655 apex_available: ["myapex"],
6656 }
6657
6658 cc_library {
6659 name: "libbar",
6660 stl: "none",
6661 shared_libs: ["libbaz"],
6662 system_shared_libs: [],
6663 apex_available: ["myapex"],
6664 }
6665
6666 cc_library {
6667 name: "libbaz",
6668 stl: "none",
6669 system_shared_libs: [],
6670 }`)
6671
6672 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6673 apex {
6674 name: "myapex",
6675 key: "myapex.key",
6676 native_shared_libs: ["libfoo"],
6677 updatable: false,
6678 }
6679
6680 apex_key {
6681 name: "myapex.key",
6682 public_key: "testkey.avbpubkey",
6683 private_key: "testkey.pem",
6684 }
6685
6686 cc_library {
6687 name: "libfoo",
6688 stl: "none",
6689 static_libs: ["libbar"],
6690 system_shared_libs: [],
6691 apex_available: ["myapex"],
6692 }
6693
6694 cc_library {
6695 name: "libbar",
6696 stl: "none",
6697 system_shared_libs: [],
6698 }`)
6699}
6700
Paul Duffine52e66f2020-03-30 17:54:29 +01006701func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006702 testApexError(t, "\"otherapex\" is not a valid module name", `
6703 apex {
6704 name: "myapex",
6705 key: "myapex.key",
6706 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006707 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006708 }
6709
6710 apex_key {
6711 name: "myapex.key",
6712 public_key: "testkey.avbpubkey",
6713 private_key: "testkey.pem",
6714 }
6715
6716 cc_library {
6717 name: "libfoo",
6718 stl: "none",
6719 system_shared_libs: [],
6720 apex_available: ["otherapex"],
6721 }`)
6722
Paul Duffine52e66f2020-03-30 17:54:29 +01006723 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006724 apex {
6725 name: "myapex",
6726 key: "myapex.key",
6727 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006728 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006729 }
6730
6731 apex_key {
6732 name: "myapex.key",
6733 public_key: "testkey.avbpubkey",
6734 private_key: "testkey.pem",
6735 }
6736
6737 cc_library {
6738 name: "libfoo",
6739 stl: "none",
6740 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006741 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006742 apex_available: ["myapex"],
6743 }
6744
6745 cc_library {
6746 name: "libbar",
6747 stl: "none",
6748 system_shared_libs: [],
6749 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006750 }
6751
6752 cc_library {
6753 name: "libbaz",
6754 stl: "none",
6755 system_shared_libs: [],
6756 stubs: {
6757 versions: ["10", "20", "30"],
6758 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006759 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006760}
Jiyong Park127b40b2019-09-30 16:04:35 +09006761
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006762func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6763 t.Run("negative variant_version produces error", func(t *testing.T) {
6764 testApexError(t, "expected an integer between 0-9; got -1", `
6765 apex {
6766 name: "myapex",
6767 key: "myapex.key",
6768 apex_available_name: "com.android.foo",
6769 variant_version: "-1",
6770 updatable: false,
6771 }
6772 apex_key {
6773 name: "myapex.key",
6774 public_key: "testkey.avbpubkey",
6775 private_key: "testkey.pem",
6776 }
6777 `)
6778 })
6779
6780 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6781 testApexError(t, "expected an integer between 0-9; got 10", `
6782 apex {
6783 name: "myapex",
6784 key: "myapex.key",
6785 apex_available_name: "com.android.foo",
6786 variant_version: "10",
6787 updatable: false,
6788 }
6789 apex_key {
6790 name: "myapex.key",
6791 public_key: "testkey.avbpubkey",
6792 private_key: "testkey.pem",
6793 }
6794 `)
6795 })
6796}
6797
6798func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6799 context := android.GroupFixturePreparers(
6800 android.PrepareForIntegrationTestWithAndroid,
6801 PrepareForTestWithApexBuildComponents,
6802 android.FixtureMergeMockFs(android.MockFS{
6803 "system/sepolicy/apex/foo-file_contexts": nil,
6804 "system/sepolicy/apex/bar-file_contexts": nil,
6805 }),
6806 )
6807 result := context.RunTestWithBp(t, `
6808 apex {
6809 name: "foo",
6810 key: "myapex.key",
6811 apex_available_name: "com.android.foo",
6812 variant_version: "0",
6813 updatable: false,
6814 }
6815 apex {
6816 name: "bar",
6817 key: "myapex.key",
6818 apex_available_name: "com.android.foo",
6819 variant_version: "3",
6820 updatable: false,
6821 }
6822 apex_key {
6823 name: "myapex.key",
6824 public_key: "testkey.avbpubkey",
6825 private_key: "testkey.pem",
6826 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006827 override_apex {
6828 name: "myoverrideapex",
6829 base: "bar",
6830 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006831 `)
6832
Jooyung Hana0503a52023-08-23 13:12:50 +09006833 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006834 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6835 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6836 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6837 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6838 }
6839
Jooyung Hana0503a52023-08-23 13:12:50 +09006840 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006841 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6842 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6843 barActualDefaultVersion := barManifestRule.Args["default_version"]
6844 if barActualDefaultVersion != barExpectedDefaultVersion {
6845 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6846 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006847
Jooyung Hana0503a52023-08-23 13:12:50 +09006848 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006849 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6850 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6851 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6852 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006853}
6854
Sam Delmericoca816532023-06-02 14:09:50 -04006855func TestApexAvailable_ApexAvailableName(t *testing.T) {
6856 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6857 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6858 apex {
6859 name: "myapex_sminus",
6860 key: "myapex.key",
6861 apps: ["AppFoo"],
6862 apex_available_name: "myapex",
6863 updatable: false,
6864 }
6865 apex {
6866 name: "myapex",
6867 key: "myapex.key",
6868 apps: ["AppFoo"],
6869 updatable: false,
6870 }
6871 apex_key {
6872 name: "myapex.key",
6873 public_key: "testkey.avbpubkey",
6874 private_key: "testkey.pem",
6875 }
6876 android_app {
6877 name: "AppFoo",
6878 srcs: ["foo/bar/MyClass.java"],
6879 sdk_version: "none",
6880 system_modules: "none",
6881 apex_available: [ "myapex_sminus" ],
6882 }`,
6883 android.FixtureMergeMockFs(android.MockFS{
6884 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6885 }),
6886 )
6887 })
6888
6889 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6890 testApex(t, `
6891 apex {
6892 name: "myapex_sminus",
6893 key: "myapex.key",
6894 apps: ["AppFoo"],
6895 apex_available_name: "myapex",
6896 updatable: false,
6897 }
6898 apex {
6899 name: "myapex",
6900 key: "myapex.key",
6901 apps: ["AppFoo"],
6902 updatable: false,
6903 }
6904 apex_key {
6905 name: "myapex.key",
6906 public_key: "testkey.avbpubkey",
6907 private_key: "testkey.pem",
6908 }
6909 android_app {
6910 name: "AppFoo",
6911 srcs: ["foo/bar/MyClass.java"],
6912 sdk_version: "none",
6913 system_modules: "none",
6914 apex_available: [ "myapex" ],
6915 }`,
6916 android.FixtureMergeMockFs(android.MockFS{
6917 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6918 }),
6919 )
6920 })
6921
6922 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6923 testApex(t, `
6924 override_apex {
6925 name: "myoverrideapex_sminus",
6926 base: "myapex_sminus",
6927 key: "myapex.key",
6928 apps: ["AppFooOverride"],
6929 }
6930 override_apex {
6931 name: "myoverrideapex",
6932 base: "myapex",
6933 key: "myapex.key",
6934 apps: ["AppFooOverride"],
6935 }
6936 apex {
6937 name: "myapex_sminus",
6938 key: "myapex.key",
6939 apps: ["AppFoo"],
6940 apex_available_name: "myapex",
6941 updatable: false,
6942 }
6943 apex {
6944 name: "myapex",
6945 key: "myapex.key",
6946 apps: ["AppFoo"],
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: "AppFooOverride",
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",
6963 srcs: ["foo/bar/MyClass.java"],
6964 sdk_version: "none",
6965 system_modules: "none",
6966 apex_available: [ "myapex" ],
6967 }`,
6968 android.FixtureMergeMockFs(android.MockFS{
6969 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6970 }),
6971 )
6972 })
6973}
6974
6975func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6976 context := android.GroupFixturePreparers(
6977 android.PrepareForIntegrationTestWithAndroid,
6978 PrepareForTestWithApexBuildComponents,
6979 java.PrepareForTestWithDexpreopt,
6980 android.FixtureMergeMockFs(android.MockFS{
6981 "system/sepolicy/apex/myapex-file_contexts": nil,
6982 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6983 }),
6984 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6985 variables.BuildId = proptools.StringPtr("buildid")
6986 }),
6987 )
6988 context.RunTestWithBp(t, `
6989 override_apex {
6990 name: "myoverrideapex_sminus",
6991 base: "myapex_sminus",
6992 }
6993 override_apex {
6994 name: "myoverrideapex",
6995 base: "myapex",
6996 }
6997 apex {
6998 name: "myapex",
6999 key: "myapex.key",
7000 apps: ["AppFoo"],
7001 updatable: false,
7002 }
7003 apex {
7004 name: "myapex_sminus",
7005 apex_available_name: "myapex",
7006 key: "myapex.key",
7007 apps: ["AppFoo_sminus"],
7008 updatable: false,
7009 }
7010 apex_key {
7011 name: "myapex.key",
7012 public_key: "testkey.avbpubkey",
7013 private_key: "testkey.pem",
7014 }
7015 android_app {
7016 name: "AppFoo",
7017 srcs: ["foo/bar/MyClass.java"],
7018 sdk_version: "none",
7019 system_modules: "none",
7020 apex_available: [ "myapex" ],
7021 }
7022 android_app {
7023 name: "AppFoo_sminus",
7024 srcs: ["foo/bar/MyClass.java"],
7025 sdk_version: "none",
7026 min_sdk_version: "29",
7027 system_modules: "none",
7028 apex_available: [ "myapex" ],
7029 }`)
7030}
7031
Jiyong Park89e850a2020-04-07 16:37:39 +09007032func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007033 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007034 apex {
7035 name: "myapex",
7036 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007037 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007038 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007039 }
7040
7041 apex_key {
7042 name: "myapex.key",
7043 public_key: "testkey.avbpubkey",
7044 private_key: "testkey.pem",
7045 }
7046
7047 cc_library {
7048 name: "libfoo",
7049 stl: "none",
7050 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007051 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007052 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007053 }
7054
7055 cc_library {
7056 name: "libfoo2",
7057 stl: "none",
7058 system_shared_libs: [],
7059 shared_libs: ["libbaz"],
7060 apex_available: ["//apex_available:platform"],
7061 }
7062
7063 cc_library {
7064 name: "libbar",
7065 stl: "none",
7066 system_shared_libs: [],
7067 apex_available: ["myapex"],
7068 }
7069
7070 cc_library {
7071 name: "libbaz",
7072 stl: "none",
7073 system_shared_libs: [],
7074 apex_available: ["myapex"],
7075 stubs: {
7076 versions: ["1"],
7077 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007078 }`)
7079
Jiyong Park89e850a2020-04-07 16:37:39 +09007080 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7081 // because it depends on libbar which isn't available to platform
7082 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7083 if libfoo.NotAvailableForPlatform() != true {
7084 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7085 }
7086
7087 // libfoo2 however can be available to platform because it depends on libbaz which provides
7088 // stubs
7089 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7090 if libfoo2.NotAvailableForPlatform() == true {
7091 t.Errorf("%q should be available to platform", libfoo2.String())
7092 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007093}
Jiyong Parka90ca002019-10-07 15:47:24 +09007094
Paul Duffine52e66f2020-03-30 17:54:29 +01007095func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007096 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007097 apex {
7098 name: "myapex",
7099 key: "myapex.key",
7100 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007101 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007102 }
7103
7104 apex_key {
7105 name: "myapex.key",
7106 public_key: "testkey.avbpubkey",
7107 private_key: "testkey.pem",
7108 }
7109
7110 cc_library {
7111 name: "libfoo",
7112 stl: "none",
7113 system_shared_libs: [],
7114 apex_available: ["myapex"],
7115 static: {
7116 apex_available: ["//apex_available:platform"],
7117 },
7118 }`)
7119
Jiyong Park89e850a2020-04-07 16:37:39 +09007120 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7121 if libfooShared.NotAvailableForPlatform() != true {
7122 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7123 }
7124 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7125 if libfooStatic.NotAvailableForPlatform() != false {
7126 t.Errorf("%q should be available to platform", libfooStatic.String())
7127 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007128}
7129
Jiyong Park5d790c32019-11-15 18:40:32 +09007130func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007131 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007132 apex {
7133 name: "myapex",
7134 key: "myapex.key",
7135 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007136 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007137 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007138 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007139 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007140 }
7141
7142 override_apex {
7143 name: "override_myapex",
7144 base: "myapex",
7145 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007146 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007147 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007148 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007149 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007150 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007151 key: "mynewapex.key",
7152 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007153 }
7154
7155 apex_key {
7156 name: "myapex.key",
7157 public_key: "testkey.avbpubkey",
7158 private_key: "testkey.pem",
7159 }
7160
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007161 apex_key {
7162 name: "mynewapex.key",
7163 public_key: "testkey2.avbpubkey",
7164 private_key: "testkey2.pem",
7165 }
7166
7167 android_app_certificate {
7168 name: "myapex.certificate",
7169 certificate: "testkey",
7170 }
7171
Jiyong Park5d790c32019-11-15 18:40:32 +09007172 android_app {
7173 name: "app",
7174 srcs: ["foo/bar/MyClass.java"],
7175 package_name: "foo",
7176 sdk_version: "none",
7177 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007178 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007179 }
7180
7181 override_android_app {
7182 name: "override_app",
7183 base: "app",
7184 package_name: "bar",
7185 }
markchien7c803b82021-08-26 22:10:06 +08007186
7187 bpf {
7188 name: "bpf",
7189 srcs: ["bpf.c"],
7190 }
7191
7192 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007193 name: "overrideBpf",
7194 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007195 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007196
7197 prebuilt_etc {
7198 name: "myetc",
7199 src: "myprebuilt",
7200 }
7201
7202 prebuilt_etc {
7203 name: "override_myetc",
7204 src: "override_myprebuilt",
7205 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007206 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007207
Jooyung Hana0503a52023-08-23 13:12:50 +09007208 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7209 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007210 if originalVariant.GetOverriddenBy() != "" {
7211 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7212 }
7213 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7214 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7215 }
7216
Jooyung Hana0503a52023-08-23 13:12:50 +09007217 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007218 apexRule := module.Rule("apexRule")
7219 copyCmds := apexRule.Args["copy_commands"]
7220
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007221 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7222 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007223
markchien7c803b82021-08-26 22:10:06 +08007224 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007225 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007226
Daniel Norman5a3ce132021-08-26 15:44:43 -07007227 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7228 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7229
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007230 apexBundle := module.Module().(*apexBundle)
7231 name := apexBundle.Name()
7232 if name != "override_myapex" {
7233 t.Errorf("name should be \"override_myapex\", but was %q", name)
7234 }
7235
Baligh Uddin004d7172020-02-19 21:29:28 -08007236 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7237 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7238 }
7239
Jiyong Park20bacab2020-03-03 11:45:41 +09007240 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007241 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007242 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7243
7244 signApkRule := module.Rule("signapk")
7245 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007246
Colin Crossaa255532020-07-03 13:18:24 -07007247 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007248 var builder strings.Builder
7249 data.Custom(&builder, name, "TARGET_", "", data)
7250 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007251 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7252 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007253 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007254 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007255 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007256 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007257 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007258 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007259}
7260
Albert Martineefabcf2022-03-21 20:11:16 +00007261func TestMinSdkVersionOverride(t *testing.T) {
7262 // Override from 29 to 31
7263 minSdkOverride31 := "31"
7264 ctx := testApex(t, `
7265 apex {
7266 name: "myapex",
7267 key: "myapex.key",
7268 native_shared_libs: ["mylib"],
7269 updatable: true,
7270 min_sdk_version: "29"
7271 }
7272
7273 override_apex {
7274 name: "override_myapex",
7275 base: "myapex",
7276 logging_parent: "com.foo.bar",
7277 package_name: "test.overridden.package"
7278 }
7279
7280 apex_key {
7281 name: "myapex.key",
7282 public_key: "testkey.avbpubkey",
7283 private_key: "testkey.pem",
7284 }
7285
7286 cc_library {
7287 name: "mylib",
7288 srcs: ["mylib.cpp"],
7289 runtime_libs: ["libbar"],
7290 system_shared_libs: [],
7291 stl: "none",
7292 apex_available: [ "myapex" ],
7293 min_sdk_version: "apex_inherit"
7294 }
7295
7296 cc_library {
7297 name: "libbar",
7298 srcs: ["mylib.cpp"],
7299 system_shared_libs: [],
7300 stl: "none",
7301 apex_available: [ "myapex" ],
7302 min_sdk_version: "apex_inherit"
7303 }
7304
7305 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7306
Jooyung Hana0503a52023-08-23 13:12:50 +09007307 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007308 copyCmds := apexRule.Args["copy_commands"]
7309
7310 // Ensure that direct non-stubs dep is always included
7311 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7312
7313 // Ensure that runtime_libs dep in included
7314 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7315
7316 // Ensure libraries target overridden min_sdk_version value
7317 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7318}
7319
7320func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7321 // Attempt to override from 31 to 29, should be a NOOP
7322 minSdkOverride29 := "29"
7323 ctx := testApex(t, `
7324 apex {
7325 name: "myapex",
7326 key: "myapex.key",
7327 native_shared_libs: ["mylib"],
7328 updatable: true,
7329 min_sdk_version: "31"
7330 }
7331
7332 override_apex {
7333 name: "override_myapex",
7334 base: "myapex",
7335 logging_parent: "com.foo.bar",
7336 package_name: "test.overridden.package"
7337 }
7338
7339 apex_key {
7340 name: "myapex.key",
7341 public_key: "testkey.avbpubkey",
7342 private_key: "testkey.pem",
7343 }
7344
7345 cc_library {
7346 name: "mylib",
7347 srcs: ["mylib.cpp"],
7348 runtime_libs: ["libbar"],
7349 system_shared_libs: [],
7350 stl: "none",
7351 apex_available: [ "myapex" ],
7352 min_sdk_version: "apex_inherit"
7353 }
7354
7355 cc_library {
7356 name: "libbar",
7357 srcs: ["mylib.cpp"],
7358 system_shared_libs: [],
7359 stl: "none",
7360 apex_available: [ "myapex" ],
7361 min_sdk_version: "apex_inherit"
7362 }
7363
7364 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7365
Jooyung Hana0503a52023-08-23 13:12:50 +09007366 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007367 copyCmds := apexRule.Args["copy_commands"]
7368
7369 // Ensure that direct non-stubs dep is always included
7370 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7371
7372 // Ensure that runtime_libs dep in included
7373 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7374
7375 // Ensure libraries target the original min_sdk_version value rather than the overridden
7376 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7377}
7378
Jooyung Han214bf372019-11-12 13:03:50 +09007379func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007380 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007381 apex {
7382 name: "myapex",
7383 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007384 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007385 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007386 }
7387
7388 apex_key {
7389 name: "myapex.key",
7390 public_key: "testkey.avbpubkey",
7391 private_key: "testkey.pem",
7392 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007393
7394 cc_library {
7395 name: "mylib",
7396 srcs: ["mylib.cpp"],
7397 stl: "libc++",
7398 system_shared_libs: [],
7399 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007400 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007401 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007402 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007403
Jooyung Hana0503a52023-08-23 13:12:50 +09007404 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007405 args := module.Rule("apexRule").Args
7406 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007407 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007408
7409 // The copies of the libraries in the apex should have one more dependency than
7410 // the ones outside the apex, namely the unwinder. Ideally we should check
7411 // the dependency names directly here but for some reason the names are blank in
7412 // this test.
7413 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007414 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007415 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7416 if len(apexImplicits) != len(nonApexImplicits)+1 {
7417 t.Errorf("%q missing unwinder dep", lib)
7418 }
7419 }
Jooyung Han214bf372019-11-12 13:03:50 +09007420}
7421
Paul Duffine05480a2021-03-08 15:07:14 +00007422var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007423 "api/current.txt": nil,
7424 "api/removed.txt": nil,
7425 "api/system-current.txt": nil,
7426 "api/system-removed.txt": nil,
7427 "api/test-current.txt": nil,
7428 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007429
Anton Hanssondff2c782020-12-21 17:10:01 +00007430 "100/public/api/foo.txt": nil,
7431 "100/public/api/foo-removed.txt": nil,
7432 "100/system/api/foo.txt": nil,
7433 "100/system/api/foo-removed.txt": nil,
7434
Paul Duffineedc5d52020-06-12 17:46:39 +01007435 // For java_sdk_library_import
7436 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007437}
7438
Jooyung Han58f26ab2019-12-18 15:34:32 +09007439func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007440 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007441 apex {
7442 name: "myapex",
7443 key: "myapex.key",
7444 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007445 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007446 }
7447
7448 apex_key {
7449 name: "myapex.key",
7450 public_key: "testkey.avbpubkey",
7451 private_key: "testkey.pem",
7452 }
7453
7454 java_sdk_library {
7455 name: "foo",
7456 srcs: ["a.java"],
7457 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007458 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007459 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007460
7461 prebuilt_apis {
7462 name: "sdk",
7463 api_dirs: ["100"],
7464 }
Paul Duffin9b879592020-05-26 13:21:35 +01007465 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007466
7467 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007468 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007469 "javalib/foo.jar",
7470 "etc/permissions/foo.xml",
7471 })
7472 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007473 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007474 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 +09007475}
7476
Paul Duffin9b879592020-05-26 13:21:35 +01007477func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007478 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007479 apex {
7480 name: "myapex",
7481 key: "myapex.key",
7482 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007483 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007484 }
7485
7486 apex_key {
7487 name: "myapex.key",
7488 public_key: "testkey.avbpubkey",
7489 private_key: "testkey.pem",
7490 }
7491
7492 java_sdk_library {
7493 name: "foo",
7494 srcs: ["a.java"],
7495 api_packages: ["foo"],
7496 apex_available: ["myapex"],
7497 sdk_version: "none",
7498 system_modules: "none",
7499 }
7500
7501 java_library {
7502 name: "bar",
7503 srcs: ["a.java"],
7504 libs: ["foo"],
7505 apex_available: ["myapex"],
7506 sdk_version: "none",
7507 system_modules: "none",
7508 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007509
7510 prebuilt_apis {
7511 name: "sdk",
7512 api_dirs: ["100"],
7513 }
Paul Duffin9b879592020-05-26 13:21:35 +01007514 `, withFiles(filesForSdkLibrary))
7515
7516 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007517 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007518 "javalib/bar.jar",
7519 "javalib/foo.jar",
7520 "etc/permissions/foo.xml",
7521 })
7522
7523 // The bar library should depend on the implementation jar.
7524 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007525 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007526 t.Errorf("expected %q, found %#q", expected, actual)
7527 }
7528}
7529
7530func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007531 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007532 apex {
7533 name: "myapex",
7534 key: "myapex.key",
7535 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007536 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007537 }
7538
7539 apex_key {
7540 name: "myapex.key",
7541 public_key: "testkey.avbpubkey",
7542 private_key: "testkey.pem",
7543 }
7544
7545 java_sdk_library {
7546 name: "foo",
7547 srcs: ["a.java"],
7548 api_packages: ["foo"],
7549 apex_available: ["myapex"],
7550 sdk_version: "none",
7551 system_modules: "none",
7552 }
7553
7554 java_library {
7555 name: "bar",
7556 srcs: ["a.java"],
7557 libs: ["foo"],
7558 sdk_version: "none",
7559 system_modules: "none",
7560 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007561
7562 prebuilt_apis {
7563 name: "sdk",
7564 api_dirs: ["100"],
7565 }
Paul Duffin9b879592020-05-26 13:21:35 +01007566 `, withFiles(filesForSdkLibrary))
7567
7568 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007569 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007570 "javalib/foo.jar",
7571 "etc/permissions/foo.xml",
7572 })
7573
7574 // The bar library should depend on the stubs jar.
7575 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007576 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007577 t.Errorf("expected %q, found %#q", expected, actual)
7578 }
7579}
7580
Paul Duffineedc5d52020-06-12 17:46:39 +01007581func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007582 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007583 prebuilt_apis {
7584 name: "sdk",
7585 api_dirs: ["100"],
7586 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007587 withFiles(map[string][]byte{
7588 "apex/a.java": nil,
7589 "apex/apex_manifest.json": nil,
7590 "apex/Android.bp": []byte(`
7591 package {
7592 default_visibility: ["//visibility:private"],
7593 }
7594
7595 apex {
7596 name: "myapex",
7597 key: "myapex.key",
7598 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007599 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007600 }
7601
7602 apex_key {
7603 name: "myapex.key",
7604 public_key: "testkey.avbpubkey",
7605 private_key: "testkey.pem",
7606 }
7607
7608 java_library {
7609 name: "bar",
7610 srcs: ["a.java"],
7611 libs: ["foo"],
7612 apex_available: ["myapex"],
7613 sdk_version: "none",
7614 system_modules: "none",
7615 }
7616`),
7617 "source/a.java": nil,
7618 "source/api/current.txt": nil,
7619 "source/api/removed.txt": nil,
7620 "source/Android.bp": []byte(`
7621 package {
7622 default_visibility: ["//visibility:private"],
7623 }
7624
7625 java_sdk_library {
7626 name: "foo",
7627 visibility: ["//apex"],
7628 srcs: ["a.java"],
7629 api_packages: ["foo"],
7630 apex_available: ["myapex"],
7631 sdk_version: "none",
7632 system_modules: "none",
7633 public: {
7634 enabled: true,
7635 },
7636 }
7637`),
7638 "prebuilt/a.jar": nil,
7639 "prebuilt/Android.bp": []byte(`
7640 package {
7641 default_visibility: ["//visibility:private"],
7642 }
7643
7644 java_sdk_library_import {
7645 name: "foo",
7646 visibility: ["//apex", "//source"],
7647 apex_available: ["myapex"],
7648 prefer: true,
7649 public: {
7650 jars: ["a.jar"],
7651 },
7652 }
7653`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007654 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007655 )
7656
7657 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007658 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007659 "javalib/bar.jar",
7660 "javalib/foo.jar",
7661 "etc/permissions/foo.xml",
7662 })
7663
7664 // The bar library should depend on the implementation jar.
7665 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007666 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007667 t.Errorf("expected %q, found %#q", expected, actual)
7668 }
7669}
7670
7671func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7672 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7673 apex {
7674 name: "myapex",
7675 key: "myapex.key",
7676 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007677 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007678 }
7679
7680 apex_key {
7681 name: "myapex.key",
7682 public_key: "testkey.avbpubkey",
7683 private_key: "testkey.pem",
7684 }
7685
7686 java_sdk_library_import {
7687 name: "foo",
7688 apex_available: ["myapex"],
7689 prefer: true,
7690 public: {
7691 jars: ["a.jar"],
7692 },
7693 }
7694
7695 `, withFiles(filesForSdkLibrary))
7696}
7697
atrost6e126252020-01-27 17:01:16 +00007698func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007699 result := android.GroupFixturePreparers(
7700 prepareForApexTest,
7701 java.PrepareForTestWithPlatformCompatConfig,
7702 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007703 apex {
7704 name: "myapex",
7705 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007706 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007707 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007708 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007709 }
7710
7711 apex_key {
7712 name: "myapex.key",
7713 public_key: "testkey.avbpubkey",
7714 private_key: "testkey.pem",
7715 }
7716
7717 platform_compat_config {
7718 name: "myjar-platform-compat-config",
7719 src: ":myjar",
7720 }
7721
7722 java_library {
7723 name: "myjar",
7724 srcs: ["foo/bar/MyClass.java"],
7725 sdk_version: "none",
7726 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007727 apex_available: [ "myapex" ],
7728 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007729
7730 // Make sure that a preferred prebuilt does not affect the apex contents.
7731 prebuilt_platform_compat_config {
7732 name: "myjar-platform-compat-config",
7733 metadata: "compat-config/metadata.xml",
7734 prefer: true,
7735 }
atrost6e126252020-01-27 17:01:16 +00007736 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007737 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007739 "etc/compatconfig/myjar-platform-compat-config.xml",
7740 "javalib/myjar.jar",
7741 })
7742}
7743
Jooyung Han862c0d62022-12-21 10:15:37 +09007744func TestNoDupeApexFiles(t *testing.T) {
7745 android.GroupFixturePreparers(
7746 android.PrepareForTestWithAndroidBuildComponents,
7747 PrepareForTestWithApexBuildComponents,
7748 prepareForTestWithMyapex,
7749 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7750 ).
7751 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7752 RunTestWithBp(t, `
7753 apex {
7754 name: "myapex",
7755 key: "myapex.key",
7756 prebuilts: ["foo", "bar"],
7757 updatable: false,
7758 }
7759
7760 apex_key {
7761 name: "myapex.key",
7762 public_key: "testkey.avbpubkey",
7763 private_key: "testkey.pem",
7764 }
7765
7766 prebuilt_etc {
7767 name: "foo",
7768 src: "myprebuilt",
7769 filename_from_src: true,
7770 }
7771
7772 prebuilt_etc {
7773 name: "bar",
7774 src: "myprebuilt",
7775 filename_from_src: true,
7776 }
7777 `)
7778}
7779
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007780func TestApexUnwantedTransitiveDeps(t *testing.T) {
7781 bp := `
7782 apex {
7783 name: "myapex",
7784 key: "myapex.key",
7785 native_shared_libs: ["libfoo"],
7786 updatable: false,
7787 unwanted_transitive_deps: ["libbar"],
7788 }
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: "libfoo",
7798 srcs: ["foo.cpp"],
7799 shared_libs: ["libbar"],
7800 apex_available: ["myapex"],
7801 }
7802
7803 cc_library {
7804 name: "libbar",
7805 srcs: ["bar.cpp"],
7806 apex_available: ["myapex"],
7807 }`
7808 ctx := testApex(t, bp)
7809 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7810 "*/libc++.so",
7811 "*/libfoo.so",
7812 // not libbar.so
7813 })
7814}
7815
Jiyong Park479321d2019-12-16 11:47:12 +09007816func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7817 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7818 apex {
7819 name: "myapex",
7820 key: "myapex.key",
7821 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007822 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007823 }
7824
7825 apex_key {
7826 name: "myapex.key",
7827 public_key: "testkey.avbpubkey",
7828 private_key: "testkey.pem",
7829 }
7830
7831 java_library {
7832 name: "myjar",
7833 srcs: ["foo/bar/MyClass.java"],
7834 sdk_version: "none",
7835 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007836 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007837 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007838 }
7839 `)
7840}
7841
Jiyong Park7afd1072019-12-30 16:56:33 +09007842func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007843 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007844 apex {
7845 name: "myapex",
7846 key: "myapex.key",
7847 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007848 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007849 }
7850
7851 apex_key {
7852 name: "myapex.key",
7853 public_key: "testkey.avbpubkey",
7854 private_key: "testkey.pem",
7855 }
7856
7857 cc_library {
7858 name: "mylib",
7859 srcs: ["mylib.cpp"],
7860 system_shared_libs: [],
7861 stl: "none",
7862 required: ["a", "b"],
7863 host_required: ["c", "d"],
7864 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007865 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007866 }
7867 `)
7868
Jooyung Hana0503a52023-08-23 13:12:50 +09007869 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007870 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007871 name := apexBundle.BaseModuleName()
7872 prefix := "TARGET_"
7873 var builder strings.Builder
7874 data.Custom(&builder, name, prefix, "", data)
7875 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007876 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007877 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7878 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007879}
7880
Jiyong Park7cd10e32020-01-14 09:22:18 +09007881func TestSymlinksFromApexToSystem(t *testing.T) {
7882 bp := `
7883 apex {
7884 name: "myapex",
7885 key: "myapex.key",
7886 native_shared_libs: ["mylib"],
7887 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007888 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007889 }
7890
Jiyong Park9d677202020-02-19 16:29:35 +09007891 apex {
7892 name: "myapex.updatable",
7893 key: "myapex.key",
7894 native_shared_libs: ["mylib"],
7895 java_libs: ["myjar"],
7896 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007897 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007898 }
7899
Jiyong Park7cd10e32020-01-14 09:22:18 +09007900 apex_key {
7901 name: "myapex.key",
7902 public_key: "testkey.avbpubkey",
7903 private_key: "testkey.pem",
7904 }
7905
7906 cc_library {
7907 name: "mylib",
7908 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007909 shared_libs: [
7910 "myotherlib",
7911 "myotherlib_ext",
7912 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007913 system_shared_libs: [],
7914 stl: "none",
7915 apex_available: [
7916 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007917 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918 "//apex_available:platform",
7919 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007920 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007921 }
7922
7923 cc_library {
7924 name: "myotherlib",
7925 srcs: ["mylib.cpp"],
7926 system_shared_libs: [],
7927 stl: "none",
7928 apex_available: [
7929 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007930 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007931 "//apex_available:platform",
7932 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007933 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007934 }
7935
Jiyong Parkce243632023-02-17 18:22:25 +09007936 cc_library {
7937 name: "myotherlib_ext",
7938 srcs: ["mylib.cpp"],
7939 system_shared_libs: [],
7940 system_ext_specific: true,
7941 stl: "none",
7942 apex_available: [
7943 "myapex",
7944 "myapex.updatable",
7945 "//apex_available:platform",
7946 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007947 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007948 }
7949
Jiyong Park7cd10e32020-01-14 09:22:18 +09007950 java_library {
7951 name: "myjar",
7952 srcs: ["foo/bar/MyClass.java"],
7953 sdk_version: "none",
7954 system_modules: "none",
7955 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007956 apex_available: [
7957 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007958 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 "//apex_available:platform",
7960 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007961 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007962 }
7963
7964 java_library {
7965 name: "myotherjar",
7966 srcs: ["foo/bar/MyClass.java"],
7967 sdk_version: "none",
7968 system_modules: "none",
7969 apex_available: [
7970 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007971 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007972 "//apex_available:platform",
7973 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007974 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007975 }
7976 `
7977
7978 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7979 for _, f := range files {
7980 if f.path == file {
7981 if f.isLink {
7982 t.Errorf("%q is not a real file", file)
7983 }
7984 return
7985 }
7986 }
7987 t.Errorf("%q is not found", file)
7988 }
7989
Jiyong Parkce243632023-02-17 18:22:25 +09007990 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007991 for _, f := range files {
7992 if f.path == file {
7993 if !f.isLink {
7994 t.Errorf("%q is not a symlink", file)
7995 }
Jiyong Parkce243632023-02-17 18:22:25 +09007996 if f.src != target {
7997 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7998 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007999 return
8000 }
8001 }
8002 t.Errorf("%q is not found", file)
8003 }
8004
Jiyong Park9d677202020-02-19 16:29:35 +09008005 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8006 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008007 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008008 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008009 ensureRealfileExists(t, files, "javalib/myjar.jar")
8010 ensureRealfileExists(t, files, "lib64/mylib.so")
8011 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008012 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008013
Jooyung Hana0503a52023-08-23 13:12:50 +09008014 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008015 ensureRealfileExists(t, files, "javalib/myjar.jar")
8016 ensureRealfileExists(t, files, "lib64/mylib.so")
8017 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008018 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008019
8020 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008021 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008022 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008023 ensureRealfileExists(t, files, "javalib/myjar.jar")
8024 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008025 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8026 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008027
Jooyung Hana0503a52023-08-23 13:12:50 +09008028 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008029 ensureRealfileExists(t, files, "javalib/myjar.jar")
8030 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008031 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8032 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008033}
8034
Yo Chiange8128052020-07-23 20:09:18 +08008035func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008036 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008037 apex {
8038 name: "myapex",
8039 key: "myapex.key",
8040 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008041 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008042 }
8043
8044 apex_key {
8045 name: "myapex.key",
8046 public_key: "testkey.avbpubkey",
8047 private_key: "testkey.pem",
8048 }
8049
8050 cc_library_shared {
8051 name: "mylib",
8052 srcs: ["mylib.cpp"],
8053 shared_libs: ["myotherlib"],
8054 system_shared_libs: [],
8055 stl: "none",
8056 apex_available: [
8057 "myapex",
8058 "//apex_available:platform",
8059 ],
8060 }
8061
8062 cc_prebuilt_library_shared {
8063 name: "myotherlib",
8064 srcs: ["prebuilt.so"],
8065 system_shared_libs: [],
8066 stl: "none",
8067 apex_available: [
8068 "myapex",
8069 "//apex_available:platform",
8070 ],
8071 }
8072 `)
8073
Jooyung Hana0503a52023-08-23 13:12:50 +09008074 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008075 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008076 var builder strings.Builder
8077 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8078 androidMk := builder.String()
8079 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008080 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008081 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8082 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8083 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008084 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008085}
8086
Jooyung Han643adc42020-02-27 13:50:06 +09008087func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008088 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008089 apex {
8090 name: "myapex",
8091 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008092 binaries: ["mybin"],
8093 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008094 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008095 }
8096
8097 apex_key {
8098 name: "myapex.key",
8099 public_key: "testkey.avbpubkey",
8100 private_key: "testkey.pem",
8101 }
8102
8103 cc_library {
8104 name: "mylib",
8105 srcs: ["mylib.cpp"],
8106 shared_libs: ["mylib2"],
8107 system_shared_libs: [],
8108 stl: "none",
8109 apex_available: [ "myapex" ],
8110 }
8111
8112 cc_library {
8113 name: "mylib2",
8114 srcs: ["mylib.cpp"],
8115 system_shared_libs: [],
8116 stl: "none",
8117 apex_available: [ "myapex" ],
8118 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008119
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008120 // Used as both a JNI library and a regular shared library.
8121 cc_library {
8122 name: "mylib3",
8123 srcs: ["mylib.cpp"],
8124 system_shared_libs: [],
8125 stl: "none",
8126 apex_available: [ "myapex" ],
8127 }
8128
8129 cc_binary {
8130 name: "mybin",
8131 srcs: ["mybin.cpp"],
8132 shared_libs: ["mylib3"],
8133 system_shared_libs: [],
8134 stl: "none",
8135 apex_available: [ "myapex" ],
8136 }
8137
Jiyong Park34d5c332022-02-24 18:02:44 +09008138 rust_ffi_shared {
8139 name: "libfoo.rust",
8140 crate_name: "foo",
8141 srcs: ["foo.rs"],
8142 shared_libs: ["libfoo.shared_from_rust"],
8143 prefer_rlib: true,
8144 apex_available: ["myapex"],
8145 }
8146
8147 cc_library_shared {
8148 name: "libfoo.shared_from_rust",
8149 srcs: ["mylib.cpp"],
8150 system_shared_libs: [],
8151 stl: "none",
8152 stubs: {
8153 versions: ["10", "11", "12"],
8154 },
8155 }
8156
Jooyung Han643adc42020-02-27 13:50:06 +09008157 `)
8158
Jooyung Hana0503a52023-08-23 13:12:50 +09008159 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008160 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008161 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008162 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008163 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008164 "lib64/mylib.so",
8165 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008166 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008167 "lib64/libfoo.rust.so",
8168 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8169 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008170 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008171
8172 // b/220397949
8173 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008174}
8175
Jooyung Han49f67012020-04-17 13:43:10 +09008176func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008177 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008178 apex {
8179 name: "myapex",
8180 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008181 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008182 }
8183 apex_key {
8184 name: "myapex.key",
8185 public_key: "testkey.avbpubkey",
8186 private_key: "testkey.pem",
8187 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008188 `,
8189 android.FixtureModifyConfig(func(config android.Config) {
8190 delete(config.Targets, android.Android)
8191 config.AndroidCommonTarget = android.Target{}
8192 }),
8193 )
Jooyung Han49f67012020-04-17 13:43:10 +09008194
8195 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8196 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8197 }
8198}
8199
Jiyong Parkbd159612020-02-28 15:22:21 +09008200func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008201 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008202 apex {
8203 name: "myapex",
8204 key: "myapex.key",
8205 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008206 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008207 }
8208
8209 apex_key {
8210 name: "myapex.key",
8211 public_key: "testkey.avbpubkey",
8212 private_key: "testkey.pem",
8213 }
8214
8215 android_app {
8216 name: "AppFoo",
8217 srcs: ["foo/bar/MyClass.java"],
8218 sdk_version: "none",
8219 system_modules: "none",
8220 apex_available: [ "myapex" ],
8221 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008222 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008223
Jooyung Hana0503a52023-08-23 13:12:50 +09008224 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Jiyong Parkbd159612020-02-28 15:22:21 +09008225 content := bundleConfigRule.Args["content"]
8226
8227 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008228 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 +09008229}
8230
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008231func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008232 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008233 apex {
8234 name: "myapex",
8235 key: "myapex.key",
8236 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008237 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008238 }
8239
8240 apex_key {
8241 name: "myapex.key",
8242 public_key: "testkey.avbpubkey",
8243 private_key: "testkey.pem",
8244 }
8245
8246 android_app_set {
8247 name: "AppSet",
8248 set: "AppSet.apks",
8249 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008250 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008251 bundleConfigRule := mod.Output("bundle_config.json")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008252 content := bundleConfigRule.Args["content"]
8253 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8254 s := mod.Rule("apexRule").Args["copy_commands"]
8255 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008256 if len(copyCmds) != 4 {
8257 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008258 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008259 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8260 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008261 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8262 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008263
8264 // Ensure that canned_fs_config has an entry for the app set zip file
8265 generateFsRule := mod.Rule("generateFsConfig")
8266 cmd := generateFsRule.RuleParams.Command
8267 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008268}
8269
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008270func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008271 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008272 apex_set {
8273 name: "myapex",
8274 filename: "foo_v2.apex",
8275 sanitized: {
8276 none: { set: "myapex.apks", },
8277 hwaddress: { set: "myapex.hwasan.apks", },
8278 },
Paul Duffin24704672021-04-06 16:09:30 +01008279 }
8280 `
8281 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008282
Paul Duffin24704672021-04-06 16:09:30 +01008283 // Check that the extractor produces the correct output file from the correct input file.
8284 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008285
Paul Duffin24704672021-04-06 16:09:30 +01008286 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8287 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008288
Paul Duffin24704672021-04-06 16:09:30 +01008289 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8290
8291 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008292 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8293 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008294
8295 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008296}
8297
Pranav Guptaeba03b02022-09-27 00:27:08 +00008298func TestApexSetApksModuleAssignment(t *testing.T) {
8299 ctx := testApex(t, `
8300 apex_set {
8301 name: "myapex",
8302 set: ":myapex_apks_file",
8303 }
8304
8305 filegroup {
8306 name: "myapex_apks_file",
8307 srcs: ["myapex.apks"],
8308 }
8309 `)
8310
8311 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8312
8313 // Check that the extractor produces the correct apks file from the input module
8314 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8315 extractedApex := m.Output(extractorOutput)
8316
8317 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8318}
8319
Paul Duffin89f570a2021-06-16 01:42:33 +01008320func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008321 t.Helper()
8322
Paul Duffin55607122021-03-30 23:32:51 +01008323 fs := android.MockFS{
8324 "a.java": nil,
8325 "a.jar": nil,
8326 "apex_manifest.json": nil,
8327 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008328 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008329 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8330 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8331 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008332 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008333 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008334
Paul Duffin55607122021-03-30 23:32:51 +01008335 errorHandler := android.FixtureExpectsNoErrors
8336 if errmsg != "" {
8337 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008338 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008339
Paul Duffin55607122021-03-30 23:32:51 +01008340 result := android.GroupFixturePreparers(
8341 cc.PrepareForTestWithCcDefaultModules,
8342 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008343 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008344 java.PrepareForTestWithJavaSdkLibraryFiles,
8345 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008346 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008347 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008348 android.FixtureModifyMockFS(func(fs android.MockFS) {
8349 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8350 insert := ""
8351 for _, fragment := range fragments {
8352 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8353 }
8354 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8355 platform_bootclasspath {
8356 name: "platform-bootclasspath",
8357 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008358 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008359 %s
8360 ],
8361 }
8362 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008363 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008364 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008365 // Dexpreopt for boot jars requires the ART boot image profile.
8366 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8367 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008368 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008369 ).
8370 ExtendWithErrorHandler(errorHandler).
8371 RunTestWithBp(t, bp)
8372
8373 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008374}
8375
Paul Duffin5556c5f2022-06-09 17:32:21 +00008376func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008377 preparers := android.GroupFixturePreparers(
8378 java.PrepareForTestWithJavaDefaultModules,
8379 PrepareForTestWithApexBuildComponents,
8380 ).
8381 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8382 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8383
8384 bpBase := `
8385 apex_set {
8386 name: "com.android.myapex",
8387 installable: true,
8388 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8389 set: "myapex.apks",
8390 }
8391
8392 apex_set {
8393 name: "com.mycompany.android.myapex",
8394 apex_name: "com.android.myapex",
8395 installable: true,
8396 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8397 set: "company-myapex.apks",
8398 }
8399
8400 prebuilt_bootclasspath_fragment {
8401 name: "my-bootclasspath-fragment",
8402 apex_available: ["com.android.myapex"],
8403 %s
8404 }
8405 `
8406
8407 t.Run("java_import", func(t *testing.T) {
8408 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8409 java_import {
8410 name: "libfoo",
8411 jars: ["libfoo.jar"],
8412 apex_available: ["com.android.myapex"],
8413 }
8414 `)
8415 })
8416
8417 t.Run("java_sdk_library_import", func(t *testing.T) {
8418 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8419 java_sdk_library_import {
8420 name: "libfoo",
8421 public: {
8422 jars: ["libbar.jar"],
8423 },
8424 apex_available: ["com.android.myapex"],
8425 }
8426 `)
8427 })
8428
8429 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8430 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8431 image_name: "art",
8432 contents: ["libfoo"],
8433 `)+`
8434 java_sdk_library_import {
8435 name: "libfoo",
8436 public: {
8437 jars: ["libbar.jar"],
8438 },
8439 apex_available: ["com.android.myapex"],
8440 }
8441 `)
8442 })
8443}
8444
Paul Duffin5556c5f2022-06-09 17:32:21 +00008445func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8446 preparers := android.GroupFixturePreparers(
8447 java.PrepareForTestWithJavaDefaultModules,
8448 PrepareForTestWithApexBuildComponents,
8449 )
8450
8451 bpBase := `
8452 apex_set {
8453 name: "com.android.myapex",
8454 installable: true,
8455 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8456 set: "myapex.apks",
8457 }
8458
8459 apex_set {
8460 name: "com.android.myapex_compressed",
8461 apex_name: "com.android.myapex",
8462 installable: true,
8463 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8464 set: "myapex_compressed.apks",
8465 }
8466
8467 prebuilt_bootclasspath_fragment {
8468 name: "my-bootclasspath-fragment",
8469 apex_available: [
8470 "com.android.myapex",
8471 "com.android.myapex_compressed",
8472 ],
8473 hidden_api: {
8474 annotation_flags: "annotation-flags.csv",
8475 metadata: "metadata.csv",
8476 index: "index.csv",
8477 signature_patterns: "signature_patterns.csv",
8478 },
8479 %s
8480 }
8481 `
8482
8483 t.Run("java_import", func(t *testing.T) {
8484 result := preparers.RunTestWithBp(t,
8485 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8486 java_import {
8487 name: "libfoo",
8488 jars: ["libfoo.jar"],
8489 apex_available: [
8490 "com.android.myapex",
8491 "com.android.myapex_compressed",
8492 ],
8493 }
8494 `)
8495
8496 module := result.Module("libfoo", "android_common_com.android.myapex")
8497 usesLibraryDep := module.(java.UsesLibraryDependency)
8498 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8499 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8500 usesLibraryDep.DexJarBuildPath().Path())
8501 })
8502
8503 t.Run("java_sdk_library_import", func(t *testing.T) {
8504 result := preparers.RunTestWithBp(t,
8505 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8506 java_sdk_library_import {
8507 name: "libfoo",
8508 public: {
8509 jars: ["libbar.jar"],
8510 },
8511 apex_available: [
8512 "com.android.myapex",
8513 "com.android.myapex_compressed",
8514 ],
8515 compile_dex: true,
8516 }
8517 `)
8518
8519 module := result.Module("libfoo", "android_common_com.android.myapex")
8520 usesLibraryDep := module.(java.UsesLibraryDependency)
8521 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8522 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8523 usesLibraryDep.DexJarBuildPath().Path())
8524 })
8525
8526 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8527 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8528 image_name: "art",
8529 contents: ["libfoo"],
8530 `)+`
8531 java_sdk_library_import {
8532 name: "libfoo",
8533 public: {
8534 jars: ["libbar.jar"],
8535 },
8536 apex_available: [
8537 "com.android.myapex",
8538 "com.android.myapex_compressed",
8539 ],
8540 compile_dex: true,
8541 }
8542 `)
8543 })
8544}
8545
Jooyung Han548640b2020-04-27 12:10:30 +09008546func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8547 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8548 apex {
8549 name: "myapex",
8550 key: "myapex.key",
8551 updatable: true,
8552 }
8553
8554 apex_key {
8555 name: "myapex.key",
8556 public_key: "testkey.avbpubkey",
8557 private_key: "testkey.pem",
8558 }
8559 `)
8560}
8561
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008562func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8563 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8564 apex {
8565 name: "myapex",
8566 key: "myapex.key",
8567 }
8568
8569 apex_key {
8570 name: "myapex.key",
8571 public_key: "testkey.avbpubkey",
8572 private_key: "testkey.pem",
8573 }
8574 `)
8575}
8576
Jooyung Handfc864c2023-03-20 18:19:07 +09008577func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8578 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008579 apex {
8580 name: "myapex",
8581 key: "myapex.key",
8582 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008583 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008584 soc_specific: true,
8585 }
8586
8587 apex_key {
8588 name: "myapex.key",
8589 public_key: "testkey.avbpubkey",
8590 private_key: "testkey.pem",
8591 }
8592 `)
8593}
8594
Jooyung Han02873da2023-03-22 17:41:03 +09008595func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8596 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8597 apex {
8598 name: "myapex",
8599 key: "myapex.key",
8600 updatable: false,
8601 min_sdk_version: "29",
8602 use_vndk_as_stable: true,
8603 vendor: true,
8604 }
8605
8606 apex_key {
8607 name: "myapex.key",
8608 public_key: "testkey.avbpubkey",
8609 private_key: "testkey.pem",
8610 }
8611 `)
8612}
8613
Jooyung Handfc864c2023-03-20 18:19:07 +09008614func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8615 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8616 apex {
8617 name: "myapex",
8618 key: "myapex.key",
8619 updatable: false,
8620 use_vndk_as_stable: true,
8621 }
8622
8623 apex_key {
8624 name: "myapex.key",
8625 public_key: "testkey.avbpubkey",
8626 private_key: "testkey.pem",
8627 }
8628 `)
8629}
8630
satayevb98371c2021-06-15 16:49:50 +01008631func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8632 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8633 apex {
8634 name: "myapex",
8635 key: "myapex.key",
8636 systemserverclasspath_fragments: [
8637 "mysystemserverclasspathfragment",
8638 ],
8639 min_sdk_version: "29",
8640 updatable: true,
8641 }
8642
8643 apex_key {
8644 name: "myapex.key",
8645 public_key: "testkey.avbpubkey",
8646 private_key: "testkey.pem",
8647 }
8648
8649 java_library {
8650 name: "foo",
8651 srcs: ["b.java"],
8652 min_sdk_version: "29",
8653 installable: true,
8654 apex_available: [
8655 "myapex",
8656 ],
8657 }
8658
8659 systemserverclasspath_fragment {
8660 name: "mysystemserverclasspathfragment",
8661 generate_classpaths_proto: false,
8662 contents: [
8663 "foo",
8664 ],
8665 apex_available: [
8666 "myapex",
8667 ],
8668 }
satayevabcd5972021-08-06 17:49:46 +01008669 `,
8670 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8671 )
satayevb98371c2021-06-15 16:49:50 +01008672}
8673
Paul Duffin064b70c2020-11-02 17:32:38 +00008674func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008675 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008676 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008677 fragment := java.ApexVariantReference{
8678 Apex: proptools.StringPtr("myapex"),
8679 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8680 }
8681
Paul Duffin064b70c2020-11-02 17:32:38 +00008682 testDexpreoptWithApexes(t, `
8683 prebuilt_apex {
8684 name: "myapex" ,
8685 arch: {
8686 arm64: {
8687 src: "myapex-arm64.apex",
8688 },
8689 arm: {
8690 src: "myapex-arm.apex",
8691 },
8692 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008693 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8694 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008695
Paul Duffin89f570a2021-06-16 01:42:33 +01008696 prebuilt_bootclasspath_fragment {
8697 name: "my-bootclasspath-fragment",
8698 contents: ["libfoo"],
8699 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008700 hidden_api: {
8701 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8702 metadata: "my-bootclasspath-fragment/metadata.csv",
8703 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008704 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8705 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8706 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008707 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008708 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008709
Paul Duffin89f570a2021-06-16 01:42:33 +01008710 java_import {
8711 name: "libfoo",
8712 jars: ["libfoo.jar"],
8713 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008714 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008715 }
8716 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008717 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008718}
8719
Spandan Dasf14e2542021-11-12 00:01:37 +00008720func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008721 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008722 bp += `
8723 apex_key {
8724 name: "myapex.key",
8725 public_key: "testkey.avbpubkey",
8726 private_key: "testkey.pem",
8727 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008728 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008729 "lib1/src/A.java": nil,
8730 "lib2/src/B.java": nil,
8731 "system/sepolicy/apex/myapex-file_contexts": nil,
8732 }
8733
Paul Duffin45338f02021-03-30 23:07:52 +01008734 errorHandler := android.FixtureExpectsNoErrors
8735 if errmsg != "" {
8736 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008737 }
Colin Crossae8600b2020-10-29 17:09:13 -07008738
Paul Duffin45338f02021-03-30 23:07:52 +01008739 android.GroupFixturePreparers(
8740 android.PrepareForTestWithAndroidBuildComponents,
8741 java.PrepareForTestWithJavaBuildComponents,
8742 PrepareForTestWithApexBuildComponents,
8743 android.PrepareForTestWithNeverallowRules(rules),
8744 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008745 apexBootJars := make([]string, 0, len(bootJars))
8746 for _, apexBootJar := range bootJars {
8747 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008748 }
satayevd604b212021-07-21 14:23:52 +01008749 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008750 }),
8751 fs.AddToFixture(),
8752 ).
8753 ExtendWithErrorHandler(errorHandler).
8754 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008755}
8756
8757func TestApexPermittedPackagesRules(t *testing.T) {
8758 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008759 name string
8760 expectedError string
8761 bp string
8762 bootJars []string
8763 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008764 }{
8765
8766 {
8767 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8768 expectedError: "",
8769 bp: `
8770 java_library {
8771 name: "bcp_lib1",
8772 srcs: ["lib1/src/*.java"],
8773 permitted_packages: ["foo.bar"],
8774 apex_available: ["myapex"],
8775 sdk_version: "none",
8776 system_modules: "none",
8777 }
8778 java_library {
8779 name: "nonbcp_lib2",
8780 srcs: ["lib2/src/*.java"],
8781 apex_available: ["myapex"],
8782 permitted_packages: ["a.b"],
8783 sdk_version: "none",
8784 system_modules: "none",
8785 }
8786 apex {
8787 name: "myapex",
8788 key: "myapex.key",
8789 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008790 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008791 }`,
8792 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008793 bcpPermittedPackages: map[string][]string{
8794 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008795 "foo.bar",
8796 },
8797 },
8798 },
8799 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008800 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008801 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 +01008802 bp: `
8803 java_library {
8804 name: "bcp_lib1",
8805 srcs: ["lib1/src/*.java"],
8806 apex_available: ["myapex"],
8807 permitted_packages: ["foo.bar"],
8808 sdk_version: "none",
8809 system_modules: "none",
8810 }
8811 java_library {
8812 name: "bcp_lib2",
8813 srcs: ["lib2/src/*.java"],
8814 apex_available: ["myapex"],
8815 permitted_packages: ["foo.bar", "bar.baz"],
8816 sdk_version: "none",
8817 system_modules: "none",
8818 }
8819 apex {
8820 name: "myapex",
8821 key: "myapex.key",
8822 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008823 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008824 }
8825 `,
8826 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008827 bcpPermittedPackages: map[string][]string{
8828 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008829 "foo.bar",
8830 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008831 "bcp_lib2": []string{
8832 "foo.bar",
8833 },
8834 },
8835 },
8836 {
8837 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8838 expectedError: "",
8839 bp: `
8840 java_library {
8841 name: "bcp_lib_restricted",
8842 srcs: ["lib1/src/*.java"],
8843 apex_available: ["myapex"],
8844 permitted_packages: ["foo.bar"],
8845 sdk_version: "none",
8846 min_sdk_version: "29",
8847 system_modules: "none",
8848 }
8849 java_library {
8850 name: "bcp_lib_unrestricted",
8851 srcs: ["lib2/src/*.java"],
8852 apex_available: ["myapex"],
8853 permitted_packages: ["foo.bar", "bar.baz"],
8854 sdk_version: "none",
8855 min_sdk_version: "29",
8856 system_modules: "none",
8857 }
8858 apex {
8859 name: "myapex",
8860 key: "myapex.key",
8861 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8862 updatable: true,
8863 min_sdk_version: "29",
8864 }
8865 `,
8866 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8867 bcpPermittedPackages: map[string][]string{
8868 "bcp_lib1_non_updateable": []string{
8869 "foo.bar",
8870 },
8871 // 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 +01008872 },
8873 },
8874 }
8875 for _, tc := range testcases {
8876 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008877 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8878 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008879 })
8880 }
8881}
8882
Jiyong Park62304bb2020-04-13 16:19:48 +09008883func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008884 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008885 apex {
8886 name: "myapex",
8887 key: "myapex.key",
8888 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008889 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008890 }
8891
8892 apex_key {
8893 name: "myapex.key",
8894 public_key: "testkey.avbpubkey",
8895 private_key: "testkey.pem",
8896 }
8897
8898 cc_library {
8899 name: "mylib",
8900 srcs: ["mylib.cpp"],
8901 system_shared_libs: [],
8902 stl: "none",
8903 stubs: {
8904 versions: ["1"],
8905 },
8906 apex_available: ["myapex"],
8907 }
8908
8909 cc_library {
8910 name: "myprivlib",
8911 srcs: ["mylib.cpp"],
8912 system_shared_libs: [],
8913 stl: "none",
8914 apex_available: ["myapex"],
8915 }
8916
8917
8918 cc_test {
8919 name: "mytest",
8920 gtest: false,
8921 srcs: ["mylib.cpp"],
8922 system_shared_libs: [],
8923 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008924 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008925 test_for: ["myapex"]
8926 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008927
8928 cc_library {
8929 name: "mytestlib",
8930 srcs: ["mylib.cpp"],
8931 system_shared_libs: [],
8932 shared_libs: ["mylib", "myprivlib"],
8933 stl: "none",
8934 test_for: ["myapex"],
8935 }
8936
8937 cc_benchmark {
8938 name: "mybench",
8939 srcs: ["mylib.cpp"],
8940 system_shared_libs: [],
8941 shared_libs: ["mylib", "myprivlib"],
8942 stl: "none",
8943 test_for: ["myapex"],
8944 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008945 `)
8946
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008947 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008948 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008949 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8950 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8951 }
8952
8953 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008954 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008955 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8956 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8957 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8958}
Jiyong Park46a512f2020-12-04 18:02:13 +09008959
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008960func TestIndirectTestFor(t *testing.T) {
8961 ctx := testApex(t, `
8962 apex {
8963 name: "myapex",
8964 key: "myapex.key",
8965 native_shared_libs: ["mylib", "myprivlib"],
8966 updatable: false,
8967 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008968
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008969 apex_key {
8970 name: "myapex.key",
8971 public_key: "testkey.avbpubkey",
8972 private_key: "testkey.pem",
8973 }
8974
8975 cc_library {
8976 name: "mylib",
8977 srcs: ["mylib.cpp"],
8978 system_shared_libs: [],
8979 stl: "none",
8980 stubs: {
8981 versions: ["1"],
8982 },
8983 apex_available: ["myapex"],
8984 }
8985
8986 cc_library {
8987 name: "myprivlib",
8988 srcs: ["mylib.cpp"],
8989 system_shared_libs: [],
8990 stl: "none",
8991 shared_libs: ["mylib"],
8992 apex_available: ["myapex"],
8993 }
8994
8995 cc_library {
8996 name: "mytestlib",
8997 srcs: ["mylib.cpp"],
8998 system_shared_libs: [],
8999 shared_libs: ["myprivlib"],
9000 stl: "none",
9001 test_for: ["myapex"],
9002 }
9003 `)
9004
9005 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009006 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009007 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9008 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9009 }
9010
9011 // The platform variant of mytestlib links to the platform variant of the
9012 // internal myprivlib.
9013 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9014
9015 // The platform variant of myprivlib links to the platform variant of mylib
9016 // and bypasses its stubs.
9017 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 +09009018}
9019
Martin Stjernholmec009002021-03-27 15:18:31 +00009020func TestTestForForLibInOtherApex(t *testing.T) {
9021 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9022 _ = testApex(t, `
9023 apex {
9024 name: "com.android.art",
9025 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009026 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009027 updatable: false,
9028 }
9029
9030 apex {
9031 name: "com.android.art.debug",
9032 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009033 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009034 updatable: false,
9035 }
9036
9037 apex_key {
9038 name: "myapex.key",
9039 public_key: "testkey.avbpubkey",
9040 private_key: "testkey.pem",
9041 }
9042
9043 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009044 name: "libnativebridge",
9045 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009046 system_shared_libs: [],
9047 stl: "none",
9048 stubs: {
9049 versions: ["1"],
9050 },
9051 apex_available: ["com.android.art", "com.android.art.debug"],
9052 }
9053
9054 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009055 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009056 srcs: ["mylib.cpp"],
9057 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009058 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009059 stl: "none",
9060 apex_available: ["com.android.art.debug"],
9061 test_for: ["com.android.art"],
9062 }
9063 `,
9064 android.MockFS{
9065 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9066 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9067 }.AddToFixture())
9068}
9069
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009070// TODO(jungjw): Move this to proptools
9071func intPtr(i int) *int {
9072 return &i
9073}
9074
9075func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009076 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009077 apex_set {
9078 name: "myapex",
9079 set: "myapex.apks",
9080 filename: "foo_v2.apex",
9081 overrides: ["foo"],
9082 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009083 `,
9084 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9085 variables.Platform_sdk_version = intPtr(30)
9086 }),
9087 android.FixtureModifyConfig(func(config android.Config) {
9088 config.Targets[android.Android] = []android.Target{
9089 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9090 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9091 }
9092 }),
9093 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009094
Paul Duffin24704672021-04-06 16:09:30 +01009095 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009096
9097 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009098 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009099 actual := extractedApex.Args["abis"]
9100 expected := "ARMEABI_V7A,ARM64_V8A"
9101 if actual != expected {
9102 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9103 }
9104 actual = extractedApex.Args["sdk-version"]
9105 expected = "30"
9106 if actual != expected {
9107 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9108 }
9109
Paul Duffin6717d882021-06-15 19:09:41 +01009110 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009111 a := m.Module().(*ApexSet)
9112 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009113 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009114 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9115 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9116 }
9117}
9118
Anton Hansson805e0a52022-11-25 14:06:46 +00009119func TestApexSet_NativeBridge(t *testing.T) {
9120 ctx := testApex(t, `
9121 apex_set {
9122 name: "myapex",
9123 set: "myapex.apks",
9124 filename: "foo_v2.apex",
9125 overrides: ["foo"],
9126 }
9127 `,
9128 android.FixtureModifyConfig(func(config android.Config) {
9129 config.Targets[android.Android] = []android.Target{
9130 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9131 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9132 }
9133 }),
9134 )
9135
9136 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9137
9138 // Check extract_apks tool parameters. No native bridge arch expected
9139 extractedApex := m.Output("extracted/myapex.apks")
9140 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9141}
9142
Jiyong Park7d95a512020-05-10 15:16:24 +09009143func TestNoStaticLinkingToStubsLib(t *testing.T) {
9144 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9145 apex {
9146 name: "myapex",
9147 key: "myapex.key",
9148 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009149 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009150 }
9151
9152 apex_key {
9153 name: "myapex.key",
9154 public_key: "testkey.avbpubkey",
9155 private_key: "testkey.pem",
9156 }
9157
9158 cc_library {
9159 name: "mylib",
9160 srcs: ["mylib.cpp"],
9161 static_libs: ["otherlib"],
9162 system_shared_libs: [],
9163 stl: "none",
9164 apex_available: [ "myapex" ],
9165 }
9166
9167 cc_library {
9168 name: "otherlib",
9169 srcs: ["mylib.cpp"],
9170 system_shared_libs: [],
9171 stl: "none",
9172 stubs: {
9173 versions: ["1", "2", "3"],
9174 },
9175 apex_available: [ "myapex" ],
9176 }
9177 `)
9178}
9179
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009180func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009181 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009182 apex {
9183 name: "myapex",
9184 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009185 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009186 custom_sign_tool: "sign_myapex",
9187 }
9188
9189 apex_key {
9190 name: "myapex.key",
9191 public_key: "testkey.avbpubkey",
9192 private_key: "testkey.pem",
9193 }
9194 `)
9195
Jooyung Han286957d2023-10-30 16:17:56 +09009196 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
9197 content := myapex.Output("apexkeys.txt").BuildParams.Args["content"]
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009198 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 +09009199}
9200
9201func TestApexKeysTxtOverrides(t *testing.T) {
9202 ctx := testApex(t, `
9203 apex {
9204 name: "myapex",
9205 key: "myapex.key",
9206 updatable: false,
9207 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009208 }
9209
9210 apex_key {
9211 name: "myapex.key",
9212 public_key: "testkey.avbpubkey",
9213 private_key: "testkey.pem",
9214 }
9215
9216 prebuilt_apex {
9217 name: "myapex",
9218 prefer: true,
9219 arch: {
9220 arm64: {
9221 src: "myapex-arm64.apex",
9222 },
9223 arm: {
9224 src: "myapex-arm.apex",
9225 },
9226 },
9227 }
9228
9229 apex_set {
9230 name: "myapex_set",
9231 set: "myapex.apks",
9232 filename: "myapex_set.apex",
9233 overrides: ["myapex"],
9234 }
9235 `)
9236
Jooyung Han286957d2023-10-30 16:17:56 +09009237 content := ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt").BuildParams.Args["content"]
9238 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"`)
9239 content = ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt").BuildParams.Args["content"]
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009240 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 +09009241}
9242
Jooyung Han938b5932020-06-20 12:47:47 +09009243func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009244 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009245 apex {
9246 name: "myapex",
9247 key: "myapex.key",
9248 apps: ["app"],
9249 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009250 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009251 }
9252
9253 apex_key {
9254 name: "myapex.key",
9255 public_key: "testkey.avbpubkey",
9256 private_key: "testkey.pem",
9257 }
9258
9259 android_app {
9260 name: "app",
9261 srcs: ["foo/bar/MyClass.java"],
9262 package_name: "foo",
9263 sdk_version: "none",
9264 system_modules: "none",
9265 apex_available: [ "myapex" ],
9266 }
9267 `, withFiles(map[string][]byte{
9268 "sub/Android.bp": []byte(`
9269 override_apex {
9270 name: "override_myapex",
9271 base: "myapex",
9272 apps: ["override_app"],
9273 allowed_files: ":allowed",
9274 }
9275 // Overridable "path" property should be referenced indirectly
9276 filegroup {
9277 name: "allowed",
9278 srcs: ["allowed.txt"],
9279 }
9280 override_android_app {
9281 name: "override_app",
9282 base: "app",
9283 package_name: "bar",
9284 }
9285 `),
9286 }))
9287
Jooyung Hana0503a52023-08-23 13:12:50 +09009288 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009289 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9290 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9291 }
9292
Jooyung Hana0503a52023-08-23 13:12:50 +09009293 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009294 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9295 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9296 }
9297}
9298
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009299func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009300 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009301 apex {
9302 name: "myapex",
9303 key: "myapex.key",
9304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009305 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009306 }
9307
9308 apex_key {
9309 name: "myapex.key",
9310 public_key: "testkey.avbpubkey",
9311 private_key: "testkey.pem",
9312 }
9313
9314 cc_library {
9315 name: "mylib",
9316 srcs: ["mylib.cpp"],
9317 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009318 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009319 },
9320 apex_available: ["myapex"],
9321 }
9322
9323 cc_prebuilt_library_shared {
9324 name: "mylib",
9325 prefer: false,
9326 srcs: ["prebuilt.so"],
9327 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009328 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009329 },
9330 apex_available: ["myapex"],
9331 }
9332 `)
9333}
9334
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009335func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009336 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009337 apex {
9338 name: "myapex",
9339 key: "myapex.key",
9340 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009341 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009342 }
9343 apex_key {
9344 name: "myapex.key",
9345 public_key: "testkey.avbpubkey",
9346 private_key: "testkey.pem",
9347 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009348 `,
9349 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9350 variables.CompressedApex = proptools.BoolPtr(true)
9351 }),
9352 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009353
Jooyung Hana0503a52023-08-23 13:12:50 +09009354 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009355 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9356
Jooyung Hana0503a52023-08-23 13:12:50 +09009357 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009358 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9359
9360 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009361 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009362 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9363
9364 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009365 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009366 var builder strings.Builder
9367 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9368 androidMk := builder.String()
9369 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9370}
9371
Martin Stjernholm2856c662020-12-02 15:03:42 +00009372func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009373 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009374 apex {
9375 name: "myapex",
9376 key: "myapex.key",
9377 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009378 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009379 }
9380
9381 apex_key {
9382 name: "myapex.key",
9383 public_key: "testkey.avbpubkey",
9384 private_key: "testkey.pem",
9385 }
9386
9387 cc_library {
9388 name: "mylib",
9389 srcs: ["mylib.cpp"],
9390 apex_available: ["myapex"],
9391 shared_libs: ["otherlib"],
9392 system_shared_libs: [],
9393 }
9394
9395 cc_library {
9396 name: "otherlib",
9397 srcs: ["mylib.cpp"],
9398 stubs: {
9399 versions: ["current"],
9400 },
9401 }
9402
9403 cc_prebuilt_library_shared {
9404 name: "otherlib",
9405 prefer: true,
9406 srcs: ["prebuilt.so"],
9407 stubs: {
9408 versions: ["current"],
9409 },
9410 }
9411 `)
9412
Jooyung Hana0503a52023-08-23 13:12:50 +09009413 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009414 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009415 var builder strings.Builder
9416 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9417 androidMk := builder.String()
9418
9419 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9420 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009421 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009422}
9423
Jiyong Parke3867542020-12-03 17:28:25 +09009424func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009425 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009426 apex {
9427 name: "myapex",
9428 key: "myapex.key",
9429 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009430 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009431 }
9432
9433 apex_key {
9434 name: "myapex.key",
9435 public_key: "testkey.avbpubkey",
9436 private_key: "testkey.pem",
9437 }
9438
9439 cc_library {
9440 name: "mylib",
9441 srcs: ["mylib.cpp"],
9442 system_shared_libs: [],
9443 stl: "none",
9444 apex_available: ["myapex"],
9445 shared_libs: ["mylib2"],
9446 target: {
9447 apex: {
9448 exclude_shared_libs: ["mylib2"],
9449 },
9450 },
9451 }
9452
9453 cc_library {
9454 name: "mylib2",
9455 srcs: ["mylib.cpp"],
9456 system_shared_libs: [],
9457 stl: "none",
9458 }
9459 `)
9460
9461 // Check if mylib is linked to mylib2 for the non-apex target
9462 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9463 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9464
9465 // Make sure that the link doesn't occur for the apex target
9466 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9467 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9468
9469 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009470 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009471 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9472}
9473
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009474func TestPrebuiltStubLibDep(t *testing.T) {
9475 bpBase := `
9476 apex {
9477 name: "myapex",
9478 key: "myapex.key",
9479 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009480 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009481 }
9482 apex_key {
9483 name: "myapex.key",
9484 public_key: "testkey.avbpubkey",
9485 private_key: "testkey.pem",
9486 }
9487 cc_library {
9488 name: "mylib",
9489 srcs: ["mylib.cpp"],
9490 apex_available: ["myapex"],
9491 shared_libs: ["stublib"],
9492 system_shared_libs: [],
9493 }
9494 apex {
9495 name: "otherapex",
9496 enabled: %s,
9497 key: "myapex.key",
9498 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009499 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009500 }
9501 `
9502
9503 stublibSourceBp := `
9504 cc_library {
9505 name: "stublib",
9506 srcs: ["mylib.cpp"],
9507 apex_available: ["otherapex"],
9508 system_shared_libs: [],
9509 stl: "none",
9510 stubs: {
9511 versions: ["1"],
9512 },
9513 }
9514 `
9515
9516 stublibPrebuiltBp := `
9517 cc_prebuilt_library_shared {
9518 name: "stublib",
9519 srcs: ["prebuilt.so"],
9520 apex_available: ["otherapex"],
9521 stubs: {
9522 versions: ["1"],
9523 },
9524 %s
9525 }
9526 `
9527
9528 tests := []struct {
9529 name string
9530 stublibBp string
9531 usePrebuilt bool
9532 modNames []string // Modules to collect AndroidMkEntries for
9533 otherApexEnabled []string
9534 }{
9535 {
9536 name: "only_source",
9537 stublibBp: stublibSourceBp,
9538 usePrebuilt: false,
9539 modNames: []string{"stublib"},
9540 otherApexEnabled: []string{"true", "false"},
9541 },
9542 {
9543 name: "source_preferred",
9544 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9545 usePrebuilt: false,
9546 modNames: []string{"stublib", "prebuilt_stublib"},
9547 otherApexEnabled: []string{"true", "false"},
9548 },
9549 {
9550 name: "prebuilt_preferred",
9551 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9552 usePrebuilt: true,
9553 modNames: []string{"stublib", "prebuilt_stublib"},
9554 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9555 },
9556 {
9557 name: "only_prebuilt",
9558 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9559 usePrebuilt: true,
9560 modNames: []string{"stublib"},
9561 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9562 },
9563 }
9564
9565 for _, test := range tests {
9566 t.Run(test.name, func(t *testing.T) {
9567 for _, otherApexEnabled := range test.otherApexEnabled {
9568 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009569 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009570
9571 type modAndMkEntries struct {
9572 mod *cc.Module
9573 mkEntries android.AndroidMkEntries
9574 }
9575 entries := []*modAndMkEntries{}
9576
9577 // Gather shared lib modules that are installable
9578 for _, modName := range test.modNames {
9579 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9580 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9581 continue
9582 }
9583 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009584 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009585 continue
9586 }
Colin Crossaa255532020-07-03 13:18:24 -07009587 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009588 if ent.Disabled {
9589 continue
9590 }
9591 entries = append(entries, &modAndMkEntries{
9592 mod: mod,
9593 mkEntries: ent,
9594 })
9595 }
9596 }
9597 }
9598
9599 var entry *modAndMkEntries = nil
9600 for _, ent := range entries {
9601 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9602 if entry != nil {
9603 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9604 } else {
9605 entry = ent
9606 }
9607 }
9608 }
9609
9610 if entry == nil {
9611 t.Errorf("AndroidMk entry for \"stublib\" missing")
9612 } else {
9613 isPrebuilt := entry.mod.Prebuilt() != nil
9614 if isPrebuilt != test.usePrebuilt {
9615 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9616 }
9617 if !entry.mod.IsStubs() {
9618 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9619 }
9620 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9621 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9622 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009623 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009624 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009625 if !android.InList(expected, cflags) {
9626 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9627 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009628 }
9629 })
9630 }
9631 })
9632 }
9633}
9634
Colin Crossc33e5212021-05-25 18:16:02 -07009635func TestApexJavaCoverage(t *testing.T) {
9636 bp := `
9637 apex {
9638 name: "myapex",
9639 key: "myapex.key",
9640 java_libs: ["mylib"],
9641 bootclasspath_fragments: ["mybootclasspathfragment"],
9642 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9643 updatable: false,
9644 }
9645
9646 apex_key {
9647 name: "myapex.key",
9648 public_key: "testkey.avbpubkey",
9649 private_key: "testkey.pem",
9650 }
9651
9652 java_library {
9653 name: "mylib",
9654 srcs: ["mylib.java"],
9655 apex_available: ["myapex"],
9656 compile_dex: true,
9657 }
9658
9659 bootclasspath_fragment {
9660 name: "mybootclasspathfragment",
9661 contents: ["mybootclasspathlib"],
9662 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009663 hidden_api: {
9664 split_packages: ["*"],
9665 },
Colin Crossc33e5212021-05-25 18:16:02 -07009666 }
9667
9668 java_library {
9669 name: "mybootclasspathlib",
9670 srcs: ["mybootclasspathlib.java"],
9671 apex_available: ["myapex"],
9672 compile_dex: true,
9673 }
9674
9675 systemserverclasspath_fragment {
9676 name: "mysystemserverclasspathfragment",
9677 contents: ["mysystemserverclasspathlib"],
9678 apex_available: ["myapex"],
9679 }
9680
9681 java_library {
9682 name: "mysystemserverclasspathlib",
9683 srcs: ["mysystemserverclasspathlib.java"],
9684 apex_available: ["myapex"],
9685 compile_dex: true,
9686 }
9687 `
9688
9689 result := android.GroupFixturePreparers(
9690 PrepareForTestWithApexBuildComponents,
9691 prepareForTestWithMyapex,
9692 java.PrepareForTestWithJavaDefaultModules,
9693 android.PrepareForTestWithAndroidBuildComponents,
9694 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009695 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9696 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009697 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009698 ).RunTest(t)
9699
9700 // Make sure jacoco ran on both mylib and mybootclasspathlib
9701 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9702 t.Errorf("Failed to find jacoco rule for mylib")
9703 }
9704 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9705 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9706 }
9707 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9708 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9709 }
9710}
9711
Jiyong Park192600a2021-08-03 07:52:17 +00009712func TestProhibitStaticExecutable(t *testing.T) {
9713 testApexError(t, `executable mybin is static`, `
9714 apex {
9715 name: "myapex",
9716 key: "myapex.key",
9717 binaries: ["mybin"],
9718 min_sdk_version: "29",
9719 }
9720
9721 apex_key {
9722 name: "myapex.key",
9723 public_key: "testkey.avbpubkey",
9724 private_key: "testkey.pem",
9725 }
9726
9727 cc_binary {
9728 name: "mybin",
9729 srcs: ["mylib.cpp"],
9730 relative_install_path: "foo/bar",
9731 static_executable: true,
9732 system_shared_libs: [],
9733 stl: "none",
9734 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009735 min_sdk_version: "29",
9736 }
9737 `)
9738
9739 testApexError(t, `executable mybin.rust is static`, `
9740 apex {
9741 name: "myapex",
9742 key: "myapex.key",
9743 binaries: ["mybin.rust"],
9744 min_sdk_version: "29",
9745 }
9746
9747 apex_key {
9748 name: "myapex.key",
9749 public_key: "testkey.avbpubkey",
9750 private_key: "testkey.pem",
9751 }
9752
9753 rust_binary {
9754 name: "mybin.rust",
9755 srcs: ["foo.rs"],
9756 static_executable: true,
9757 apex_available: ["myapex"],
9758 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009759 }
9760 `)
9761}
9762
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009763func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9764 ctx := testApex(t, `
9765 apex {
9766 name: "myapex",
9767 key: "myapex.key",
9768 updatable: false,
9769 java_libs: ["foo"],
9770 }
9771
9772 apex_key {
9773 name: "myapex.key",
9774 public_key: "testkey.avbpubkey",
9775 private_key: "testkey.pem",
9776 }
9777
9778 java_library {
9779 name: "foo",
9780 srcs: ["foo.java"],
9781 apex_available: ["myapex"],
9782 installable: true,
9783 }
9784 `,
9785 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9786 )
9787
Jooyung Hana0503a52023-08-23 13:12:50 +09009788 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009789 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9790 var builder strings.Builder
9791 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9792 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009793 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 +00009794}
9795
9796func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9797 ctx := testApex(t, `
9798 prebuilt_apex {
9799 name: "myapex",
9800 arch: {
9801 arm64: {
9802 src: "myapex-arm64.apex",
9803 },
9804 arm: {
9805 src: "myapex-arm.apex",
9806 },
9807 },
9808 exported_java_libs: ["foo"],
9809 }
9810
9811 java_import {
9812 name: "foo",
9813 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009814 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009815 }
9816 `,
9817 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9818 )
9819
9820 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9821 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9822 mainModuleEntries := entriesList[0]
9823 android.AssertArrayString(t,
9824 "LOCAL_REQUIRED_MODULES",
9825 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9826 []string{
9827 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9828 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9829 })
9830}
9831
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009832func TestAndroidMk_RequiredModules(t *testing.T) {
9833 ctx := testApex(t, `
9834 apex {
9835 name: "myapex",
9836 key: "myapex.key",
9837 updatable: false,
9838 java_libs: ["foo"],
9839 required: ["otherapex"],
9840 }
9841
9842 apex {
9843 name: "otherapex",
9844 key: "myapex.key",
9845 updatable: false,
9846 java_libs: ["foo"],
9847 required: ["otherapex"],
9848 }
9849
9850 apex_key {
9851 name: "myapex.key",
9852 public_key: "testkey.avbpubkey",
9853 private_key: "testkey.pem",
9854 }
9855
9856 java_library {
9857 name: "foo",
9858 srcs: ["foo.java"],
9859 apex_available: ["myapex", "otherapex"],
9860 installable: true,
9861 }
9862 `)
9863
Jooyung Hana0503a52023-08-23 13:12:50 +09009864 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009865 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9866 var builder strings.Builder
9867 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9868 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009869 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009870}
9871
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009872func TestAndroidMk_RequiredDeps(t *testing.T) {
9873 ctx := testApex(t, `
9874 apex {
9875 name: "myapex",
9876 key: "myapex.key",
9877 updatable: false,
9878 }
9879
9880 apex_key {
9881 name: "myapex.key",
9882 public_key: "testkey.avbpubkey",
9883 private_key: "testkey.pem",
9884 }
9885 `)
9886
Jooyung Hana0503a52023-08-23 13:12:50 +09009887 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009888 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009889 data := android.AndroidMkDataForTest(t, ctx, bundle)
9890 var builder strings.Builder
9891 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9892 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009893 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009894}
9895
Jooyung Hana6d36672022-02-24 13:58:07 +09009896func TestApexOutputFileProducer(t *testing.T) {
9897 for _, tc := range []struct {
9898 name string
9899 ref string
9900 expected_data []string
9901 }{
9902 {
9903 name: "test_using_output",
9904 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009905 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009906 },
9907 {
9908 name: "test_using_apex",
9909 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009910 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009911 },
9912 } {
9913 t.Run(tc.name, func(t *testing.T) {
9914 ctx := testApex(t, `
9915 apex {
9916 name: "myapex",
9917 key: "myapex.key",
9918 compressible: true,
9919 updatable: false,
9920 }
9921
9922 apex_key {
9923 name: "myapex.key",
9924 public_key: "testkey.avbpubkey",
9925 private_key: "testkey.pem",
9926 }
9927
9928 java_test {
9929 name: "`+tc.name+`",
9930 srcs: ["a.java"],
9931 data: ["`+tc.ref+`"],
9932 }
9933 `,
9934 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9935 variables.CompressedApex = proptools.BoolPtr(true)
9936 }))
9937 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9938 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9939 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9940 })
9941 }
9942}
9943
satayev758968a2021-12-06 11:42:40 +00009944func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9945 preparer := android.GroupFixturePreparers(
9946 PrepareForTestWithApexBuildComponents,
9947 prepareForTestWithMyapex,
9948 java.PrepareForTestWithJavaSdkLibraryFiles,
9949 java.PrepareForTestWithJavaDefaultModules,
9950 android.PrepareForTestWithAndroidBuildComponents,
9951 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9952 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9953 )
9954
9955 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9956 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9957 preparer.RunTestWithBp(t, `
9958 apex {
9959 name: "myapex",
9960 key: "myapex.key",
9961 bootclasspath_fragments: ["mybootclasspathfragment"],
9962 min_sdk_version: "30",
9963 updatable: false,
9964 }
9965
9966 apex_key {
9967 name: "myapex.key",
9968 public_key: "testkey.avbpubkey",
9969 private_key: "testkey.pem",
9970 }
9971
9972 bootclasspath_fragment {
9973 name: "mybootclasspathfragment",
9974 contents: ["mybootclasspathlib"],
9975 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009976 hidden_api: {
9977 split_packages: ["*"],
9978 },
satayev758968a2021-12-06 11:42:40 +00009979 }
9980
9981 java_sdk_library {
9982 name: "mybootclasspathlib",
9983 srcs: ["mybootclasspathlib.java"],
9984 apex_available: ["myapex"],
9985 compile_dex: true,
9986 unsafe_ignore_missing_latest_api: true,
9987 min_sdk_version: "31",
9988 static_libs: ["util"],
9989 }
9990
9991 java_library {
9992 name: "util",
9993 srcs: ["a.java"],
9994 apex_available: ["myapex"],
9995 min_sdk_version: "31",
9996 static_libs: ["another_util"],
9997 }
9998
9999 java_library {
10000 name: "another_util",
10001 srcs: ["a.java"],
10002 min_sdk_version: "31",
10003 apex_available: ["myapex"],
10004 }
10005 `)
10006 })
10007
10008 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10009 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10010 preparer.RunTestWithBp(t, `
10011 apex {
10012 name: "myapex",
10013 key: "myapex.key",
10014 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10015 min_sdk_version: "30",
10016 updatable: false,
10017 }
10018
10019 apex_key {
10020 name: "myapex.key",
10021 public_key: "testkey.avbpubkey",
10022 private_key: "testkey.pem",
10023 }
10024
10025 systemserverclasspath_fragment {
10026 name: "mysystemserverclasspathfragment",
10027 contents: ["mysystemserverclasspathlib"],
10028 apex_available: ["myapex"],
10029 }
10030
10031 java_sdk_library {
10032 name: "mysystemserverclasspathlib",
10033 srcs: ["mysystemserverclasspathlib.java"],
10034 apex_available: ["myapex"],
10035 compile_dex: true,
10036 min_sdk_version: "32",
10037 unsafe_ignore_missing_latest_api: true,
10038 static_libs: ["util"],
10039 }
10040
10041 java_library {
10042 name: "util",
10043 srcs: ["a.java"],
10044 apex_available: ["myapex"],
10045 min_sdk_version: "31",
10046 static_libs: ["another_util"],
10047 }
10048
10049 java_library {
10050 name: "another_util",
10051 srcs: ["a.java"],
10052 min_sdk_version: "31",
10053 apex_available: ["myapex"],
10054 }
10055 `)
10056 })
10057
10058 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10059 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10060 RunTestWithBp(t, `
10061 apex {
10062 name: "myapex",
10063 key: "myapex.key",
10064 bootclasspath_fragments: ["mybootclasspathfragment"],
10065 min_sdk_version: "30",
10066 updatable: false,
10067 }
10068
10069 apex_key {
10070 name: "myapex.key",
10071 public_key: "testkey.avbpubkey",
10072 private_key: "testkey.pem",
10073 }
10074
10075 bootclasspath_fragment {
10076 name: "mybootclasspathfragment",
10077 contents: ["mybootclasspathlib"],
10078 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010079 hidden_api: {
10080 split_packages: ["*"],
10081 },
satayev758968a2021-12-06 11:42:40 +000010082 }
10083
10084 java_sdk_library {
10085 name: "mybootclasspathlib",
10086 srcs: ["mybootclasspathlib.java"],
10087 apex_available: ["myapex"],
10088 compile_dex: true,
10089 unsafe_ignore_missing_latest_api: true,
10090 }
10091 `)
10092 })
10093
10094 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10095 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10096 RunTestWithBp(t, `
10097 apex {
10098 name: "myapex",
10099 key: "myapex.key",
10100 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10101 min_sdk_version: "30",
10102 updatable: false,
10103 }
10104
10105 apex_key {
10106 name: "myapex.key",
10107 public_key: "testkey.avbpubkey",
10108 private_key: "testkey.pem",
10109 }
10110
10111 systemserverclasspath_fragment {
10112 name: "mysystemserverclasspathfragment",
10113 contents: ["mysystemserverclasspathlib"],
10114 apex_available: ["myapex"],
10115 }
10116
10117 java_sdk_library {
10118 name: "mysystemserverclasspathlib",
10119 srcs: ["mysystemserverclasspathlib.java"],
10120 apex_available: ["myapex"],
10121 compile_dex: true,
10122 unsafe_ignore_missing_latest_api: true,
10123 }
10124 `)
10125 })
10126}
10127
Jiakai Zhang6decef92022-01-12 17:56:19 +000010128// Verifies that the APEX depends on all the Make modules in the list.
10129func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10130 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10131 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010132 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010133 }
10134}
10135
10136// Verifies that the APEX does not depend on any of the Make modules in the list.
10137func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10138 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10139 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010140 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010141 }
10142}
10143
Cole Faust1021ccd2023-02-26 21:15:25 -080010144// TODO(b/193460475): Re-enable this test
10145//func TestApexStrictUpdtabilityLint(t *testing.T) {
10146// bpTemplate := `
10147// apex {
10148// name: "myapex",
10149// key: "myapex.key",
10150// java_libs: ["myjavalib"],
10151// updatable: %v,
10152// min_sdk_version: "29",
10153// }
10154// apex_key {
10155// name: "myapex.key",
10156// }
10157// java_library {
10158// name: "myjavalib",
10159// srcs: ["MyClass.java"],
10160// apex_available: [ "myapex" ],
10161// lint: {
10162// strict_updatability_linting: %v,
10163// },
10164// sdk_version: "current",
10165// min_sdk_version: "29",
10166// }
10167// `
10168// fs := android.MockFS{
10169// "lint-baseline.xml": nil,
10170// }
10171//
10172// testCases := []struct {
10173// testCaseName string
10174// apexUpdatable bool
10175// javaStrictUpdtabilityLint bool
10176// lintFileExists bool
10177// disallowedFlagExpected bool
10178// }{
10179// {
10180// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10181// apexUpdatable: true,
10182// javaStrictUpdtabilityLint: true,
10183// lintFileExists: false,
10184// disallowedFlagExpected: false,
10185// },
10186// {
10187// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10188// apexUpdatable: false,
10189// javaStrictUpdtabilityLint: false,
10190// lintFileExists: true,
10191// disallowedFlagExpected: false,
10192// },
10193// {
10194// testCaseName: "non-updatable apex respects strict updatability of javalib",
10195// apexUpdatable: false,
10196// javaStrictUpdtabilityLint: true,
10197// lintFileExists: true,
10198// disallowedFlagExpected: true,
10199// },
10200// {
10201// testCaseName: "updatable apex sets strict updatability of javalib to true",
10202// apexUpdatable: true,
10203// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10204// lintFileExists: true,
10205// disallowedFlagExpected: true,
10206// },
10207// }
10208//
10209// for _, testCase := range testCases {
10210// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10211// fixtures := []android.FixturePreparer{}
10212// if testCase.lintFileExists {
10213// fixtures = append(fixtures, fs.AddToFixture())
10214// }
10215//
10216// result := testApex(t, bp, fixtures...)
10217// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10218// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10219// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10220//
10221// if disallowedFlagActual != testCase.disallowedFlagExpected {
10222// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10223// }
10224// }
10225//}
10226//
10227//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10228// bp := `
10229// apex {
10230// name: "myapex",
10231// key: "myapex.key",
10232// java_libs: ["myjavalib"],
10233// updatable: true,
10234// min_sdk_version: "29",
10235// }
10236// apex_key {
10237// name: "myapex.key",
10238// }
10239// java_library {
10240// name: "myjavalib",
10241// srcs: ["MyClass.java"],
10242// apex_available: [ "myapex" ],
10243// sdk_version: "current",
10244// min_sdk_version: "29",
10245// }
10246// `
10247//
10248// testCases := []struct {
10249// testCaseName string
10250// moduleDirectory string
10251// disallowedFlagExpected bool
10252// }{
10253// {
10254// testCaseName: "lintable module defined outside libcore",
10255// moduleDirectory: "",
10256// disallowedFlagExpected: true,
10257// },
10258// {
10259// testCaseName: "lintable module defined in libcore root directory",
10260// moduleDirectory: "libcore/",
10261// disallowedFlagExpected: false,
10262// },
10263// {
10264// testCaseName: "lintable module defined in libcore child directory",
10265// moduleDirectory: "libcore/childdir/",
10266// disallowedFlagExpected: true,
10267// },
10268// }
10269//
10270// for _, testCase := range testCases {
10271// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10272// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10273// result := testApex(t, "", lintFileCreator, bpFileCreator)
10274// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10275// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10276// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10277// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10278//
10279// if disallowedFlagActual != testCase.disallowedFlagExpected {
10280// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10281// }
10282// }
10283//}
10284//
10285//// checks transtive deps of an apex coming from bootclasspath_fragment
10286//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10287// bp := `
10288// apex {
10289// name: "myapex",
10290// key: "myapex.key",
10291// bootclasspath_fragments: ["mybootclasspathfragment"],
10292// updatable: true,
10293// min_sdk_version: "29",
10294// }
10295// apex_key {
10296// name: "myapex.key",
10297// }
10298// bootclasspath_fragment {
10299// name: "mybootclasspathfragment",
10300// contents: ["myjavalib"],
10301// apex_available: ["myapex"],
10302// hidden_api: {
10303// split_packages: ["*"],
10304// },
10305// }
10306// java_library {
10307// name: "myjavalib",
10308// srcs: ["MyClass.java"],
10309// apex_available: [ "myapex" ],
10310// sdk_version: "current",
10311// min_sdk_version: "29",
10312// compile_dex: true,
10313// }
10314// `
10315// fs := android.MockFS{
10316// "lint-baseline.xml": nil,
10317// }
10318//
10319// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10320// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10321// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10322// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10323// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10324// }
10325//}
Spandan Das66773252022-01-15 00:23:18 +000010326
Spandan Das42e89502022-05-06 22:12:55 +000010327// updatable apexes should propagate updatable=true to its apps
10328func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10329 bp := `
10330 apex {
10331 name: "myapex",
10332 key: "myapex.key",
10333 updatable: %v,
10334 apps: [
10335 "myapp",
10336 ],
10337 min_sdk_version: "30",
10338 }
10339 apex_key {
10340 name: "myapex.key",
10341 }
10342 android_app {
10343 name: "myapp",
10344 updatable: %v,
10345 apex_available: [
10346 "myapex",
10347 ],
10348 sdk_version: "current",
10349 min_sdk_version: "30",
10350 }
10351 `
10352 testCases := []struct {
10353 name string
10354 apex_is_updatable_bp bool
10355 app_is_updatable_bp bool
10356 app_is_updatable_expected bool
10357 }{
10358 {
10359 name: "Non-updatable apex respects updatable property of non-updatable app",
10360 apex_is_updatable_bp: false,
10361 app_is_updatable_bp: false,
10362 app_is_updatable_expected: false,
10363 },
10364 {
10365 name: "Non-updatable apex respects updatable property of updatable app",
10366 apex_is_updatable_bp: false,
10367 app_is_updatable_bp: true,
10368 app_is_updatable_expected: true,
10369 },
10370 {
10371 name: "Updatable apex respects updatable property of updatable app",
10372 apex_is_updatable_bp: true,
10373 app_is_updatable_bp: true,
10374 app_is_updatable_expected: true,
10375 },
10376 {
10377 name: "Updatable apex sets updatable=true on non-updatable app",
10378 apex_is_updatable_bp: true,
10379 app_is_updatable_bp: false,
10380 app_is_updatable_expected: true,
10381 },
10382 }
10383 for _, testCase := range testCases {
10384 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10385 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10386 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10387 }
10388}
10389
Kiyoung Kim487689e2022-07-26 09:48:22 +090010390func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10391 bp := `
10392 apex {
10393 name: "myapex",
10394 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010395 native_shared_libs: ["libbaz"],
10396 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010397 min_sdk_version: "29",
10398 }
10399 apex_key {
10400 name: "myapex.key",
10401 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010402 cc_binary {
10403 name: "binfoo",
10404 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010405 apex_available: ["myapex"],
10406 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010407 recovery_available: false,
10408 }
10409 cc_library {
10410 name: "libbar",
10411 srcs: ["libbar.cc"],
10412 stubs: {
10413 symbol_file: "libbar.map.txt",
10414 versions: [
10415 "29",
10416 ],
10417 },
10418 }
10419 cc_library {
10420 name: "libbaz",
10421 srcs: ["libbaz.cc"],
10422 apex_available: ["myapex"],
10423 min_sdk_version: "29",
10424 stubs: {
10425 symbol_file: "libbaz.map.txt",
10426 versions: [
10427 "29",
10428 ],
10429 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010430 }
10431 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010432 name: "libbar",
10433 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010434 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010435 variants: ["apex.29"],
10436 }
10437 cc_api_variant {
10438 name: "libbar",
10439 variant: "apex",
10440 version: "29",
10441 src: "libbar_apex_29.so",
10442 }
10443 cc_api_library {
10444 name: "libbaz",
10445 src: "libbaz_stub.so",
10446 min_sdk_version: "29",
10447 variants: ["apex.29"],
10448 }
10449 cc_api_variant {
10450 name: "libbaz",
10451 variant: "apex",
10452 version: "29",
10453 src: "libbaz_apex_29.so",
10454 }
10455 cc_api_library {
10456 name: "libqux",
10457 src: "libqux_stub.so",
10458 min_sdk_version: "29",
10459 variants: ["apex.29"],
10460 }
10461 cc_api_variant {
10462 name: "libqux",
10463 variant: "apex",
10464 version: "29",
10465 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010466 }
10467 api_imports {
10468 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010469 apex_shared_libs: [
10470 "libbar",
10471 "libbaz",
10472 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010473 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010474 }
10475 `
10476 result := testApex(t, bp)
10477
10478 hasDep := func(m android.Module, wantDep android.Module) bool {
10479 t.Helper()
10480 var found bool
10481 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10482 if dep == wantDep {
10483 found = true
10484 }
10485 })
10486 return found
10487 }
10488
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010489 // Library defines stubs and cc_api_library should be used with cc_api_library
10490 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10491 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10492 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010493
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010494 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10495 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010496
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010497 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10498 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10499 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10500 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10501
10502 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10503 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10504 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10505 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10506 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10507
10508 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10509 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10510 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10511
10512 // cc_api_library defined without original library should be linked with cc_api_library
10513 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10514 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10515 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10516}
10517
10518func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10519 bp := `
10520 apex {
10521 name: "myapex",
10522 key: "myapex.key",
10523 native_shared_libs: ["libbar"],
10524 min_sdk_version: "29",
10525 }
10526 apex_key {
10527 name: "myapex.key",
10528 }
10529 cc_binary {
10530 name: "binfoo",
10531 shared_libs: ["libbar"],
10532 recovery_available: false,
10533 }
10534 cc_library {
10535 name: "libbar",
10536 srcs: ["libbar.cc"],
10537 apex_available: ["myapex"],
10538 min_sdk_version: "29",
10539 stubs: {
10540 symbol_file: "libbar.map.txt",
10541 versions: [
10542 "29",
10543 ],
10544 },
10545 }
10546 cc_api_library {
10547 name: "libbar",
10548 src: "libbar_stub.so",
10549 variants: ["apex.29"],
10550 }
10551 cc_api_variant {
10552 name: "libbar",
10553 variant: "apex",
10554 version: "29",
10555 src: "libbar_apex_29.so",
10556 }
10557 api_imports {
10558 name: "api_imports",
10559 apex_shared_libs: [
10560 "libbar",
10561 ],
10562 }
10563 `
10564
10565 result := testApex(t, bp)
10566
10567 hasDep := func(m android.Module, wantDep android.Module) bool {
10568 t.Helper()
10569 var found bool
10570 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10571 if dep == wantDep {
10572 found = true
10573 }
10574 })
10575 return found
10576 }
10577
10578 // Library defines stubs and cc_api_library should be used with cc_api_library
10579 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10580 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10581 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10582
10583 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10584 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10585
10586 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10587 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10588 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10589 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010590}
Dennis Shend4f5d932023-01-31 20:27:21 +000010591
10592func TestTrimmedApex(t *testing.T) {
10593 bp := `
10594 apex {
10595 name: "myapex",
10596 key: "myapex.key",
10597 native_shared_libs: ["libfoo","libbaz"],
10598 min_sdk_version: "29",
10599 trim_against: "mydcla",
10600 }
10601 apex {
10602 name: "mydcla",
10603 key: "myapex.key",
10604 native_shared_libs: ["libfoo","libbar"],
10605 min_sdk_version: "29",
10606 file_contexts: ":myapex-file_contexts",
10607 dynamic_common_lib_apex: true,
10608 }
10609 apex_key {
10610 name: "myapex.key",
10611 }
10612 cc_library {
10613 name: "libfoo",
10614 shared_libs: ["libc"],
10615 apex_available: ["myapex","mydcla"],
10616 min_sdk_version: "29",
10617 }
10618 cc_library {
10619 name: "libbar",
10620 shared_libs: ["libc"],
10621 apex_available: ["myapex","mydcla"],
10622 min_sdk_version: "29",
10623 }
10624 cc_library {
10625 name: "libbaz",
10626 shared_libs: ["libc"],
10627 apex_available: ["myapex","mydcla"],
10628 min_sdk_version: "29",
10629 }
10630 cc_api_library {
10631 name: "libc",
10632 src: "libc.so",
10633 min_sdk_version: "29",
10634 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010635 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010636 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010637 }
10638 api_imports {
10639 name: "api_imports",
10640 shared_libs: [
10641 "libc",
10642 ],
10643 header_libs: [],
10644 }
10645 `
10646 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010647 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010648 apexRule := module.MaybeRule("apexRule")
10649 if apexRule.Rule == nil {
10650 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10651 }
10652
10653 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010654 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010655 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10656 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10657 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10658 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10659}
Jingwen Chendea7a642023-03-28 11:30:50 +000010660
10661func TestCannedFsConfig(t *testing.T) {
10662 ctx := testApex(t, `
10663 apex {
10664 name: "myapex",
10665 key: "myapex.key",
10666 updatable: false,
10667 }
10668
10669 apex_key {
10670 name: "myapex.key",
10671 public_key: "testkey.avbpubkey",
10672 private_key: "testkey.pem",
10673 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010674 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010675 generateFsRule := mod.Rule("generateFsConfig")
10676 cmd := generateFsRule.RuleParams.Command
10677
10678 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10679}
10680
10681func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10682 ctx := testApex(t, `
10683 apex {
10684 name: "myapex",
10685 key: "myapex.key",
10686 canned_fs_config: "my_config",
10687 updatable: false,
10688 }
10689
10690 apex_key {
10691 name: "myapex.key",
10692 public_key: "testkey.avbpubkey",
10693 private_key: "testkey.pem",
10694 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010695 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010696 generateFsRule := mod.Rule("generateFsConfig")
10697 cmd := generateFsRule.RuleParams.Command
10698
10699 // Ensure that canned_fs_config has "cat my_config" at the end
10700 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10701}
Spandan Das20fce2d2023-04-12 17:21:39 +000010702
10703func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10704 testCases := []struct {
10705 desc string
10706 hasStubs bool
10707 apexAvailable string
10708 expectedError string
10709 }{
10710 {
10711 desc: "non-stub library can have multiple apex_available",
10712 hasStubs: false,
10713 apexAvailable: `["myapex", "otherapex"]`,
10714 },
10715 {
10716 desc: "stub library should not be available to anyapex",
10717 hasStubs: true,
10718 apexAvailable: `["//apex_available:anyapex"]`,
10719 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10720 },
10721 {
10722 desc: "stub library should not be available to multiple apexes",
10723 hasStubs: true,
10724 apexAvailable: `["myapex", "otherapex"]`,
10725 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10726 },
10727 {
10728 desc: "stub library can be available to a core apex and a test apex",
10729 hasStubs: true,
10730 apexAvailable: `["myapex", "test_myapex"]`,
10731 },
10732 }
10733 bpTemplate := `
10734 cc_library {
10735 name: "libfoo",
10736 %v
10737 apex_available: %v,
10738 }
10739 apex {
10740 name: "myapex",
10741 key: "apex.key",
10742 updatable: false,
10743 native_shared_libs: ["libfoo"],
10744 }
10745 apex {
10746 name: "otherapex",
10747 key: "apex.key",
10748 updatable: false,
10749 }
10750 apex_test {
10751 name: "test_myapex",
10752 key: "apex.key",
10753 updatable: false,
10754 native_shared_libs: ["libfoo"],
10755 }
10756 apex_key {
10757 name: "apex.key",
10758 }
10759 `
10760 for _, tc := range testCases {
10761 stubs := ""
10762 if tc.hasStubs {
10763 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10764 }
10765 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10766 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10767 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10768 })
10769 if tc.expectedError == "" {
10770 testApex(t, bp, mockFsFixturePreparer)
10771 } else {
10772 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10773 }
10774 }
10775}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010776
10777func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10778 context := android.GroupFixturePreparers(
10779 android.PrepareForIntegrationTestWithAndroid,
10780 cc.PrepareForIntegrationTestWithCc,
10781 PrepareForTestWithApexBuildComponents,
10782 prepareForTestWithMyapex,
10783 filesystem.PrepareForTestWithFilesystemBuildComponents,
10784 )
10785 result := context.RunTestWithBp(t, `
10786 android_system_image {
10787 name: "myfilesystem",
10788 deps: [
10789 "libfoo",
10790 ],
10791 linker_config_src: "linker.config.json",
10792 }
10793
10794 cc_library {
10795 name: "libfoo",
10796 shared_libs: [
10797 "libbar",
10798 ],
10799 stl: "none",
10800 }
10801
10802 cc_library {
10803 name: "libbar",
10804 stl: "none",
10805 apex_available: ["myapex"],
10806 }
10807
10808 apex {
10809 name: "myapex",
10810 native_shared_libs: ["libbar"],
10811 key: "myapex.key",
10812 updatable: false,
10813 }
10814
10815 apex_key {
10816 name: "myapex.key",
10817 public_key: "testkey.avbpubkey",
10818 private_key: "testkey.pem",
10819 }
10820 `)
10821
10822 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10823 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10824 inputs.Strings(),
10825 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10826}
Yu Liueae7b362023-11-16 17:05:47 -080010827
10828var apex_default_bp = `
10829 apex_key {
10830 name: "myapex.key",
10831 public_key: "testkey.avbpubkey",
10832 private_key: "testkey.pem",
10833 }
10834
10835 filegroup {
10836 name: "myapex.manifest",
10837 srcs: ["apex_manifest.json"],
10838 }
10839
10840 filegroup {
10841 name: "myapex.androidmanifest",
10842 srcs: ["AndroidManifest.xml"],
10843 }
10844`
10845
10846func TestAconfigFilesJavaDeps(t *testing.T) {
10847 ctx := testApex(t, apex_default_bp+`
10848 apex {
10849 name: "myapex",
10850 manifest: ":myapex.manifest",
10851 androidManifest: ":myapex.androidmanifest",
10852 key: "myapex.key",
10853 java_libs: [
10854 "my_java_library_foo",
10855 "my_java_library_bar",
10856 ],
10857 updatable: false,
10858 }
10859
10860 java_library {
10861 name: "my_java_library_foo",
10862 srcs: ["foo/bar/MyClass.java"],
10863 sdk_version: "none",
10864 system_modules: "none",
10865 static_libs: ["my_java_aconfig_library_foo"],
10866 // TODO: remove //apex_available:platform
10867 apex_available: [
10868 "//apex_available:platform",
10869 "myapex",
10870 ],
10871 }
10872
10873 java_library {
10874 name: "my_java_library_bar",
10875 srcs: ["foo/bar/MyClass.java"],
10876 sdk_version: "none",
10877 system_modules: "none",
10878 static_libs: ["my_java_aconfig_library_bar"],
10879 // TODO: remove //apex_available:platform
10880 apex_available: [
10881 "//apex_available:platform",
10882 "myapex",
10883 ],
10884 }
10885
10886 aconfig_declarations {
10887 name: "my_aconfig_declarations_foo",
10888 package: "com.example.package",
10889 container: "myapex",
10890 srcs: ["foo.aconfig"],
10891 }
10892
10893 java_aconfig_library {
10894 name: "my_java_aconfig_library_foo",
10895 aconfig_declarations: "my_aconfig_declarations_foo",
10896 // TODO: remove //apex_available:platform
10897 apex_available: [
10898 "//apex_available:platform",
10899 "myapex",
10900 ],
10901 }
10902
10903 aconfig_declarations {
10904 name: "my_aconfig_declarations_bar",
10905 package: "com.example.package",
10906 container: "myapex",
10907 srcs: ["bar.aconfig"],
10908 }
10909
10910 java_aconfig_library {
10911 name: "my_java_aconfig_library_bar",
10912 aconfig_declarations: "my_aconfig_declarations_bar",
10913 // TODO: remove //apex_available:platform
10914 apex_available: [
10915 "//apex_available:platform",
10916 "myapex",
10917 ],
10918 }
10919 `)
10920
10921 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10922 s := mod.Rule("apexRule").Args["copy_commands"]
10923 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10924 if len(copyCmds) != 5 {
10925 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10926 }
10927
10928 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10929
10930 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10931 s = " " + combineAconfigRule.Args["cache_files"]
10932 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10933 if len(aconfigArgs) != 2 {
10934 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
10935 }
10936 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10937 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
10938
10939 buildParams := combineAconfigRule.BuildParams
10940 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10941 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
10942 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10943}
10944
10945func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10946 ctx := testApex(t, apex_default_bp+`
10947 apex {
10948 name: "myapex",
10949 manifest: ":myapex.manifest",
10950 androidManifest: ":myapex.androidmanifest",
10951 key: "myapex.key",
10952 java_libs: [
10953 "my_java_library_foo",
10954 ],
10955 native_shared_libs: [
10956 "my_cc_library_bar",
10957 ],
10958 binaries: [
10959 "my_cc_binary_baz",
10960 ],
10961 updatable: false,
10962 }
10963
10964 java_library {
10965 name: "my_java_library_foo",
10966 srcs: ["foo/bar/MyClass.java"],
10967 sdk_version: "none",
10968 system_modules: "none",
10969 static_libs: ["my_java_aconfig_library_foo"],
10970 // TODO: remove //apex_available:platform
10971 apex_available: [
10972 "//apex_available:platform",
10973 "myapex",
10974 ],
10975 }
10976
10977 cc_library {
10978 name: "my_cc_library_bar",
10979 srcs: ["foo/bar/MyClass.cc"],
10980 static_libs: ["my_cc_aconfig_library_bar"],
10981 // TODO: remove //apex_available:platform
10982 apex_available: [
10983 "//apex_available:platform",
10984 "myapex",
10985 ],
10986 }
10987
10988 cc_binary {
10989 name: "my_cc_binary_baz",
10990 srcs: ["foo/bar/MyClass.cc"],
10991 static_libs: ["my_cc_aconfig_library_baz"],
10992 // TODO: remove //apex_available:platform
10993 apex_available: [
10994 "//apex_available:platform",
10995 "myapex",
10996 ],
10997 }
10998
10999 aconfig_declarations {
11000 name: "my_aconfig_declarations_foo",
11001 package: "com.example.package",
11002 container: "myapex",
11003 srcs: ["foo.aconfig"],
11004 }
11005
11006 java_aconfig_library {
11007 name: "my_java_aconfig_library_foo",
11008 aconfig_declarations: "my_aconfig_declarations_foo",
11009 // TODO: remove //apex_available:platform
11010 apex_available: [
11011 "//apex_available:platform",
11012 "myapex",
11013 ],
11014 }
11015
11016 aconfig_declarations {
11017 name: "my_aconfig_declarations_bar",
11018 package: "com.example.package",
11019 container: "myapex",
11020 srcs: ["bar.aconfig"],
11021 }
11022
11023 cc_aconfig_library {
11024 name: "my_cc_aconfig_library_bar",
11025 aconfig_declarations: "my_aconfig_declarations_bar",
11026 // TODO: remove //apex_available:platform
11027 apex_available: [
11028 "//apex_available:platform",
11029 "myapex",
11030 ],
11031 }
11032
11033 aconfig_declarations {
11034 name: "my_aconfig_declarations_baz",
11035 package: "com.example.package",
11036 container: "myapex",
11037 srcs: ["baz.aconfig"],
11038 }
11039
11040 cc_aconfig_library {
11041 name: "my_cc_aconfig_library_baz",
11042 aconfig_declarations: "my_aconfig_declarations_baz",
11043 // TODO: remove //apex_available:platform
11044 apex_available: [
11045 "//apex_available:platform",
11046 "myapex",
11047 ],
11048 }
11049
11050 cc_library {
11051 name: "server_configurable_flags",
11052 srcs: ["server_configurable_flags.cc"],
11053 }
11054 `)
11055
11056 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11057 s := mod.Rule("apexRule").Args["copy_commands"]
11058 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11059 if len(copyCmds) != 9 {
11060 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11061 }
11062
11063 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11064
11065 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11066 s = " " + combineAconfigRule.Args["cache_files"]
11067 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11068 if len(aconfigArgs) != 3 {
11069 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11070 }
11071 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11072 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11073 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11074
11075 buildParams := combineAconfigRule.BuildParams
11076 if len(buildParams.Inputs) != 3 {
11077 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11078 }
11079 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11080 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11081 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11082 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11083}
11084
11085func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11086 ctx := testApex(t, apex_default_bp+`
11087 apex {
11088 name: "myapex",
11089 manifest: ":myapex.manifest",
11090 androidManifest: ":myapex.androidmanifest",
11091 key: "myapex.key",
11092 java_libs: [
11093 "my_java_library_foo",
11094 "other_java_library_bar",
11095 ],
11096 updatable: false,
11097 }
11098
11099 java_library {
11100 name: "my_java_library_foo",
11101 srcs: ["foo/bar/MyClass.java"],
11102 sdk_version: "none",
11103 system_modules: "none",
11104 static_libs: ["my_java_aconfig_library_foo"],
11105 // TODO: remove //apex_available:platform
11106 apex_available: [
11107 "//apex_available:platform",
11108 "myapex",
11109 ],
11110 }
11111
11112 java_library {
11113 name: "other_java_library_bar",
11114 srcs: ["foo/bar/MyClass.java"],
11115 sdk_version: "none",
11116 system_modules: "none",
11117 static_libs: ["other_java_aconfig_library_bar"],
11118 // TODO: remove //apex_available:platform
11119 apex_available: [
11120 "//apex_available:platform",
11121 "myapex",
11122 ],
11123 }
11124
11125 aconfig_declarations {
11126 name: "my_aconfig_declarations_foo",
11127 package: "com.example.package",
11128 container: "myapex",
11129 srcs: ["foo.aconfig"],
11130 }
11131
11132 java_aconfig_library {
11133 name: "my_java_aconfig_library_foo",
11134 aconfig_declarations: "my_aconfig_declarations_foo",
11135 // TODO: remove //apex_available:platform
11136 apex_available: [
11137 "//apex_available:platform",
11138 "myapex",
11139 ],
11140 }
11141
11142 aconfig_declarations {
11143 name: "other_aconfig_declarations_bar",
11144 package: "com.example.package",
11145 container: "otherapex",
11146 srcs: ["bar.aconfig"],
11147 }
11148
11149 java_aconfig_library {
11150 name: "other_java_aconfig_library_bar",
11151 aconfig_declarations: "other_aconfig_declarations_bar",
11152 // TODO: remove //apex_available:platform
11153 apex_available: [
11154 "//apex_available:platform",
11155 "myapex",
11156 ],
11157 }
11158 `)
11159
11160 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11161 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11162 s := " " + combineAconfigRule.Args["cache_files"]
11163 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11164 if len(aconfigArgs) != 1 {
11165 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11166 }
11167 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11168
11169 buildParams := combineAconfigRule.BuildParams
11170 if len(buildParams.Inputs) != 1 {
11171 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11172 }
11173 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11174 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11175}
11176
11177func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11178 ctx := testApex(t, apex_default_bp+`
11179 apex {
11180 name: "myapex",
11181 manifest: ":myapex.manifest",
11182 androidManifest: ":myapex.androidmanifest",
11183 key: "myapex.key",
11184 java_libs: [
11185 "my_java_library_foo",
11186 "my_java_library_bar",
11187 ],
11188 updatable: false,
11189 }
11190
11191 java_library {
11192 name: "my_java_library_foo",
11193 srcs: ["foo/bar/MyClass.java"],
11194 sdk_version: "none",
11195 system_modules: "none",
11196 static_libs: ["my_java_aconfig_library_foo"],
11197 // TODO: remove //apex_available:platform
11198 apex_available: [
11199 "//apex_available:platform",
11200 "myapex",
11201 ],
11202 }
11203
11204 java_library {
11205 name: "my_java_library_bar",
11206 srcs: ["foo/bar/MyClass.java"],
11207 sdk_version: "none",
11208 system_modules: "none",
11209 static_libs: ["my_java_aconfig_library_bar"],
11210 // TODO: remove //apex_available:platform
11211 apex_available: [
11212 "//apex_available:platform",
11213 "myapex",
11214 ],
11215 }
11216
11217 aconfig_declarations {
11218 name: "my_aconfig_declarations_foo",
11219 package: "com.example.package",
11220 container: "myapex",
11221 srcs: ["foo.aconfig"],
11222 }
11223
11224 java_aconfig_library {
11225 name: "my_java_aconfig_library_foo",
11226 aconfig_declarations: "my_aconfig_declarations_foo",
11227 // TODO: remove //apex_available:platform
11228 apex_available: [
11229 "//apex_available:platform",
11230 "myapex",
11231 ],
11232 }
11233
11234 java_aconfig_library {
11235 name: "my_java_aconfig_library_bar",
11236 aconfig_declarations: "my_aconfig_declarations_foo",
11237 // TODO: remove //apex_available:platform
11238 apex_available: [
11239 "//apex_available:platform",
11240 "myapex",
11241 ],
11242 }
11243 `)
11244
11245 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11246 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11247 s := " " + combineAconfigRule.Args["cache_files"]
11248 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11249 if len(aconfigArgs) != 1 {
11250 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11251 }
11252 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11253
11254 buildParams := combineAconfigRule.BuildParams
11255 if len(buildParams.Inputs) != 1 {
11256 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11257 }
11258 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11259 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11260}