blob: f14ab8a673ce1cdfd62546ac109855ac8e5949f5 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Kiyoung Kim487689e2022-07-26 09:48:22 +090029 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090030 "github.com/google/blueprint/proptools"
31
32 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080033 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090034 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000035 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070036 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070037 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090038 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090039 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070040 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090041)
42
Jooyung Hand3639552019-08-09 12:57:43 +090043// names returns name list from white space separated string
44func names(s string) (ns []string) {
45 for _, n := range strings.Split(s, " ") {
46 if len(n) > 0 {
47 ns = append(ns, n)
48 }
49 }
50 return
51}
52
Paul Duffin40b62572021-03-20 11:39:01 +000053func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090054 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010055 android.GroupFixturePreparers(
56 prepareForApexTest,
57 android.GroupFixturePreparers(preparers...),
58 ).
Paul Duffine05480a2021-03-08 15:07:14 +000059 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000060 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090061}
62
Paul Duffin40b62572021-03-20 11:39:01 +000063func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090064 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010065
66 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000067 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010068 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000069 }
Paul Duffin284165a2021-03-29 01:50:31 +010070
71 result := android.GroupFixturePreparers(
72 prepareForApexTest,
73 android.GroupFixturePreparers(preparers...),
74 optionalBpPreparer,
75 ).RunTest(t)
76
Paul Duffine05480a2021-03-08 15:07:14 +000077 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090078}
79
Paul Duffin810f33d2021-03-09 14:12:32 +000080func withFiles(files android.MockFS) android.FixturePreparer {
81 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090082}
83
Paul Duffin810f33d2021-03-09 14:12:32 +000084func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
85 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090086 for k, v := range targets {
87 config.Targets[k] = v
88 }
Paul Duffin810f33d2021-03-09 14:12:32 +000089 })
Jooyung Han344d5432019-08-23 11:17:39 +090090}
91
Jooyung Han35155c42020-02-06 17:33:20 +090092// withNativeBridgeTargets sets configuration with targets including:
93// - X86_64 (primary)
94// - X86 (secondary)
95// - Arm64 on X86_64 (native bridge)
96// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000097var withNativeBridgeEnabled = android.FixtureModifyConfig(
98 func(config android.Config) {
99 config.Targets[android.Android] = []android.Target{
100 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
101 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
102 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
103 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
104 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
105 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
106 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
107 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
108 }
109 },
110)
111
112func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
113 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
114 variables.ManifestPackageNameOverrides = specs
115 })
Jooyung Han35155c42020-02-06 17:33:20 +0900116}
117
Albert Martineefabcf2022-03-21 20:11:16 +0000118func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
119 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
120 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
121 })
122}
123
Paul Duffin810f33d2021-03-09 14:12:32 +0000124var withBinder32bit = android.FixtureModifyProductVariables(
125 func(variables android.FixtureProductVariables) {
126 variables.Binder32bit = proptools.BoolPtr(true)
127 },
128)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900129
Paul Duffin810f33d2021-03-09 14:12:32 +0000130var withUnbundledBuild = android.FixtureModifyProductVariables(
131 func(variables android.FixtureProductVariables) {
132 variables.Unbundled_build = proptools.BoolPtr(true)
133 },
134)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900135
Paul Duffin284165a2021-03-29 01:50:31 +0100136// Legacy preparer used for running tests within the apex package.
137//
138// This includes everything that was needed to run any test in the apex package prior to the
139// introduction of the test fixtures. Tests that are being converted to use fixtures directly
140// rather than through the testApex...() methods should avoid using this and instead use the
141// various preparers directly, using android.GroupFixturePreparers(...) to group them when
142// necessary.
143//
144// deprecated
145var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000146 // General preparers in alphabetical order as test infrastructure will enforce correct
147 // registration order.
148 android.PrepareForTestWithAndroidBuildComponents,
149 bpf.PrepareForTestWithBpf,
150 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100151 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000152 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
153 rust.PrepareForTestWithRustDefaultModules,
154 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800155 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000156
157 PrepareForTestWithApexBuildComponents,
158
159 // Additional apex test specific preparers.
160 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
161 filegroup {
162 name: "myapex-file_contexts",
163 srcs: [
164 "apex/myapex-file_contexts",
165 ],
166 }
167 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000168 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000169 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000170 "a.java": nil,
171 "PrebuiltAppFoo.apk": nil,
172 "PrebuiltAppFooPriv.apk": nil,
173 "apex_manifest.json": nil,
174 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000175 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
176 "system/sepolicy/apex/myapex2-file_contexts": nil,
177 "system/sepolicy/apex/otherapex-file_contexts": nil,
178 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700180 "mylib.cpp": nil,
181 "mytest.cpp": nil,
182 "mytest1.cpp": nil,
183 "mytest2.cpp": nil,
184 "mytest3.cpp": nil,
185 "myprebuilt": nil,
186 "my_include": nil,
187 "foo/bar/MyClass.java": nil,
188 "prebuilt.jar": nil,
189 "prebuilt.so": nil,
190 "vendor/foo/devkeys/test.x509.pem": nil,
191 "vendor/foo/devkeys/test.pk8": nil,
192 "testkey.x509.pem": nil,
193 "testkey.pk8": nil,
194 "testkey.override.x509.pem": nil,
195 "testkey.override.pk8": nil,
196 "vendor/foo/devkeys/testkey.avbpubkey": nil,
197 "vendor/foo/devkeys/testkey.pem": nil,
198 "NOTICE": nil,
199 "custom_notice": nil,
200 "custom_notice_for_static_lib": nil,
201 "testkey2.avbpubkey": nil,
202 "testkey2.pem": nil,
203 "myapex-arm64.apex": nil,
204 "myapex-arm.apex": nil,
205 "myapex.apks": nil,
206 "frameworks/base/api/current.txt": nil,
207 "framework/aidl/a.aidl": nil,
208 "dummy.txt": nil,
209 "baz": nil,
210 "bar/baz": nil,
211 "testdata/baz": nil,
212 "AppSet.apks": nil,
213 "foo.rs": nil,
214 "libfoo.jar": nil,
215 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000216 },
217 ),
218
219 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
220 variables.DeviceVndkVersion = proptools.StringPtr("current")
221 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
222 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
223 variables.Platform_sdk_codename = proptools.StringPtr("Q")
224 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000225 // "Tiramisu" needs to be in the next line for compatibility with soong code,
226 // not because of these tests specifically (it's not used by the tests)
227 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900228 variables.Platform_vndk_version = proptools.StringPtr("29")
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000229 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000230 }),
231)
232
Paul Duffin52bfaa42021-03-23 23:40:12 +0000233var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
234 "system/sepolicy/apex/myapex-file_contexts": nil,
235})
236
Jooyung Han643adc42020-02-27 13:50:06 +0900237// ensure that 'result' equals 'expected'
238func ensureEquals(t *testing.T, result string, expected string) {
239 t.Helper()
240 if result != expected {
241 t.Errorf("%q != %q", expected, result)
242 }
243}
244
Jiyong Park25fc6a92018-11-18 18:02:45 +0900245// ensure that 'result' contains 'expected'
246func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900247 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900248 if !strings.Contains(result, expected) {
249 t.Errorf("%q is not found in %q", expected, result)
250 }
251}
252
Liz Kammer5bd365f2020-05-27 15:15:11 -0700253// ensure that 'result' contains 'expected' exactly one time
254func ensureContainsOnce(t *testing.T, result string, expected string) {
255 t.Helper()
256 count := strings.Count(result, expected)
257 if count != 1 {
258 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
259 }
260}
261
Jiyong Park25fc6a92018-11-18 18:02:45 +0900262// ensures that 'result' does not contain 'notExpected'
263func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900264 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265 if strings.Contains(result, notExpected) {
266 t.Errorf("%q is found in %q", notExpected, result)
267 }
268}
269
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700270func ensureMatches(t *testing.T, result string, expectedRex string) {
271 ok, err := regexp.MatchString(expectedRex, result)
272 if err != nil {
273 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
274 return
275 }
276 if !ok {
277 t.Errorf("%s does not match regular expession %s", result, expectedRex)
278 }
279}
280
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900282 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283 if !android.InList(expected, result) {
284 t.Errorf("%q is not found in %v", expected, result)
285 }
286}
287
288func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if android.InList(notExpected, result) {
291 t.Errorf("%q is found in %v", notExpected, result)
292 }
293}
294
Jooyung Hane1633032019-08-01 17:41:43 +0900295func ensureListEmpty(t *testing.T, result []string) {
296 t.Helper()
297 if len(result) > 0 {
298 t.Errorf("%q is expected to be empty", result)
299 }
300}
301
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000302func ensureListNotEmpty(t *testing.T, result []string) {
303 t.Helper()
304 if len(result) == 0 {
305 t.Errorf("%q is expected to be not empty", result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// Minimal test
310func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800311 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900312 apex_defaults {
313 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900314 manifest: ":myapex.manifest",
315 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900316 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900317 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900318 native_shared_libs: [
319 "mylib",
320 "libfoo.ffi",
321 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900322 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800323 multilib: {
324 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900325 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800326 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900327 },
Jiyong Park77acec62020-06-01 21:39:15 +0900328 java_libs: [
329 "myjar",
330 "myjar_dex",
331 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000332 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900333 }
334
Jiyong Park30ca9372019-02-07 16:27:23 +0900335 apex {
336 name: "myapex",
337 defaults: ["myapex-defaults"],
338 }
339
Jiyong Park25fc6a92018-11-18 18:02:45 +0900340 apex_key {
341 name: "myapex.key",
342 public_key: "testkey.avbpubkey",
343 private_key: "testkey.pem",
344 }
345
Jiyong Park809bb722019-02-13 21:33:49 +0900346 filegroup {
347 name: "myapex.manifest",
348 srcs: ["apex_manifest.json"],
349 }
350
351 filegroup {
352 name: "myapex.androidmanifest",
353 srcs: ["AndroidManifest.xml"],
354 }
355
Jiyong Park25fc6a92018-11-18 18:02:45 +0900356 cc_library {
357 name: "mylib",
358 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900359 shared_libs: [
360 "mylib2",
361 "libbar.ffi",
362 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900363 system_shared_libs: [],
364 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000365 // TODO: remove //apex_available:platform
366 apex_available: [
367 "//apex_available:platform",
368 "myapex",
369 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900370 }
371
Alex Light3d673592019-01-18 14:37:31 -0800372 cc_binary {
373 name: "foo",
374 srcs: ["mylib.cpp"],
375 compile_multilib: "both",
376 multilib: {
377 lib32: {
378 suffix: "32",
379 },
380 lib64: {
381 suffix: "64",
382 },
383 },
384 symlinks: ["foo_link_"],
385 symlink_preferred_arch: true,
386 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800387 stl: "none",
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 apex_available: [ "myapex", "com.android.gki.*" ],
389 }
390
Jiyong Park99644e92020-11-17 22:21:02 +0900391 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000392 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900393 srcs: ["foo.rs"],
394 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400395 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900396 apex_available: ["myapex"],
397 }
398
399 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000400 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900401 srcs: ["foo.rs"],
402 crate_name: "foo",
403 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900404 shared_libs: ["libfoo.shared_from_rust"],
405 }
406
407 cc_library_shared {
408 name: "libfoo.shared_from_rust",
409 srcs: ["mylib.cpp"],
410 system_shared_libs: [],
411 stl: "none",
412 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900413 }
414
415 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000416 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900417 srcs: ["foo.rs"],
418 crate_name: "foo",
419 apex_available: ["myapex"],
420 }
421
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900422 rust_ffi_shared {
423 name: "libfoo.ffi",
424 srcs: ["foo.rs"],
425 crate_name: "foo",
426 apex_available: ["myapex"],
427 }
428
429 rust_ffi_shared {
430 name: "libbar.ffi",
431 srcs: ["foo.rs"],
432 crate_name: "bar",
433 apex_available: ["myapex"],
434 }
435
Yifan Hongd22a84a2020-07-28 17:37:46 -0700436 apex {
437 name: "com.android.gki.fake",
438 binaries: ["foo"],
439 key: "myapex.key",
440 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000441 updatable: false,
Alex Light3d673592019-01-18 14:37:31 -0800442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
465 }
466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900559
560 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800561 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
562 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900563 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900565 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
567 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 // .. but not for java libs
570 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800572
Colin Cross7113d202019-11-20 16:39:12 -0800573 // Ensure that the platform variant ends with _shared or _common
574 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
575 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900576 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
577 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
579
580 // Ensure that dynamic dependency to java libs are not included
581 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800582
583 // Ensure that all symlinks are present.
584 found_foo_link_64 := false
585 found_foo := false
586 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900587 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800588 if strings.HasSuffix(cmd, "bin/foo") {
589 found_foo = true
590 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
591 found_foo_link_64 = true
592 }
593 }
594 }
595 good := found_foo && found_foo_link_64
596 if !good {
597 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
598 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900599
Colin Crossf61d03d2023-11-02 16:56:39 -0700600 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
601 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
604 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
605 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100606
Colin Crossf61d03d2023-11-02 16:56:39 -0700607 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
608 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100609 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100610 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
611 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
612 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800613}
614
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800616 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 apex_defaults {
618 name: "myapex-defaults",
619 key: "myapex.key",
620 prebuilts: ["myetc"],
621 native_shared_libs: ["mylib"],
622 java_libs: ["myjar"],
623 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900624 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800625 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000626 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900627 }
628
629 prebuilt_etc {
630 name: "myetc",
631 src: "myprebuilt",
632 }
633
634 apex {
635 name: "myapex",
636 defaults: ["myapex-defaults"],
637 }
638
639 apex_key {
640 name: "myapex.key",
641 public_key: "testkey.avbpubkey",
642 private_key: "testkey.pem",
643 }
644
645 cc_library {
646 name: "mylib",
647 system_shared_libs: [],
648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000649 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900650 }
651
652 java_library {
653 name: "myjar",
654 srcs: ["foo/bar/MyClass.java"],
655 sdk_version: "none",
656 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000657 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900658 }
659
660 android_app {
661 name: "AppFoo",
662 srcs: ["foo/bar/MyClass.java"],
663 sdk_version: "none",
664 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000665 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900666 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900667
668 runtime_resource_overlay {
669 name: "rro",
670 theme: "blue",
671 }
672
markchien2f59ec92020-09-02 16:23:38 +0800673 bpf {
674 name: "bpf",
675 srcs: ["bpf.c", "bpf2.c"],
676 }
677
Ken Chenfad7f9d2021-11-10 22:02:57 +0800678 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800679 name: "netdTest",
680 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800681 sub_dir: "netd",
682 }
683
Jooyung Hanf21c7972019-12-16 22:32:06 +0900684 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900685 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900686 "etc/myetc",
687 "javalib/myjar.jar",
688 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000689 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900690 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800691 "etc/bpf/bpf.o",
692 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800693 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900694 })
695}
696
Jooyung Han01a3ee22019-11-02 02:52:25 +0900697func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800698 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900699 apex {
700 name: "myapex",
701 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000702 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900703 }
704
705 apex_key {
706 name: "myapex.key",
707 public_key: "testkey.avbpubkey",
708 private_key: "testkey.pem",
709 }
710 `)
711
Jooyung Hana0503a52023-08-23 13:12:50 +0900712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900713 args := module.Rule("apexRule").Args
714 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
715 t.Error("manifest should be apex_manifest.pb, but " + manifest)
716 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900717}
718
Liz Kammer4854a7d2021-05-27 14:28:27 -0400719func TestApexManifestMinSdkVersion(t *testing.T) {
720 ctx := testApex(t, `
721 apex_defaults {
722 name: "my_defaults",
723 key: "myapex.key",
724 product_specific: true,
725 file_contexts: ":my-file-contexts",
726 updatable: false,
727 }
728 apex {
729 name: "myapex_30",
730 min_sdk_version: "30",
731 defaults: ["my_defaults"],
732 }
733
734 apex {
735 name: "myapex_current",
736 min_sdk_version: "current",
737 defaults: ["my_defaults"],
738 }
739
740 apex {
741 name: "myapex_none",
742 defaults: ["my_defaults"],
743 }
744
745 apex_key {
746 name: "myapex.key",
747 public_key: "testkey.avbpubkey",
748 private_key: "testkey.pem",
749 }
750
751 filegroup {
752 name: "my-file-contexts",
753 srcs: ["product_specific_file_contexts"],
754 }
755 `, withFiles(map[string][]byte{
756 "product_specific_file_contexts": nil,
757 }), android.FixtureModifyProductVariables(
758 func(variables android.FixtureProductVariables) {
759 variables.Unbundled_build = proptools.BoolPtr(true)
760 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
761 }), android.FixtureMergeEnv(map[string]string{
762 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
763 }))
764
765 testCases := []struct {
766 module string
767 minSdkVersion string
768 }{
769 {
770 module: "myapex_30",
771 minSdkVersion: "30",
772 },
773 {
774 module: "myapex_current",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 {
778 module: "myapex_none",
779 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
780 },
781 }
782 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900783 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400784 args := module.Rule("apexRule").Args
785 optFlags := args["opt_flags"]
786 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
787 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
788 }
789 }
790}
791
Jooyung Hanaf730952023-02-28 14:13:38 +0900792func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900793 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900794 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900795 if vendor {
796 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900797 }
798 ctx := testApex(t, `
799 apex {
800 name: "myapex",
801 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900802 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900803 `+prop+`
804 }
805
806 apex_key {
807 name: "myapex.key",
808 public_key: "testkey.avbpubkey",
809 private_key: "testkey.pem",
810 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900811 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900812
Jooyung Hana0503a52023-08-23 13:12:50 +0900813 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900814 if vendor {
815 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
816 rule.RuleParams.Command,
817 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900818 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900819 android.AssertStringDoesContain(t, "should force-label as system_file",
820 rule.RuleParams.Command,
821 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900822 }
823 }
824}
825
Jiyong Park25fc6a92018-11-18 18:02:45 +0900826func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800827 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900828 apex {
829 name: "myapex",
830 key: "myapex.key",
831 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900832 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000833 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900834 }
835
836 apex_key {
837 name: "myapex.key",
838 public_key: "testkey.avbpubkey",
839 private_key: "testkey.pem",
840 }
841
842 cc_library {
843 name: "mylib",
844 srcs: ["mylib.cpp"],
845 shared_libs: ["mylib2", "mylib3"],
846 system_shared_libs: [],
847 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000848 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900849 }
850
851 cc_library {
852 name: "mylib2",
853 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900854 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900855 system_shared_libs: [],
856 stl: "none",
857 stubs: {
858 versions: ["1", "2", "3"],
859 },
860 }
861
862 cc_library {
863 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900864 srcs: ["mylib.cpp"],
865 shared_libs: ["mylib4"],
866 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900867 stl: "none",
868 stubs: {
869 versions: ["10", "11", "12"],
870 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000871 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900872 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900873
874 cc_library {
875 name: "mylib4",
876 srcs: ["mylib.cpp"],
877 system_shared_libs: [],
878 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000879 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900880 }
Jiyong Park105dc322021-06-11 17:22:09 +0900881
882 rust_binary {
883 name: "foo.rust",
884 srcs: ["foo.rs"],
885 shared_libs: ["libfoo.shared_from_rust"],
886 prefer_rlib: true,
887 apex_available: ["myapex"],
888 }
889
890 cc_library_shared {
891 name: "libfoo.shared_from_rust",
892 srcs: ["mylib.cpp"],
893 system_shared_libs: [],
894 stl: "none",
895 stubs: {
896 versions: ["10", "11", "12"],
897 },
898 }
899
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900 `)
901
Jooyung Hana0503a52023-08-23 13:12:50 +0900902 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 copyCmds := apexRule.Args["copy_commands"]
904
905 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800906 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907
908 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800909 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900910
911 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800912 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913
Colin Crossaede88c2020-08-11 12:17:01 -0700914 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915
916 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +0900917 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +0900919 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900920
921 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
Colin Crossaede88c2020-08-11 12:17:01 -0700922 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -0700924 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +0900925
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700926 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
927 // is replaced by sharing of "cFlags" in cc/builder.go.
928 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
929 // module variable representing "cflags". So it was not detected by ensureNotContains.
930 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
931 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
932 // including the original cflags's "-include mylib.h".
933 //
Jiyong Park64379952018-12-13 18:37:29 +0900934 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -0700935 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
936 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +0900937
Jiyong Park85cc35a2022-07-17 11:30:47 +0900938 // Ensure that genstub for platform-provided lib is invoked with --systemapi
939 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
940 // Ensure that genstub for apex-provided lib is invoked with --apex
941 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +0900942
Jooyung Hana0503a52023-08-23 13:12:50 +0900943 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +0900944 "lib64/mylib.so",
945 "lib64/mylib3.so",
946 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +0900947 "bin/foo.rust",
948 "lib64/libc++.so", // by the implicit dependency from foo.rust
949 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +0900950 })
Jiyong Park105dc322021-06-11 17:22:09 +0900951
952 // Ensure that stub dependency from a rust module is not included
953 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
954 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -0700955 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +0900956 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
957 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +0900958
Jooyung Hana0503a52023-08-23 13:12:50 +0900959 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +0900960 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961}
962
Jiyong Park1bc84122021-06-22 20:23:05 +0900963func TestApexCanUsePrivateApis(t *testing.T) {
964 ctx := testApex(t, `
965 apex {
966 name: "myapex",
967 key: "myapex.key",
968 native_shared_libs: ["mylib"],
969 binaries: ["foo.rust"],
970 updatable: false,
971 platform_apis: true,
972 }
973
974 apex_key {
975 name: "myapex.key",
976 public_key: "testkey.avbpubkey",
977 private_key: "testkey.pem",
978 }
979
980 cc_library {
981 name: "mylib",
982 srcs: ["mylib.cpp"],
983 shared_libs: ["mylib2"],
984 system_shared_libs: [],
985 stl: "none",
986 apex_available: [ "myapex" ],
987 }
988
989 cc_library {
990 name: "mylib2",
991 srcs: ["mylib.cpp"],
992 cflags: ["-include mylib.h"],
993 system_shared_libs: [],
994 stl: "none",
995 stubs: {
996 versions: ["1", "2", "3"],
997 },
998 }
999
1000 rust_binary {
1001 name: "foo.rust",
1002 srcs: ["foo.rs"],
1003 shared_libs: ["libfoo.shared_from_rust"],
1004 prefer_rlib: true,
1005 apex_available: ["myapex"],
1006 }
1007
1008 cc_library_shared {
1009 name: "libfoo.shared_from_rust",
1010 srcs: ["mylib.cpp"],
1011 system_shared_libs: [],
1012 stl: "none",
1013 stubs: {
1014 versions: ["10", "11", "12"],
1015 },
1016 }
1017 `)
1018
Jooyung Hana0503a52023-08-23 13:12:50 +09001019 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001020 copyCmds := apexRule.Args["copy_commands"]
1021
1022 // Ensure that indirect stubs dep is not included
1023 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1024 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1025
1026 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1027 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001028 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001029 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1030 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001031 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001032 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1033 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1034}
1035
Colin Cross7812fd32020-09-25 12:35:10 -07001036func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1037 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001038 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001039 apex {
1040 name: "myapex",
1041 key: "myapex.key",
1042 native_shared_libs: ["mylib", "mylib3"],
1043 min_sdk_version: "29",
1044 }
1045
1046 apex_key {
1047 name: "myapex.key",
1048 public_key: "testkey.avbpubkey",
1049 private_key: "testkey.pem",
1050 }
1051
1052 cc_library {
1053 name: "mylib",
1054 srcs: ["mylib.cpp"],
1055 shared_libs: ["mylib2", "mylib3"],
1056 system_shared_libs: [],
1057 stl: "none",
1058 apex_available: [ "myapex" ],
1059 min_sdk_version: "28",
1060 }
1061
1062 cc_library {
1063 name: "mylib2",
1064 srcs: ["mylib.cpp"],
1065 cflags: ["-include mylib.h"],
1066 system_shared_libs: [],
1067 stl: "none",
1068 stubs: {
1069 versions: ["28", "29", "30", "current"],
1070 },
1071 min_sdk_version: "28",
1072 }
1073
1074 cc_library {
1075 name: "mylib3",
1076 srcs: ["mylib.cpp"],
1077 shared_libs: ["mylib4"],
1078 system_shared_libs: [],
1079 stl: "none",
1080 stubs: {
1081 versions: ["28", "29", "30", "current"],
1082 },
1083 apex_available: [ "myapex" ],
1084 min_sdk_version: "28",
1085 }
1086
1087 cc_library {
1088 name: "mylib4",
1089 srcs: ["mylib.cpp"],
1090 system_shared_libs: [],
1091 stl: "none",
1092 apex_available: [ "myapex" ],
1093 min_sdk_version: "28",
1094 }
1095 `)
1096
Jooyung Hana0503a52023-08-23 13:12:50 +09001097 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001098 copyCmds := apexRule.Args["copy_commands"]
1099
1100 // Ensure that direct non-stubs dep is always included
1101 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1102
1103 // Ensure that indirect stubs dep is not included
1104 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1105
1106 // Ensure that direct stubs dep is included
1107 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1108
1109 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1110
Jiyong Park55549df2021-02-26 23:57:23 +09001111 // Ensure that mylib is linking with the latest version of stub for mylib2
1112 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001113 // ... and not linking to the non-stub (impl) variant of mylib2
1114 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1115
1116 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1117 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1118 // .. and not linking to the stubs variant of mylib3
1119 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1120
1121 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001122 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001123 ensureNotContains(t, mylib2Cflags, "-include ")
1124
Jiyong Park85cc35a2022-07-17 11:30:47 +09001125 // Ensure that genstub is invoked with --systemapi
1126 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001127
Jooyung Hana0503a52023-08-23 13:12:50 +09001128 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001129 "lib64/mylib.so",
1130 "lib64/mylib3.so",
1131 "lib64/mylib4.so",
1132 })
1133}
1134
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001135func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1136 t.Parallel()
1137 // myapex (Z)
1138 // mylib -----------------.
1139 // |
1140 // otherapex (29) |
1141 // libstub's versions: 29 Z current
1142 // |
1143 // <platform> |
1144 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001145 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001146 apex {
1147 name: "myapex",
1148 key: "myapex.key",
1149 native_shared_libs: ["mylib"],
1150 min_sdk_version: "Z", // non-final
1151 }
1152
1153 cc_library {
1154 name: "mylib",
1155 srcs: ["mylib.cpp"],
1156 shared_libs: ["libstub"],
1157 apex_available: ["myapex"],
1158 min_sdk_version: "Z",
1159 }
1160
1161 apex_key {
1162 name: "myapex.key",
1163 public_key: "testkey.avbpubkey",
1164 private_key: "testkey.pem",
1165 }
1166
1167 apex {
1168 name: "otherapex",
1169 key: "myapex.key",
1170 native_shared_libs: ["libstub"],
1171 min_sdk_version: "29",
1172 }
1173
1174 cc_library {
1175 name: "libstub",
1176 srcs: ["mylib.cpp"],
1177 stubs: {
1178 versions: ["29", "Z", "current"],
1179 },
1180 apex_available: ["otherapex"],
1181 min_sdk_version: "29",
1182 }
1183
1184 // platform module depending on libstub from otherapex should use the latest stub("current")
1185 cc_library {
1186 name: "libplatform",
1187 srcs: ["mylib.cpp"],
1188 shared_libs: ["libstub"],
1189 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001190 `,
1191 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1192 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1193 variables.Platform_sdk_final = proptools.BoolPtr(false)
1194 variables.Platform_version_active_codenames = []string{"Z"}
1195 }),
1196 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001197
Jiyong Park55549df2021-02-26 23:57:23 +09001198 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001199 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001200 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001201 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001202 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001203
1204 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1205 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1206 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1207 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1208 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1209}
1210
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001211func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001212 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001213 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001214 name: "myapex2",
1215 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001216 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001217 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001218 }
1219
1220 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001221 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001222 public_key: "testkey.avbpubkey",
1223 private_key: "testkey.pem",
1224 }
1225
1226 cc_library {
1227 name: "mylib",
1228 srcs: ["mylib.cpp"],
1229 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001230 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001231 system_shared_libs: [],
1232 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001233 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001234 }
1235
1236 cc_library {
1237 name: "libfoo",
1238 srcs: ["mylib.cpp"],
1239 shared_libs: ["libbar"],
1240 system_shared_libs: [],
1241 stl: "none",
1242 stubs: {
1243 versions: ["10", "20", "30"],
1244 },
1245 }
1246
1247 cc_library {
1248 name: "libbar",
1249 srcs: ["mylib.cpp"],
1250 system_shared_libs: [],
1251 stl: "none",
1252 }
1253
Jiyong Park678c8812020-02-07 17:25:49 +09001254 cc_library_static {
1255 name: "libbaz",
1256 srcs: ["mylib.cpp"],
1257 system_shared_libs: [],
1258 stl: "none",
1259 apex_available: [ "myapex2" ],
1260 }
1261
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001262 `)
1263
Jooyung Hana0503a52023-08-23 13:12:50 +09001264 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001265 copyCmds := apexRule.Args["copy_commands"]
1266
1267 // Ensure that direct non-stubs dep is always included
1268 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1269
1270 // Ensure that indirect stubs dep is not included
1271 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1272
1273 // Ensure that dependency of stubs is not included
1274 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1275
Colin Crossaede88c2020-08-11 12:17:01 -07001276 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001277
1278 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001279 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001280 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001281 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001282
Jiyong Park3ff16992019-12-27 14:11:47 +09001283 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001284
1285 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1286 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001287
Colin Crossf61d03d2023-11-02 16:56:39 -07001288 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1289 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001290 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001291
Colin Crossf61d03d2023-11-02 16:56:39 -07001292 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1293 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001294 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001295}
1296
Jooyung Hand3639552019-08-09 12:57:43 +09001297func TestApexWithRuntimeLibsDependency(t *testing.T) {
1298 /*
1299 myapex
1300 |
1301 v (runtime_libs)
1302 mylib ------+------> libfoo [provides stub]
1303 |
1304 `------> libbar
1305 */
Colin Cross1c460562021-02-16 17:55:47 -08001306 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001307 apex {
1308 name: "myapex",
1309 key: "myapex.key",
1310 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001311 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001312 }
1313
1314 apex_key {
1315 name: "myapex.key",
1316 public_key: "testkey.avbpubkey",
1317 private_key: "testkey.pem",
1318 }
1319
1320 cc_library {
1321 name: "mylib",
1322 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001323 static_libs: ["libstatic"],
1324 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001325 runtime_libs: ["libfoo", "libbar"],
1326 system_shared_libs: [],
1327 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001328 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001329 }
1330
1331 cc_library {
1332 name: "libfoo",
1333 srcs: ["mylib.cpp"],
1334 system_shared_libs: [],
1335 stl: "none",
1336 stubs: {
1337 versions: ["10", "20", "30"],
1338 },
1339 }
1340
1341 cc_library {
1342 name: "libbar",
1343 srcs: ["mylib.cpp"],
1344 system_shared_libs: [],
1345 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001346 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001347 }
1348
Liz Kammer5f108fa2023-05-11 14:33:17 -04001349 cc_library {
1350 name: "libstatic",
1351 srcs: ["mylib.cpp"],
1352 system_shared_libs: [],
1353 stl: "none",
1354 apex_available: [ "myapex" ],
1355 runtime_libs: ["libstatic_to_runtime"],
1356 }
1357
1358 cc_library {
1359 name: "libshared",
1360 srcs: ["mylib.cpp"],
1361 system_shared_libs: [],
1362 stl: "none",
1363 apex_available: [ "myapex" ],
1364 runtime_libs: ["libshared_to_runtime"],
1365 }
1366
1367 cc_library {
1368 name: "libstatic_to_runtime",
1369 srcs: ["mylib.cpp"],
1370 system_shared_libs: [],
1371 stl: "none",
1372 apex_available: [ "myapex" ],
1373 }
1374
1375 cc_library {
1376 name: "libshared_to_runtime",
1377 srcs: ["mylib.cpp"],
1378 system_shared_libs: [],
1379 stl: "none",
1380 apex_available: [ "myapex" ],
1381 }
Jooyung Hand3639552019-08-09 12:57:43 +09001382 `)
1383
Jooyung Hana0503a52023-08-23 13:12:50 +09001384 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001385 copyCmds := apexRule.Args["copy_commands"]
1386
1387 // Ensure that direct non-stubs dep is always included
1388 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1389
1390 // Ensure that indirect stubs dep is not included
1391 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1392
1393 // Ensure that runtime_libs dep in included
1394 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001395 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1396 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1397
1398 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001399
Jooyung Hana0503a52023-08-23 13:12:50 +09001400 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001401 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1402 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001403}
1404
Paul Duffina02cae32021-03-09 01:44:06 +00001405var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1406 cc.PrepareForTestWithCcBuildComponents,
1407 PrepareForTestWithApexBuildComponents,
1408 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001409 apex {
1410 name: "com.android.runtime",
1411 key: "com.android.runtime.key",
1412 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001413 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001414 }
1415
1416 apex_key {
1417 name: "com.android.runtime.key",
1418 public_key: "testkey.avbpubkey",
1419 private_key: "testkey.pem",
1420 }
Paul Duffina02cae32021-03-09 01:44:06 +00001421 `),
1422 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1423)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001424
Paul Duffina02cae32021-03-09 01:44:06 +00001425func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001426 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001427 cc_library {
1428 name: "libc",
1429 no_libcrt: true,
1430 nocrt: true,
1431 stl: "none",
1432 system_shared_libs: [],
1433 stubs: { versions: ["1"] },
1434 apex_available: ["com.android.runtime"],
1435
1436 sanitize: {
1437 hwaddress: true,
1438 }
1439 }
1440
1441 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001442 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001443 no_libcrt: true,
1444 nocrt: true,
1445 stl: "none",
1446 system_shared_libs: [],
1447 srcs: [""],
1448 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001449 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001450
1451 sanitize: {
1452 never: true,
1453 },
Spandan Das4de7b492023-05-05 21:13:01 +00001454 apex_available: [
1455 "//apex_available:anyapex",
1456 "//apex_available:platform",
1457 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001458 } `)
1459 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001460
Jooyung Hana0503a52023-08-23 13:12:50 +09001461 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001462 "lib64/bionic/libc.so",
1463 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1464 })
1465
Colin Cross4c4c1be2022-02-10 11:41:18 -08001466 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001467
1468 installed := hwasan.Description("install libclang_rt.hwasan")
1469 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1470
1471 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1472 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1473 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1474}
1475
1476func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001477 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001478 prepareForTestOfRuntimeApexWithHwasan,
1479 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1480 variables.SanitizeDevice = []string{"hwaddress"}
1481 }),
1482 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001483 cc_library {
1484 name: "libc",
1485 no_libcrt: true,
1486 nocrt: true,
1487 stl: "none",
1488 system_shared_libs: [],
1489 stubs: { versions: ["1"] },
1490 apex_available: ["com.android.runtime"],
1491 }
1492
1493 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001494 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001495 no_libcrt: true,
1496 nocrt: true,
1497 stl: "none",
1498 system_shared_libs: [],
1499 srcs: [""],
1500 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001501 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001502
1503 sanitize: {
1504 never: true,
1505 },
Spandan Das4de7b492023-05-05 21:13:01 +00001506 apex_available: [
1507 "//apex_available:anyapex",
1508 "//apex_available:platform",
1509 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001510 }
Paul Duffina02cae32021-03-09 01:44:06 +00001511 `)
1512 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001513
Jooyung Hana0503a52023-08-23 13:12:50 +09001514 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001515 "lib64/bionic/libc.so",
1516 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1517 })
1518
Colin Cross4c4c1be2022-02-10 11:41:18 -08001519 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001520
1521 installed := hwasan.Description("install libclang_rt.hwasan")
1522 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1523
1524 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1525 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1526 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1527}
1528
Jooyung Han61b66e92020-03-21 14:21:46 +00001529func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1530 testcases := []struct {
1531 name string
1532 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001533 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001534 shouldLink string
1535 shouldNotLink []string
1536 }{
1537 {
Jiyong Park55549df2021-02-26 23:57:23 +09001538 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001539 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001540 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001541 shouldLink: "current",
1542 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001543 },
1544 {
Jiyong Park55549df2021-02-26 23:57:23 +09001545 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001546 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001547 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001548 shouldLink: "current",
1549 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001550 },
1551 }
1552 for _, tc := range testcases {
1553 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001554 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001555 apex {
1556 name: "myapex",
1557 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001558 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001559 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001560 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001561 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001562
Jooyung Han61b66e92020-03-21 14:21:46 +00001563 apex_key {
1564 name: "myapex.key",
1565 public_key: "testkey.avbpubkey",
1566 private_key: "testkey.pem",
1567 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001568
Jooyung Han61b66e92020-03-21 14:21:46 +00001569 cc_library {
1570 name: "mylib",
1571 srcs: ["mylib.cpp"],
1572 vendor_available: true,
1573 shared_libs: ["libbar"],
1574 system_shared_libs: [],
1575 stl: "none",
1576 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001577 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001578 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001579
Jooyung Han61b66e92020-03-21 14:21:46 +00001580 cc_library {
1581 name: "libbar",
1582 srcs: ["mylib.cpp"],
1583 system_shared_libs: [],
1584 stl: "none",
1585 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001586 llndk: {
1587 symbol_file: "libbar.map.txt",
1588 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001589 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001590 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001591 withUnbundledBuild,
1592 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001593
Jooyung Han61b66e92020-03-21 14:21:46 +00001594 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001595 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001596 "lib64/mylib.so",
1597 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001598
Jooyung Han61b66e92020-03-21 14:21:46 +00001599 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001600 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001601 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1602 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001603
Steven Moreland2c4000c2021-04-27 02:08:49 +00001604 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1605 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001606 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001607 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001608 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001609
Steven Moreland2c4000c2021-04-27 02:08:49 +00001610 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001611 ver := tc.shouldLink
1612 if tc.shouldLink == "current" {
1613 ver = strconv.Itoa(android.FutureApiLevelInt)
1614 }
1615 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001616 })
1617 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001618}
1619
Jiyong Park25fc6a92018-11-18 18:02:45 +09001620func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001621 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001622 apex {
1623 name: "myapex",
1624 key: "myapex.key",
1625 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001626 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001627 }
1628
1629 apex_key {
1630 name: "myapex.key",
1631 public_key: "testkey.avbpubkey",
1632 private_key: "testkey.pem",
1633 }
1634
1635 cc_library {
1636 name: "mylib",
1637 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001638 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001639 shared_libs: ["libdl#27"],
1640 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001641 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001642 }
1643
1644 cc_library_shared {
1645 name: "mylib_shared",
1646 srcs: ["mylib.cpp"],
1647 shared_libs: ["libdl#27"],
1648 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001649 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001650 }
1651
1652 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001653 name: "libBootstrap",
1654 srcs: ["mylib.cpp"],
1655 stl: "none",
1656 bootstrap: true,
1657 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001658 `)
1659
Jooyung Hana0503a52023-08-23 13:12:50 +09001660 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001661 copyCmds := apexRule.Args["copy_commands"]
1662
1663 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001664 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001665 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1666 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001667
1668 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001669 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001670
Colin Crossaede88c2020-08-11 12:17:01 -07001671 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1672 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1673 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001674
1675 // For dependency to libc
1676 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001677 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001678 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001679 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001680 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001681 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1682 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001683
1684 // For dependency to libm
1685 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001686 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001687 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001688 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001689 // ... and is not compiling with the stub
1690 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1691 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1692
1693 // For dependency to libdl
1694 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001695 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001696 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001697 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1698 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001699 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001700 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001701 // ... Cflags from stub is correctly exported to mylib
1702 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1703 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001704
1705 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001706 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1707 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1708 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1709 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001710}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001711
Jooyung Han749dc692020-04-15 11:03:39 +09001712func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001713 // there are three links between liba --> libz.
1714 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001715 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001716 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001717 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001718 apex {
1719 name: "myapex",
1720 key: "myapex.key",
1721 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001722 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001723 }
1724
1725 apex {
1726 name: "otherapex",
1727 key: "myapex.key",
1728 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001729 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001730 }
1731
1732 apex_key {
1733 name: "myapex.key",
1734 public_key: "testkey.avbpubkey",
1735 private_key: "testkey.pem",
1736 }
1737
1738 cc_library {
1739 name: "libx",
1740 shared_libs: ["liba"],
1741 system_shared_libs: [],
1742 stl: "none",
1743 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001744 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001745 }
1746
1747 cc_library {
1748 name: "liby",
1749 shared_libs: ["liba"],
1750 system_shared_libs: [],
1751 stl: "none",
1752 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001753 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001754 }
1755
1756 cc_library {
1757 name: "liba",
1758 shared_libs: ["libz"],
1759 system_shared_libs: [],
1760 stl: "none",
1761 apex_available: [
1762 "//apex_available:anyapex",
1763 "//apex_available:platform",
1764 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001765 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001766 }
1767
1768 cc_library {
1769 name: "libz",
1770 system_shared_libs: [],
1771 stl: "none",
1772 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001773 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001774 },
1775 }
Jooyung Han749dc692020-04-15 11:03:39 +09001776 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001777
1778 expectLink := func(from, from_variant, to, to_variant string) {
1779 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1780 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1781 }
1782 expectNoLink := func(from, from_variant, to, to_variant string) {
1783 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1784 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1785 }
1786 // platform liba is linked to non-stub version
1787 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001788 // liba in myapex is linked to current
1789 expectLink("liba", "shared_apex29", "libz", "shared_current")
1790 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001791 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001792 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001793 // liba in otherapex is linked to current
1794 expectLink("liba", "shared_apex30", "libz", "shared_current")
1795 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001796 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1797 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001798}
1799
Jooyung Hanaed150d2020-04-02 01:41:41 +09001800func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001801 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001802 apex {
1803 name: "myapex",
1804 key: "myapex.key",
1805 native_shared_libs: ["libx"],
1806 min_sdk_version: "R",
1807 }
1808
1809 apex_key {
1810 name: "myapex.key",
1811 public_key: "testkey.avbpubkey",
1812 private_key: "testkey.pem",
1813 }
1814
1815 cc_library {
1816 name: "libx",
1817 shared_libs: ["libz"],
1818 system_shared_libs: [],
1819 stl: "none",
1820 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001821 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001822 }
1823
1824 cc_library {
1825 name: "libz",
1826 system_shared_libs: [],
1827 stl: "none",
1828 stubs: {
1829 versions: ["29", "R"],
1830 },
1831 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001832 `,
1833 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1834 variables.Platform_version_active_codenames = []string{"R"}
1835 }),
1836 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001837
1838 expectLink := func(from, from_variant, to, to_variant string) {
1839 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1840 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1841 }
1842 expectNoLink := func(from, from_variant, to, to_variant string) {
1843 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1844 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1845 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001846 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1847 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001848 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1849 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001850}
1851
Jooyung Han4c4da062021-06-23 10:23:16 +09001852func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1853 testApex(t, `
1854 apex {
1855 name: "myapex",
1856 key: "myapex.key",
1857 java_libs: ["libx"],
1858 min_sdk_version: "S",
1859 }
1860
1861 apex_key {
1862 name: "myapex.key",
1863 public_key: "testkey.avbpubkey",
1864 private_key: "testkey.pem",
1865 }
1866
1867 java_library {
1868 name: "libx",
1869 srcs: ["a.java"],
1870 apex_available: [ "myapex" ],
1871 sdk_version: "current",
1872 min_sdk_version: "S", // should be okay
1873 }
1874 `,
1875 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1876 variables.Platform_version_active_codenames = []string{"S"}
1877 variables.Platform_sdk_codename = proptools.StringPtr("S")
1878 }),
1879 )
1880}
1881
Jooyung Han749dc692020-04-15 11:03:39 +09001882func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001883 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001884 apex {
1885 name: "myapex",
1886 key: "myapex.key",
1887 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001888 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09001889 }
1890
1891 apex_key {
1892 name: "myapex.key",
1893 public_key: "testkey.avbpubkey",
1894 private_key: "testkey.pem",
1895 }
1896
1897 cc_library {
1898 name: "libx",
1899 shared_libs: ["libz"],
1900 system_shared_libs: [],
1901 stl: "none",
1902 apex_available: [ "myapex" ],
1903 }
1904
1905 cc_library {
1906 name: "libz",
1907 system_shared_libs: [],
1908 stl: "none",
1909 stubs: {
1910 versions: ["1", "2"],
1911 },
1912 }
1913 `)
1914
1915 expectLink := func(from, from_variant, to, to_variant string) {
1916 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1917 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1918 }
1919 expectNoLink := func(from, from_variant, to, to_variant string) {
1920 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1921 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1922 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001923 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07001924 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001925 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001927}
1928
Jooyung Handfc864c2023-03-20 18:19:07 +09001929func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09001930 ctx := testApex(t, `
1931 apex {
1932 name: "myapex",
1933 key: "myapex.key",
1934 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09001935 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001936 vendor: true,
1937 min_sdk_version: "29",
1938 }
1939
1940 apex_key {
1941 name: "myapex.key",
1942 public_key: "testkey.avbpubkey",
1943 private_key: "testkey.pem",
1944 }
1945
1946 cc_library {
1947 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09001948 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09001949 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09001950 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09001951 shared_libs: ["libbar"],
1952 }
1953
1954 cc_library {
1955 name: "libbar",
1956 stubs: { versions: ["29", "30"] },
1957 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09001958 }
1959 `)
1960
1961 vendorVariant := "android_vendor.29_arm64_armv8-a"
1962
Jooyung Handfc864c2023-03-20 18:19:07 +09001963 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
1964
1965 // Ensure that mylib links with "current" LLNDK
1966 libFlags := names(mylib.Rule("ld").Args["libFlags"])
1967 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
1968
1969 // Ensure that mylib is targeting 29
1970 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
1971 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
1972
1973 // Ensure that the correct variant of crtbegin_so is used.
1974 crtBegin := mylib.Rule("ld").Args["crtBegin"]
1975 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09001976
1977 // Ensure that the crtbegin_so used by the APEX is targeting 29
1978 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
1979 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
1980}
1981
Jooyung Han4495f842023-04-25 16:39:59 +09001982func TestTrackAllowedDeps(t *testing.T) {
1983 ctx := testApex(t, `
1984 apex {
1985 name: "myapex",
1986 key: "myapex.key",
1987 updatable: true,
1988 native_shared_libs: [
1989 "mylib",
1990 "yourlib",
1991 ],
1992 min_sdk_version: "29",
1993 }
1994
1995 apex {
1996 name: "myapex2",
1997 key: "myapex.key",
1998 updatable: false,
1999 native_shared_libs: ["yourlib"],
2000 }
2001
2002 apex_key {
2003 name: "myapex.key",
2004 public_key: "testkey.avbpubkey",
2005 private_key: "testkey.pem",
2006 }
2007
2008 cc_library {
2009 name: "mylib",
2010 srcs: ["mylib.cpp"],
2011 shared_libs: ["libbar"],
2012 min_sdk_version: "29",
2013 apex_available: ["myapex"],
2014 }
2015
2016 cc_library {
2017 name: "libbar",
2018 stubs: { versions: ["29", "30"] },
2019 }
2020
2021 cc_library {
2022 name: "yourlib",
2023 srcs: ["mylib.cpp"],
2024 min_sdk_version: "29",
2025 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2026 }
2027 `, withFiles(android.MockFS{
2028 "packages/modules/common/build/allowed_deps.txt": nil,
2029 }))
2030
2031 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2032 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2033 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002034 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002035 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002036 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002037
Jooyung Hana0503a52023-08-23 13:12:50 +09002038 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002039 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2040 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002041 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2042 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2043 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2044 flatlist, "mylib:(minSdkVersion:29)")
2045 android.AssertStringListContains(t, "track platform-available lib",
2046 flatlist, "yourlib(minSdkVersion:29)")
2047}
2048
2049func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2050 ctx := testApex(t, `
2051 apex {
2052 name: "myapex",
2053 key: "myapex.key",
2054 updatable: true,
2055 min_sdk_version: "29",
2056 }
2057
2058 apex_key {
2059 name: "myapex.key",
2060 public_key: "testkey.avbpubkey",
2061 private_key: "testkey.pem",
2062 }
2063 `)
2064 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2065 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2066 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2067 }
2068}
2069
Jooyung Han03b51852020-02-26 22:45:42 +09002070func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002071 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002072 apex {
2073 name: "myapex",
2074 key: "myapex.key",
2075 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002076 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002077 }
2078
2079 apex_key {
2080 name: "myapex.key",
2081 public_key: "testkey.avbpubkey",
2082 private_key: "testkey.pem",
2083 }
2084
2085 cc_library {
2086 name: "libx",
2087 system_shared_libs: [],
2088 stl: "none",
2089 apex_available: [ "myapex" ],
2090 stubs: {
2091 versions: ["1", "2"],
2092 },
2093 }
2094
2095 cc_library {
2096 name: "libz",
2097 shared_libs: ["libx"],
2098 system_shared_libs: [],
2099 stl: "none",
2100 }
2101 `)
2102
2103 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002104 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002105 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2106 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2107 }
2108 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002109 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002110 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2111 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2112 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002113 expectLink("libz", "shared", "libx", "shared_current")
2114 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002115 expectNoLink("libz", "shared", "libz", "shared_1")
2116 expectNoLink("libz", "shared", "libz", "shared")
2117}
2118
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002119var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2120 func(variables android.FixtureProductVariables) {
2121 variables.SanitizeDevice = []string{"hwaddress"}
2122 },
2123)
2124
Jooyung Han75568392020-03-20 04:29:24 +09002125func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002126 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002127 apex {
2128 name: "myapex",
2129 key: "myapex.key",
2130 native_shared_libs: ["libx"],
2131 min_sdk_version: "29",
2132 }
2133
2134 apex_key {
2135 name: "myapex.key",
2136 public_key: "testkey.avbpubkey",
2137 private_key: "testkey.pem",
2138 }
2139
2140 cc_library {
2141 name: "libx",
2142 shared_libs: ["libbar"],
2143 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002144 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002145 }
2146
2147 cc_library {
2148 name: "libbar",
2149 stubs: {
2150 versions: ["29", "30"],
2151 },
2152 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002153 `,
2154 prepareForTestWithSantitizeHwaddress,
2155 )
Jooyung Han03b51852020-02-26 22:45:42 +09002156 expectLink := func(from, from_variant, to, to_variant string) {
2157 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2158 libFlags := ld.Args["libFlags"]
2159 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2160 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002161 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002162}
2163
Jooyung Han75568392020-03-20 04:29:24 +09002164func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002165 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002166 apex {
2167 name: "myapex",
2168 key: "myapex.key",
2169 native_shared_libs: ["libx"],
2170 min_sdk_version: "29",
2171 }
2172
2173 apex_key {
2174 name: "myapex.key",
2175 public_key: "testkey.avbpubkey",
2176 private_key: "testkey.pem",
2177 }
2178
2179 cc_library {
2180 name: "libx",
2181 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002182 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002183 }
Jooyung Han75568392020-03-20 04:29:24 +09002184 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002185
2186 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002187 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002188 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002189 // note that platform variant is not.
2190 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002191 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002192}
2193
Jooyung Han749dc692020-04-15 11:03:39 +09002194func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2195 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002196 apex {
2197 name: "myapex",
2198 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002199 native_shared_libs: ["mylib"],
2200 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002201 }
2202
2203 apex_key {
2204 name: "myapex.key",
2205 public_key: "testkey.avbpubkey",
2206 private_key: "testkey.pem",
2207 }
Jooyung Han749dc692020-04-15 11:03:39 +09002208
2209 cc_library {
2210 name: "mylib",
2211 srcs: ["mylib.cpp"],
2212 system_shared_libs: [],
2213 stl: "none",
2214 apex_available: [
2215 "myapex",
2216 ],
2217 min_sdk_version: "30",
2218 }
2219 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002220
2221 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2222 apex {
2223 name: "myapex",
2224 key: "myapex.key",
2225 native_shared_libs: ["libfoo.ffi"],
2226 min_sdk_version: "29",
2227 }
2228
2229 apex_key {
2230 name: "myapex.key",
2231 public_key: "testkey.avbpubkey",
2232 private_key: "testkey.pem",
2233 }
2234
2235 rust_ffi_shared {
2236 name: "libfoo.ffi",
2237 srcs: ["foo.rs"],
2238 crate_name: "foo",
2239 apex_available: [
2240 "myapex",
2241 ],
2242 min_sdk_version: "30",
2243 }
2244 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002245
2246 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2247 apex {
2248 name: "myapex",
2249 key: "myapex.key",
2250 java_libs: ["libfoo"],
2251 min_sdk_version: "29",
2252 }
2253
2254 apex_key {
2255 name: "myapex.key",
2256 public_key: "testkey.avbpubkey",
2257 private_key: "testkey.pem",
2258 }
2259
2260 java_import {
2261 name: "libfoo",
2262 jars: ["libfoo.jar"],
2263 apex_available: [
2264 "myapex",
2265 ],
2266 min_sdk_version: "30",
2267 }
2268 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002269
2270 // Skip check for modules compiling against core API surface
2271 testApex(t, `
2272 apex {
2273 name: "myapex",
2274 key: "myapex.key",
2275 java_libs: ["libfoo"],
2276 min_sdk_version: "29",
2277 }
2278
2279 apex_key {
2280 name: "myapex.key",
2281 public_key: "testkey.avbpubkey",
2282 private_key: "testkey.pem",
2283 }
2284
2285 java_library {
2286 name: "libfoo",
2287 srcs: ["Foo.java"],
2288 apex_available: [
2289 "myapex",
2290 ],
2291 // Compile against core API surface
2292 sdk_version: "core_current",
2293 min_sdk_version: "30",
2294 }
2295 `)
2296
Jooyung Han749dc692020-04-15 11:03:39 +09002297}
2298
2299func TestApexMinSdkVersion_Okay(t *testing.T) {
2300 testApex(t, `
2301 apex {
2302 name: "myapex",
2303 key: "myapex.key",
2304 native_shared_libs: ["libfoo"],
2305 java_libs: ["libbar"],
2306 min_sdk_version: "29",
2307 }
2308
2309 apex_key {
2310 name: "myapex.key",
2311 public_key: "testkey.avbpubkey",
2312 private_key: "testkey.pem",
2313 }
2314
2315 cc_library {
2316 name: "libfoo",
2317 srcs: ["mylib.cpp"],
2318 shared_libs: ["libfoo_dep"],
2319 apex_available: ["myapex"],
2320 min_sdk_version: "29",
2321 }
2322
2323 cc_library {
2324 name: "libfoo_dep",
2325 srcs: ["mylib.cpp"],
2326 apex_available: ["myapex"],
2327 min_sdk_version: "29",
2328 }
2329
2330 java_library {
2331 name: "libbar",
2332 sdk_version: "current",
2333 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002334 static_libs: [
2335 "libbar_dep",
2336 "libbar_import_dep",
2337 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002338 apex_available: ["myapex"],
2339 min_sdk_version: "29",
2340 }
2341
2342 java_library {
2343 name: "libbar_dep",
2344 sdk_version: "current",
2345 srcs: ["a.java"],
2346 apex_available: ["myapex"],
2347 min_sdk_version: "29",
2348 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002349
2350 java_import {
2351 name: "libbar_import_dep",
2352 jars: ["libbar.jar"],
2353 apex_available: ["myapex"],
2354 min_sdk_version: "29",
2355 }
Jooyung Han03b51852020-02-26 22:45:42 +09002356 `)
2357}
2358
Colin Cross8ca61c12022-10-06 21:00:14 -07002359func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2360 // Tests that an apex dependency with min_sdk_version higher than the
2361 // min_sdk_version of the apex is allowed as long as the dependency's
2362 // min_sdk_version is less than or equal to the api level that the
2363 // architecture was introduced in. In this case, arm64 didn't exist
2364 // until api level 21, so the arm64 code will never need to run on
2365 // an api level 20 device, even if other architectures of the apex
2366 // will.
2367 testApex(t, `
2368 apex {
2369 name: "myapex",
2370 key: "myapex.key",
2371 native_shared_libs: ["libfoo"],
2372 min_sdk_version: "20",
2373 }
2374
2375 apex_key {
2376 name: "myapex.key",
2377 public_key: "testkey.avbpubkey",
2378 private_key: "testkey.pem",
2379 }
2380
2381 cc_library {
2382 name: "libfoo",
2383 srcs: ["mylib.cpp"],
2384 apex_available: ["myapex"],
2385 min_sdk_version: "21",
2386 stl: "none",
2387 }
2388 `)
2389}
2390
Artur Satayev8cf899a2020-04-15 17:29:42 +01002391func TestJavaStableSdkVersion(t *testing.T) {
2392 testCases := []struct {
2393 name string
2394 expectedError string
2395 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002396 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002397 }{
2398 {
2399 name: "Non-updatable apex with non-stable dep",
2400 bp: `
2401 apex {
2402 name: "myapex",
2403 java_libs: ["myjar"],
2404 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002405 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002406 }
2407 apex_key {
2408 name: "myapex.key",
2409 public_key: "testkey.avbpubkey",
2410 private_key: "testkey.pem",
2411 }
2412 java_library {
2413 name: "myjar",
2414 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002415 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002416 apex_available: ["myapex"],
2417 }
2418 `,
2419 },
2420 {
2421 name: "Updatable apex with stable dep",
2422 bp: `
2423 apex {
2424 name: "myapex",
2425 java_libs: ["myjar"],
2426 key: "myapex.key",
2427 updatable: true,
2428 min_sdk_version: "29",
2429 }
2430 apex_key {
2431 name: "myapex.key",
2432 public_key: "testkey.avbpubkey",
2433 private_key: "testkey.pem",
2434 }
2435 java_library {
2436 name: "myjar",
2437 srcs: ["foo/bar/MyClass.java"],
2438 sdk_version: "current",
2439 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002440 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002441 }
2442 `,
2443 },
2444 {
2445 name: "Updatable apex with non-stable dep",
2446 expectedError: "cannot depend on \"myjar\"",
2447 bp: `
2448 apex {
2449 name: "myapex",
2450 java_libs: ["myjar"],
2451 key: "myapex.key",
2452 updatable: true,
2453 }
2454 apex_key {
2455 name: "myapex.key",
2456 public_key: "testkey.avbpubkey",
2457 private_key: "testkey.pem",
2458 }
2459 java_library {
2460 name: "myjar",
2461 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002462 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002463 apex_available: ["myapex"],
2464 }
2465 `,
2466 },
2467 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002468 name: "Updatable apex with non-stable legacy core platform dep",
2469 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2470 bp: `
2471 apex {
2472 name: "myapex",
2473 java_libs: ["myjar-uses-legacy"],
2474 key: "myapex.key",
2475 updatable: true,
2476 }
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482 java_library {
2483 name: "myjar-uses-legacy",
2484 srcs: ["foo/bar/MyClass.java"],
2485 sdk_version: "core_platform",
2486 apex_available: ["myapex"],
2487 }
2488 `,
2489 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2490 },
2491 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002492 name: "Updatable apex with non-stable transitive dep",
2493 // This is not actually detecting that the transitive dependency is unstable, rather it is
2494 // detecting that the transitive dependency is building against a wider API surface than the
2495 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002496 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002497 bp: `
2498 apex {
2499 name: "myapex",
2500 java_libs: ["myjar"],
2501 key: "myapex.key",
2502 updatable: true,
2503 }
2504 apex_key {
2505 name: "myapex.key",
2506 public_key: "testkey.avbpubkey",
2507 private_key: "testkey.pem",
2508 }
2509 java_library {
2510 name: "myjar",
2511 srcs: ["foo/bar/MyClass.java"],
2512 sdk_version: "current",
2513 apex_available: ["myapex"],
2514 static_libs: ["transitive-jar"],
2515 }
2516 java_library {
2517 name: "transitive-jar",
2518 srcs: ["foo/bar/MyClass.java"],
2519 sdk_version: "core_platform",
2520 apex_available: ["myapex"],
2521 }
2522 `,
2523 },
2524 }
2525
2526 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002527 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2528 continue
2529 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002530 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002531 errorHandler := android.FixtureExpectsNoErrors
2532 if test.expectedError != "" {
2533 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002534 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002535 android.GroupFixturePreparers(
2536 java.PrepareForTestWithJavaDefaultModules,
2537 PrepareForTestWithApexBuildComponents,
2538 prepareForTestWithMyapex,
2539 android.OptionalFixturePreparer(test.preparer),
2540 ).
2541 ExtendWithErrorHandler(errorHandler).
2542 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002543 })
2544 }
2545}
2546
Jooyung Han749dc692020-04-15 11:03:39 +09002547func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2548 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2549 apex {
2550 name: "myapex",
2551 key: "myapex.key",
2552 native_shared_libs: ["mylib"],
2553 min_sdk_version: "29",
2554 }
2555
2556 apex_key {
2557 name: "myapex.key",
2558 public_key: "testkey.avbpubkey",
2559 private_key: "testkey.pem",
2560 }
2561
2562 cc_library {
2563 name: "mylib",
2564 srcs: ["mylib.cpp"],
2565 shared_libs: ["mylib2"],
2566 system_shared_libs: [],
2567 stl: "none",
2568 apex_available: [
2569 "myapex",
2570 ],
2571 min_sdk_version: "29",
2572 }
2573
2574 // indirect part of the apex
2575 cc_library {
2576 name: "mylib2",
2577 srcs: ["mylib.cpp"],
2578 system_shared_libs: [],
2579 stl: "none",
2580 apex_available: [
2581 "myapex",
2582 ],
2583 min_sdk_version: "30",
2584 }
2585 `)
2586}
2587
2588func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2589 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2590 apex {
2591 name: "myapex",
2592 key: "myapex.key",
2593 apps: ["AppFoo"],
2594 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002595 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002596 }
2597
2598 apex_key {
2599 name: "myapex.key",
2600 public_key: "testkey.avbpubkey",
2601 private_key: "testkey.pem",
2602 }
2603
2604 android_app {
2605 name: "AppFoo",
2606 srcs: ["foo/bar/MyClass.java"],
2607 sdk_version: "current",
2608 min_sdk_version: "29",
2609 system_modules: "none",
2610 stl: "none",
2611 static_libs: ["bar"],
2612 apex_available: [ "myapex" ],
2613 }
2614
2615 java_library {
2616 name: "bar",
2617 sdk_version: "current",
2618 srcs: ["a.java"],
2619 apex_available: [ "myapex" ],
2620 }
2621 `)
2622}
2623
2624func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002625 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002626 apex {
2627 name: "myapex",
2628 key: "myapex.key",
2629 native_shared_libs: ["mylib"],
2630 min_sdk_version: "29",
2631 }
2632
2633 apex_key {
2634 name: "myapex.key",
2635 public_key: "testkey.avbpubkey",
2636 private_key: "testkey.pem",
2637 }
2638
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002639 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002640 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2641 cc_library {
2642 name: "mylib",
2643 srcs: ["mylib.cpp"],
2644 shared_libs: ["mylib2"],
2645 system_shared_libs: [],
2646 stl: "none",
2647 apex_available: ["myapex", "otherapex"],
2648 min_sdk_version: "29",
2649 }
2650
2651 cc_library {
2652 name: "mylib2",
2653 srcs: ["mylib.cpp"],
2654 system_shared_libs: [],
2655 stl: "none",
2656 apex_available: ["otherapex"],
2657 stubs: { versions: ["29", "30"] },
2658 min_sdk_version: "30",
2659 }
2660
2661 apex {
2662 name: "otherapex",
2663 key: "myapex.key",
2664 native_shared_libs: ["mylib", "mylib2"],
2665 min_sdk_version: "30",
2666 }
2667 `)
2668 expectLink := func(from, from_variant, to, to_variant string) {
2669 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2670 libFlags := ld.Args["libFlags"]
2671 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2672 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002673 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002674 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002675}
2676
Jooyung Haned124c32021-01-26 11:43:46 +09002677func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002678 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2679 func(variables android.FixtureProductVariables) {
2680 variables.Platform_sdk_codename = proptools.StringPtr("S")
2681 variables.Platform_version_active_codenames = []string{"S"}
2682 },
2683 )
Jooyung Haned124c32021-01-26 11:43:46 +09002684 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2685 apex {
2686 name: "myapex",
2687 key: "myapex.key",
2688 native_shared_libs: ["libfoo"],
2689 min_sdk_version: "S",
2690 }
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696 cc_library {
2697 name: "libfoo",
2698 shared_libs: ["libbar"],
2699 apex_available: ["myapex"],
2700 min_sdk_version: "29",
2701 }
2702 cc_library {
2703 name: "libbar",
2704 apex_available: ["myapex"],
2705 }
2706 `, withSAsActiveCodeNames)
2707}
2708
2709func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002710 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2711 variables.Platform_sdk_codename = proptools.StringPtr("S")
2712 variables.Platform_version_active_codenames = []string{"S", "T"}
2713 })
Colin Cross1c460562021-02-16 17:55:47 -08002714 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002715 apex {
2716 name: "myapex",
2717 key: "myapex.key",
2718 native_shared_libs: ["libfoo"],
2719 min_sdk_version: "S",
2720 }
2721 apex_key {
2722 name: "myapex.key",
2723 public_key: "testkey.avbpubkey",
2724 private_key: "testkey.pem",
2725 }
2726 cc_library {
2727 name: "libfoo",
2728 shared_libs: ["libbar"],
2729 apex_available: ["myapex"],
2730 min_sdk_version: "S",
2731 }
2732 cc_library {
2733 name: "libbar",
2734 stubs: {
2735 symbol_file: "libbar.map.txt",
2736 versions: ["30", "S", "T"],
2737 },
2738 }
2739 `, withSAsActiveCodeNames)
2740
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002741 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002742 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2743 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002744 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002745}
2746
Jiyong Park7c2ee712018-12-07 00:42:25 +09002747func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002748 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002749 apex {
2750 name: "myapex",
2751 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002752 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002753 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002754 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002755 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002756 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002757 }
2758
2759 apex_key {
2760 name: "myapex.key",
2761 public_key: "testkey.avbpubkey",
2762 private_key: "testkey.pem",
2763 }
2764
2765 prebuilt_etc {
2766 name: "myetc",
2767 src: "myprebuilt",
2768 sub_dir: "foo/bar",
2769 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002770
2771 cc_library {
2772 name: "mylib",
2773 srcs: ["mylib.cpp"],
2774 relative_install_path: "foo/bar",
2775 system_shared_libs: [],
2776 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002777 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002778 }
2779
2780 cc_binary {
2781 name: "mybin",
2782 srcs: ["mylib.cpp"],
2783 relative_install_path: "foo/bar",
2784 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002785 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002786 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002787 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002788
2789 rust_binary {
2790 name: "mybin.rust",
2791 srcs: ["foo.rs"],
2792 relative_install_path: "rust_subdir",
2793 apex_available: [ "myapex" ],
2794 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002795 `)
2796
Jooyung Hana0503a52023-08-23 13:12:50 +09002797 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002798 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002799
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002800 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002801 ensureContains(t, cmd, "/etc ")
2802 ensureContains(t, cmd, "/etc/foo ")
2803 ensureContains(t, cmd, "/etc/foo/bar ")
2804 ensureContains(t, cmd, "/lib64 ")
2805 ensureContains(t, cmd, "/lib64/foo ")
2806 ensureContains(t, cmd, "/lib64/foo/bar ")
2807 ensureContains(t, cmd, "/lib ")
2808 ensureContains(t, cmd, "/lib/foo ")
2809 ensureContains(t, cmd, "/lib/foo/bar ")
2810 ensureContains(t, cmd, "/bin ")
2811 ensureContains(t, cmd, "/bin/foo ")
2812 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002813 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002814}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002815
Jooyung Han35155c42020-02-06 17:33:20 +09002816func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002817 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002818 apex {
2819 name: "myapex",
2820 key: "myapex.key",
2821 multilib: {
2822 both: {
2823 native_shared_libs: ["mylib"],
2824 binaries: ["mybin"],
2825 },
2826 },
2827 compile_multilib: "both",
2828 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002829 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002830 }
2831
2832 apex_key {
2833 name: "myapex.key",
2834 public_key: "testkey.avbpubkey",
2835 private_key: "testkey.pem",
2836 }
2837
2838 cc_library {
2839 name: "mylib",
2840 relative_install_path: "foo/bar",
2841 system_shared_libs: [],
2842 stl: "none",
2843 apex_available: [ "myapex" ],
2844 native_bridge_supported: true,
2845 }
2846
2847 cc_binary {
2848 name: "mybin",
2849 relative_install_path: "foo/bar",
2850 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002851 stl: "none",
2852 apex_available: [ "myapex" ],
2853 native_bridge_supported: true,
2854 compile_multilib: "both", // default is "first" for binary
2855 multilib: {
2856 lib64: {
2857 suffix: "64",
2858 },
2859 },
2860 }
2861 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002862 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002863 "bin/foo/bar/mybin",
2864 "bin/foo/bar/mybin64",
2865 "bin/arm/foo/bar/mybin",
2866 "bin/arm64/foo/bar/mybin64",
2867 "lib/foo/bar/mylib.so",
2868 "lib/arm/foo/bar/mylib.so",
2869 "lib64/foo/bar/mylib.so",
2870 "lib64/arm64/foo/bar/mylib.so",
2871 })
2872}
2873
Jooyung Han85d61762020-06-24 23:50:26 +09002874func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08002875 result := android.GroupFixturePreparers(
2876 prepareForApexTest,
2877 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
2878 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09002879 apex {
2880 name: "myapex",
2881 key: "myapex.key",
2882 binaries: ["mybin"],
2883 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002884 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09002885 }
2886 apex_key {
2887 name: "myapex.key",
2888 public_key: "testkey.avbpubkey",
2889 private_key: "testkey.pem",
2890 }
2891 cc_binary {
2892 name: "mybin",
2893 vendor: true,
2894 shared_libs: ["libfoo"],
2895 }
2896 cc_library {
2897 name: "libfoo",
2898 proprietary: true,
2899 }
2900 `)
2901
Jooyung Hana0503a52023-08-23 13:12:50 +09002902 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09002903 "bin/mybin",
2904 "lib64/libfoo.so",
2905 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
2906 "lib64/libc++.so",
2907 })
2908
Jooyung Hana0503a52023-08-23 13:12:50 +09002909 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08002910 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09002911 name := apexBundle.BaseModuleName()
2912 prefix := "TARGET_"
2913 var builder strings.Builder
2914 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08002915 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01002916 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01002917 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002918
Jooyung Hana0503a52023-08-23 13:12:50 +09002919 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09002920 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
2921 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09002922}
2923
Jooyung Hanc5a96762022-02-04 11:54:50 +09002924func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
2925 testApexError(t, `Trying to include a VNDK library`, `
2926 apex {
2927 name: "myapex",
2928 key: "myapex.key",
2929 native_shared_libs: ["libc++"], // libc++ is a VNDK lib
2930 vendor: true,
2931 use_vndk_as_stable: true,
2932 updatable: false,
2933 }
2934 apex_key {
2935 name: "myapex.key",
2936 public_key: "testkey.avbpubkey",
2937 private_key: "testkey.pem",
2938 }`)
2939}
2940
Jooyung Handf78e212020-07-22 15:54:47 +09002941func TestVendorApex_use_vndk_as_stable(t *testing.T) {
Jooyung Han91f92032022-02-04 12:36:33 +09002942 // myapex myapex2
2943 // | |
2944 // mybin ------. mybin2
2945 // \ \ / |
2946 // (stable) .---\--------` |
2947 // \ / \ |
2948 // \ / \ /
2949 // libvndk libvendor
2950 // (vndk)
Colin Cross1c460562021-02-16 17:55:47 -08002951 ctx := testApex(t, `
Jooyung Handf78e212020-07-22 15:54:47 +09002952 apex {
2953 name: "myapex",
2954 key: "myapex.key",
2955 binaries: ["mybin"],
2956 vendor: true,
2957 use_vndk_as_stable: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002958 updatable: false,
Jooyung Handf78e212020-07-22 15:54:47 +09002959 }
2960 apex_key {
2961 name: "myapex.key",
2962 public_key: "testkey.avbpubkey",
2963 private_key: "testkey.pem",
2964 }
2965 cc_binary {
2966 name: "mybin",
2967 vendor: true,
2968 shared_libs: ["libvndk", "libvendor"],
2969 }
2970 cc_library {
2971 name: "libvndk",
2972 vndk: {
2973 enabled: true,
2974 },
2975 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09002976 product_available: true,
Jooyung Handf78e212020-07-22 15:54:47 +09002977 }
2978 cc_library {
2979 name: "libvendor",
2980 vendor: true,
Jooyung Han91f92032022-02-04 12:36:33 +09002981 stl: "none",
2982 }
2983 apex {
2984 name: "myapex2",
2985 key: "myapex.key",
2986 binaries: ["mybin2"],
2987 vendor: true,
2988 use_vndk_as_stable: false,
2989 updatable: false,
2990 }
2991 cc_binary {
2992 name: "mybin2",
2993 vendor: true,
2994 shared_libs: ["libvndk", "libvendor"],
Jooyung Handf78e212020-07-22 15:54:47 +09002995 }
Kiyoung Kim8269cee2023-07-26 12:39:19 +09002996 `,
2997 android.FixtureModifyConfig(func(config android.Config) {
2998 config.TestProductVariables.KeepVndk = proptools.BoolPtr(true)
2999 }),
3000 )
Jooyung Handf78e212020-07-22 15:54:47 +09003001
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003002 vendorVariant := "android_vendor.29_arm64_armv8-a"
Jooyung Handf78e212020-07-22 15:54:47 +09003003
Jooyung Han91f92032022-02-04 12:36:33 +09003004 for _, tc := range []struct {
3005 name string
3006 apexName string
3007 moduleName string
3008 moduleVariant string
3009 libs []string
3010 contents []string
3011 requireVndkNamespace bool
3012 }{
3013 {
3014 name: "use_vndk_as_stable",
3015 apexName: "myapex",
3016 moduleName: "mybin",
3017 moduleVariant: vendorVariant + "_apex10000",
3018 libs: []string{
3019 // should link with vendor variants of VNDK libs(libvndk/libc++)
3020 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
3021 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
3022 // unstable Vendor libs as APEX variant
3023 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3024 },
3025 contents: []string{
3026 "bin/mybin",
3027 "lib64/libvendor.so",
3028 // VNDK libs (libvndk/libc++) are not included
3029 },
3030 requireVndkNamespace: true,
3031 },
3032 {
3033 name: "!use_vndk_as_stable",
3034 apexName: "myapex2",
3035 moduleName: "mybin2",
3036 moduleVariant: vendorVariant + "_myapex2",
3037 libs: []string{
3038 // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
3039 "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
3040 "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
3041 // unstable vendor libs have "merged" APEX variants
3042 "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
3043 },
3044 contents: []string{
3045 "bin/mybin2",
3046 "lib64/libvendor.so",
3047 // VNDK libs are included as well
3048 "lib64/libvndk.so",
3049 "lib64/libc++.so",
3050 },
3051 requireVndkNamespace: false,
3052 },
3053 } {
3054 t.Run(tc.name, func(t *testing.T) {
3055 // Check linked libs
3056 ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
3057 libs := names(ldRule.Args["libFlags"])
3058 for _, lib := range tc.libs {
3059 ensureListContains(t, libs, lib)
3060 }
3061 // Check apex contents
Jooyung Hana0503a52023-08-23 13:12:50 +09003062 ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName, tc.contents)
Jooyung Handf78e212020-07-22 15:54:47 +09003063
Jooyung Han91f92032022-02-04 12:36:33 +09003064 // Check "requireNativeLibs"
Jooyung Hana0503a52023-08-23 13:12:50 +09003065 apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName).Rule("apexManifestRule")
Jooyung Han91f92032022-02-04 12:36:33 +09003066 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3067 if tc.requireVndkNamespace {
3068 ensureListContains(t, requireNativeLibs, ":vndk")
3069 } else {
3070 ensureListNotContains(t, requireNativeLibs, ":vndk")
3071 }
3072 })
3073 }
Jooyung Handf78e212020-07-22 15:54:47 +09003074}
3075
Justin Yun13decfb2021-03-08 19:25:55 +09003076func TestProductVariant(t *testing.T) {
3077 ctx := testApex(t, `
3078 apex {
3079 name: "myapex",
3080 key: "myapex.key",
3081 updatable: false,
3082 product_specific: true,
3083 binaries: ["foo"],
3084 }
3085
3086 apex_key {
3087 name: "myapex.key",
3088 public_key: "testkey.avbpubkey",
3089 private_key: "testkey.pem",
3090 }
3091
3092 cc_binary {
3093 name: "foo",
3094 product_available: true,
3095 apex_available: ["myapex"],
3096 srcs: ["foo.cpp"],
3097 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003098 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003099
3100 cflags := strings.Fields(
Jooyung Han91f92032022-02-04 12:36:33 +09003101 ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003102 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3103 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3104 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3105 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3106}
3107
Jooyung Han8e5685d2020-09-21 11:02:57 +09003108func TestApex_withPrebuiltFirmware(t *testing.T) {
3109 testCases := []struct {
3110 name string
3111 additionalProp string
3112 }{
3113 {"system apex with prebuilt_firmware", ""},
3114 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3115 }
3116 for _, tc := range testCases {
3117 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003118 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003119 apex {
3120 name: "myapex",
3121 key: "myapex.key",
3122 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003123 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003124 `+tc.additionalProp+`
3125 }
3126 apex_key {
3127 name: "myapex.key",
3128 public_key: "testkey.avbpubkey",
3129 private_key: "testkey.pem",
3130 }
3131 prebuilt_firmware {
3132 name: "myfirmware",
3133 src: "myfirmware.bin",
3134 filename_from_src: true,
3135 `+tc.additionalProp+`
3136 }
3137 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003138 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003139 "etc/firmware/myfirmware.bin",
3140 })
3141 })
3142 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003143}
3144
Jooyung Hanefb184e2020-06-25 17:14:25 +09003145func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003146 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003147 apex {
3148 name: "myapex",
3149 key: "myapex.key",
3150 vendor: true,
3151 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003152 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003153 }
3154
3155 apex_key {
3156 name: "myapex.key",
3157 public_key: "testkey.avbpubkey",
3158 private_key: "testkey.pem",
3159 }
3160
3161 cc_library {
3162 name: "mylib",
3163 vendor_available: true,
3164 }
3165 `)
3166
Jooyung Hana0503a52023-08-23 13:12:50 +09003167 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003168 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003169 name := apexBundle.BaseModuleName()
3170 prefix := "TARGET_"
3171 var builder strings.Builder
3172 data.Custom(&builder, name, prefix, "", data)
3173 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003174 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003175}
3176
Jooyung Han2ed99d02020-06-24 23:26:26 +09003177func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 vintf_fragments: ["fragment.xml"],
3183 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003184 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003185 }
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191 cc_binary {
3192 name: "mybin",
3193 }
3194 `)
3195
Jooyung Hana0503a52023-08-23 13:12:50 +09003196 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003197 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003198 name := apexBundle.BaseModuleName()
3199 prefix := "TARGET_"
3200 var builder strings.Builder
3201 data.Custom(&builder, name, prefix, "", data)
3202 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003203 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003204 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003205}
3206
Jiyong Park16e91a02018-12-20 18:18:08 +09003207func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003208 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 apex {
3210 name: "myapex",
3211 key: "myapex.key",
3212 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003213 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003214 }
3215
3216 apex_key {
3217 name: "myapex.key",
3218 public_key: "testkey.avbpubkey",
3219 private_key: "testkey.pem",
3220 }
3221
3222 cc_library {
3223 name: "mylib",
3224 srcs: ["mylib.cpp"],
3225 system_shared_libs: [],
3226 stl: "none",
3227 stubs: {
3228 versions: ["1", "2", "3"],
3229 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003230 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003231 }
3232
3233 cc_binary {
3234 name: "not_in_apex",
3235 srcs: ["mylib.cpp"],
3236 static_libs: ["mylib"],
3237 static_executable: true,
3238 system_shared_libs: [],
3239 stl: "none",
3240 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003241 `)
3242
Colin Cross7113d202019-11-20 16:39:12 -08003243 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003244
3245 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003246 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003247}
Jiyong Park9335a262018-12-24 11:31:58 +09003248
3249func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003250 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003251 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003253 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003254 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003255 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003256 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003257 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003258 }
3259
3260 cc_library {
3261 name: "mylib",
3262 srcs: ["mylib.cpp"],
3263 system_shared_libs: [],
3264 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003265 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003266 }
3267
3268 apex_key {
3269 name: "myapex.key",
3270 public_key: "testkey.avbpubkey",
3271 private_key: "testkey.pem",
3272 }
3273
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003274 android_app_certificate {
3275 name: "myapex.certificate",
3276 certificate: "testkey",
3277 }
3278
3279 android_app_certificate {
3280 name: "myapex.certificate.override",
3281 certificate: "testkey.override",
3282 }
3283
Jiyong Park9335a262018-12-24 11:31:58 +09003284 `)
3285
3286 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003287 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003288
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003289 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3290 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003291 "vendor/foo/devkeys/testkey.avbpubkey")
3292 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003293 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3294 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003295 "vendor/foo/devkeys/testkey.pem")
3296 }
3297
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003298 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003299 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003300 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003301 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003302 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003303 }
3304}
Jiyong Park58e364a2019-01-19 19:24:06 +09003305
Jooyung Hanf121a652019-12-17 14:30:11 +09003306func TestCertificate(t *testing.T) {
3307 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003308 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003309 apex {
3310 name: "myapex",
3311 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003312 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003313 }
3314 apex_key {
3315 name: "myapex.key",
3316 public_key: "testkey.avbpubkey",
3317 private_key: "testkey.pem",
3318 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003319 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003320 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3321 if actual := rule.Args["certificates"]; actual != expected {
3322 t.Errorf("certificates should be %q, not %q", expected, actual)
3323 }
3324 })
3325 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003326 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003327 apex {
3328 name: "myapex_keytest",
3329 key: "myapex.key",
3330 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003331 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003332 }
3333 apex_key {
3334 name: "myapex.key",
3335 public_key: "testkey.avbpubkey",
3336 private_key: "testkey.pem",
3337 }
3338 android_app_certificate {
3339 name: "myapex.certificate.override",
3340 certificate: "testkey.override",
3341 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003342 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 expected := "testkey.override.x509.pem testkey.override.pk8"
3344 if actual := rule.Args["certificates"]; actual != expected {
3345 t.Errorf("certificates should be %q, not %q", expected, actual)
3346 }
3347 })
3348 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003349 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003350 apex {
3351 name: "myapex",
3352 key: "myapex.key",
3353 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003354 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003355 }
3356 apex_key {
3357 name: "myapex.key",
3358 public_key: "testkey.avbpubkey",
3359 private_key: "testkey.pem",
3360 }
3361 android_app_certificate {
3362 name: "myapex.certificate",
3363 certificate: "testkey",
3364 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003365 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003366 expected := "testkey.x509.pem testkey.pk8"
3367 if actual := rule.Args["certificates"]; actual != expected {
3368 t.Errorf("certificates should be %q, not %q", expected, actual)
3369 }
3370 })
3371 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003372 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003373 apex {
3374 name: "myapex_keytest",
3375 key: "myapex.key",
3376 file_contexts: ":myapex-file_contexts",
3377 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003378 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003379 }
3380 apex_key {
3381 name: "myapex.key",
3382 public_key: "testkey.avbpubkey",
3383 private_key: "testkey.pem",
3384 }
3385 android_app_certificate {
3386 name: "myapex.certificate.override",
3387 certificate: "testkey.override",
3388 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003389 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003390 expected := "testkey.override.x509.pem testkey.override.pk8"
3391 if actual := rule.Args["certificates"]; actual != expected {
3392 t.Errorf("certificates should be %q, not %q", expected, actual)
3393 }
3394 })
3395 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003396 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003397 apex {
3398 name: "myapex",
3399 key: "myapex.key",
3400 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003401 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003402 }
3403 apex_key {
3404 name: "myapex.key",
3405 public_key: "testkey.avbpubkey",
3406 private_key: "testkey.pem",
3407 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003408 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003409 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3410 if actual := rule.Args["certificates"]; actual != expected {
3411 t.Errorf("certificates should be %q, not %q", expected, actual)
3412 }
3413 })
3414 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003415 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003416 apex {
3417 name: "myapex_keytest",
3418 key: "myapex.key",
3419 file_contexts: ":myapex-file_contexts",
3420 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003421 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003422 }
3423 apex_key {
3424 name: "myapex.key",
3425 public_key: "testkey.avbpubkey",
3426 private_key: "testkey.pem",
3427 }
3428 android_app_certificate {
3429 name: "myapex.certificate.override",
3430 certificate: "testkey.override",
3431 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003432 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003433 expected := "testkey.override.x509.pem testkey.override.pk8"
3434 if actual := rule.Args["certificates"]; actual != expected {
3435 t.Errorf("certificates should be %q, not %q", expected, actual)
3436 }
3437 })
3438}
3439
Jiyong Park58e364a2019-01-19 19:24:06 +09003440func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003441 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003442 apex {
3443 name: "myapex",
3444 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003445 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003446 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003447 }
3448
3449 apex {
3450 name: "otherapex",
3451 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003452 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003453 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003454 }
3455
3456 apex_key {
3457 name: "myapex.key",
3458 public_key: "testkey.avbpubkey",
3459 private_key: "testkey.pem",
3460 }
3461
3462 cc_library {
3463 name: "mylib",
3464 srcs: ["mylib.cpp"],
3465 system_shared_libs: [],
3466 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003467 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003468 "myapex",
3469 "otherapex",
3470 ],
Jooyung Han24282772020-03-21 23:20:55 +09003471 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003472 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003473 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003474 cc_library {
3475 name: "mylib2",
3476 srcs: ["mylib.cpp"],
3477 system_shared_libs: [],
3478 stl: "none",
3479 apex_available: [
3480 "myapex",
3481 "otherapex",
3482 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003483 static_libs: ["mylib3"],
3484 recovery_available: true,
3485 min_sdk_version: "29",
3486 }
3487 cc_library {
3488 name: "mylib3",
3489 srcs: ["mylib.cpp"],
3490 system_shared_libs: [],
3491 stl: "none",
3492 apex_available: [
3493 "myapex",
3494 "otherapex",
3495 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003496 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003497 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003498 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003499 `)
3500
Jooyung Hanc87a0592020-03-02 17:44:33 +09003501 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003502 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003503 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003504
Vinh Tranf9754732023-01-19 22:41:46 -05003505 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003506 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003507 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003508
Vinh Tranf9754732023-01-19 22:41:46 -05003509 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003510 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003511 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003512
Colin Crossaede88c2020-08-11 12:17:01 -07003513 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3514 // each variant defines additional macros to distinguish which apex variant it is built for
3515
3516 // non-APEX variant does not have __ANDROID_APEX__ defined
3517 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3518 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3519
Vinh Tranf9754732023-01-19 22:41:46 -05003520 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003521 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3522 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003523
Jooyung Hanc87a0592020-03-02 17:44:33 +09003524 // non-APEX variant does not have __ANDROID_APEX__ defined
3525 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3526 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3527
Vinh Tranf9754732023-01-19 22:41:46 -05003528 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003529 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003530 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003531}
Jiyong Park7e636d02019-01-28 16:16:54 +09003532
3533func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003534 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003535 apex {
3536 name: "myapex",
3537 key: "myapex.key",
3538 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003539 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003540 }
3541
3542 apex_key {
3543 name: "myapex.key",
3544 public_key: "testkey.avbpubkey",
3545 private_key: "testkey.pem",
3546 }
3547
3548 cc_library_headers {
3549 name: "mylib_headers",
3550 export_include_dirs: ["my_include"],
3551 system_shared_libs: [],
3552 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003553 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003554 }
3555
3556 cc_library {
3557 name: "mylib",
3558 srcs: ["mylib.cpp"],
3559 system_shared_libs: [],
3560 stl: "none",
3561 header_libs: ["mylib_headers"],
3562 export_header_lib_headers: ["mylib_headers"],
3563 stubs: {
3564 versions: ["1", "2", "3"],
3565 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003566 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003567 }
3568
3569 cc_library {
3570 name: "otherlib",
3571 srcs: ["mylib.cpp"],
3572 system_shared_libs: [],
3573 stl: "none",
3574 shared_libs: ["mylib"],
3575 }
3576 `)
3577
Colin Cross7113d202019-11-20 16:39:12 -08003578 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003579
3580 // Ensure that the include path of the header lib is exported to 'otherlib'
3581 ensureContains(t, cFlags, "-Imy_include")
3582}
Alex Light9670d332019-01-29 18:07:33 -08003583
Jiyong Park7cd10e32020-01-14 09:22:18 +09003584type fileInApex struct {
3585 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003586 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003587 isLink bool
3588}
3589
Jooyung Han1724d582022-12-21 10:17:44 +09003590func (f fileInApex) String() string {
3591 return f.src + ":" + f.path
3592}
3593
3594func (f fileInApex) match(expectation string) bool {
3595 parts := strings.Split(expectation, ":")
3596 if len(parts) == 1 {
3597 match, _ := path.Match(parts[0], f.path)
3598 return match
3599 }
3600 if len(parts) == 2 {
3601 matchSrc, _ := path.Match(parts[0], f.src)
3602 matchDst, _ := path.Match(parts[1], f.path)
3603 return matchSrc && matchDst
3604 }
3605 panic("invalid expected file specification: " + expectation)
3606}
3607
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003609 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003610 module := ctx.ModuleForTests(moduleName, variant)
3611 apexRule := module.MaybeRule("apexRule")
3612 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003613 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003614 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003615 for _, cmd := range strings.Split(copyCmds, "&&") {
3616 cmd = strings.TrimSpace(cmd)
3617 if cmd == "" {
3618 continue
3619 }
3620 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003621 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003622 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 switch terms[0] {
3624 case "mkdir":
3625 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003626 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003627 t.Fatal("copyCmds contains invalid cp command", cmd)
3628 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003629 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003630 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003631 isLink = false
3632 case "ln":
3633 if len(terms) != 3 && len(terms) != 4 {
3634 // ln LINK TARGET or ln -s LINK TARGET
3635 t.Fatal("copyCmds contains invalid ln command", cmd)
3636 }
3637 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003638 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003639 isLink = true
3640 default:
3641 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3642 }
3643 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003644 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003645 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003646 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003647 }
Jooyung Han1724d582022-12-21 10:17:44 +09003648 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003649 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 }
3651 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003652 return ret
3653}
3654
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003655func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003656 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003657 var failed bool
3658 var surplus []string
3659 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003660 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003661 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003662 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003663 if file.match(expected) {
3664 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003665 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003666 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 }
3668 }
Jooyung Han1724d582022-12-21 10:17:44 +09003669 if !matchFound {
3670 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003671 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003672 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003673
Jooyung Han31c470b2019-10-18 16:26:59 +09003674 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003675 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003676 t.Log("surplus files", surplus)
3677 failed = true
3678 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003679
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003680 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003681 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003682 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003683 if !filesMatched[expected] {
3684 missing = append(missing, expected)
3685 }
3686 }
3687 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003688 t.Log("missing files", missing)
3689 failed = true
3690 }
3691 if failed {
3692 t.Fail()
3693 }
3694}
3695
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003696func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3697 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3698}
3699
3700func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
3701 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
3702 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3703 if deapexer.Output != nil {
3704 outputs = append(outputs, deapexer.Output.String())
3705 }
3706 for _, output := range deapexer.ImplicitOutputs {
3707 outputs = append(outputs, output.String())
3708 }
3709 actualFiles := make([]fileInApex, 0, len(outputs))
3710 for _, output := range outputs {
3711 dir := "/deapexer/"
3712 pos := strings.LastIndex(output, dir)
3713 if pos == -1 {
3714 t.Fatal("Unknown deapexer output ", output)
3715 }
3716 path := output[pos+len(dir):]
3717 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3718 }
3719 assertFileListEquals(t, files, actualFiles)
3720}
3721
Jooyung Han344d5432019-08-23 11:17:39 +09003722func TestVndkApexCurrent(t *testing.T) {
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003723 commonFiles := []string{
Jooyung Hane6436d72020-02-27 13:31:56 +09003724 "lib/libc++.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003725 "lib64/libc++.so",
Jiyong Parkf58c46e2021-04-01 21:35:20 +09003726 "etc/llndk.libraries.29.txt",
3727 "etc/vndkcore.libraries.29.txt",
3728 "etc/vndksp.libraries.29.txt",
3729 "etc/vndkprivate.libraries.29.txt",
3730 "etc/vndkproduct.libraries.29.txt",
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003731 }
3732 testCases := []struct {
3733 vndkVersion string
3734 expectedFiles []string
3735 }{
3736 {
3737 vndkVersion: "current",
3738 expectedFiles: append(commonFiles,
3739 "lib/libvndk.so",
3740 "lib/libvndksp.so",
3741 "lib64/libvndk.so",
3742 "lib64/libvndksp.so"),
3743 },
3744 {
3745 vndkVersion: "",
3746 expectedFiles: append(commonFiles,
3747 // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
3748 "lib/libvndksp.so",
3749 "lib64/libvndksp.so"),
3750 },
3751 }
3752 for _, tc := range testCases {
3753 t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
3754 ctx := testApex(t, `
3755 apex_vndk {
3756 name: "com.android.vndk.current",
3757 key: "com.android.vndk.current.key",
3758 updatable: false,
3759 }
3760
3761 apex_key {
3762 name: "com.android.vndk.current.key",
3763 public_key: "testkey.avbpubkey",
3764 private_key: "testkey.pem",
3765 }
3766
3767 cc_library {
3768 name: "libvndk",
3769 srcs: ["mylib.cpp"],
3770 vendor_available: true,
3771 product_available: true,
3772 vndk: {
3773 enabled: true,
3774 },
3775 system_shared_libs: [],
3776 stl: "none",
3777 apex_available: [ "com.android.vndk.current" ],
3778 }
3779
3780 cc_library {
3781 name: "libvndksp",
3782 srcs: ["mylib.cpp"],
3783 vendor_available: true,
3784 product_available: true,
3785 vndk: {
3786 enabled: true,
3787 support_system_process: true,
3788 },
3789 system_shared_libs: [],
3790 stl: "none",
3791 apex_available: [ "com.android.vndk.current" ],
3792 }
3793
3794 // VNDK-Ext should not cause any problems
3795
3796 cc_library {
3797 name: "libvndk.ext",
3798 srcs: ["mylib2.cpp"],
3799 vendor: true,
3800 vndk: {
3801 enabled: true,
3802 extends: "libvndk",
3803 },
3804 system_shared_libs: [],
3805 stl: "none",
3806 }
3807
3808 cc_library {
3809 name: "libvndksp.ext",
3810 srcs: ["mylib2.cpp"],
3811 vendor: true,
3812 vndk: {
3813 enabled: true,
3814 support_system_process: true,
3815 extends: "libvndksp",
3816 },
3817 system_shared_libs: [],
3818 stl: "none",
3819 }
3820 `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3821 variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
Kiyoung Kima2d6dee2023-08-11 10:14:43 +09003822 variables.KeepVndk = proptools.BoolPtr(true)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003823 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003824 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", tc.expectedFiles)
Jooyung Han7d6e79b2021-06-24 01:53:43 +09003825 })
3826 }
Jooyung Han344d5432019-08-23 11:17:39 +09003827}
3828
3829func TestVndkApexWithPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003830 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003831 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003832 name: "com.android.vndk.current",
3833 key: "com.android.vndk.current.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003834 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003835 }
3836
3837 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08003838 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003839 public_key: "testkey.avbpubkey",
3840 private_key: "testkey.pem",
3841 }
3842
3843 cc_prebuilt_library_shared {
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 name: "libvndk",
3845 srcs: ["libvndk.so"],
Jooyung Han344d5432019-08-23 11:17:39 +09003846 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003847 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003848 vndk: {
3849 enabled: true,
3850 },
3851 system_shared_libs: [],
3852 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003853 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003854 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003855
3856 cc_prebuilt_library_shared {
3857 name: "libvndk.arm",
3858 srcs: ["libvndk.arm.so"],
3859 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003860 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003861 vndk: {
3862 enabled: true,
3863 },
3864 enabled: false,
3865 arch: {
3866 arm: {
3867 enabled: true,
3868 },
3869 },
3870 system_shared_libs: [],
3871 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08003872 apex_available: [ "com.android.vndk.current" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003873 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003874 `+vndkLibrariesTxtFiles("current"),
3875 withFiles(map[string][]byte{
3876 "libvndk.so": nil,
3877 "libvndk.arm.so": nil,
3878 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09003879 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003880 "lib/libvndk.so",
3881 "lib/libvndk.arm.so",
3882 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09003883 "lib/libc++.so",
3884 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003885 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003886 })
Jooyung Han344d5432019-08-23 11:17:39 +09003887}
3888
Jooyung Han39edb6c2019-11-06 16:53:07 +09003889func vndkLibrariesTxtFiles(vers ...string) (result string) {
3890 for _, v := range vers {
3891 if v == "current" {
Justin Yund5784122023-10-25 13:25:32 +09003892 for _, txt := range []string{"vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003893 result += `
Colin Crosse4e44bc2020-12-28 13:50:21 -08003894 ` + txt + `_libraries_txt {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003895 name: "` + txt + `.libraries.txt",
Justin Yund5784122023-10-25 13:25:32 +09003896 insert_vndk_version: true,
Jooyung Han39edb6c2019-11-06 16:53:07 +09003897 }
3898 `
3899 }
Justin Yund5784122023-10-25 13:25:32 +09003900 result += `
3901 llndk_libraries_txt {
3902 name: "llndk.libraries.txt",
3903 }
3904 llndk_libraries_txt_for_apex {
3905 name: "llndk.libraries.txt.apex",
3906 stem: "llndk.libraries.txt",
3907 insert_vndk_version: true,
3908 }
3909 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 } else {
Justin Yun8a2600c2020-12-07 12:44:03 +09003911 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003912 result += `
3913 prebuilt_etc {
3914 name: "` + txt + `.libraries.` + v + `.txt",
3915 src: "dummy.txt",
3916 }
3917 `
3918 }
3919 }
3920 }
3921 return
3922}
3923
Jooyung Han344d5432019-08-23 11:17:39 +09003924func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003925 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003926 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003927 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003928 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003929 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003930 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003932 }
3933
3934 apex_key {
3935 name: "myapex.key",
3936 public_key: "testkey.avbpubkey",
3937 private_key: "testkey.pem",
3938 }
3939
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 vndk_prebuilt_shared {
3941 name: "libvndk27",
3942 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003943 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003944 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003945 vndk: {
3946 enabled: true,
3947 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003948 target_arch: "arm64",
3949 arch: {
3950 arm: {
3951 srcs: ["libvndk27_arm.so"],
3952 },
3953 arm64: {
3954 srcs: ["libvndk27_arm64.so"],
3955 },
3956 },
Colin Cross2807f002021-03-02 10:15:29 -08003957 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003958 }
3959
3960 vndk_prebuilt_shared {
3961 name: "libvndk27",
3962 version: "27",
3963 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003964 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003965 vndk: {
3966 enabled: true,
3967 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003968 target_arch: "x86_64",
3969 arch: {
3970 x86: {
3971 srcs: ["libvndk27_x86.so"],
3972 },
3973 x86_64: {
3974 srcs: ["libvndk27_x86_64.so"],
3975 },
3976 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003977 }
3978 `+vndkLibrariesTxtFiles("27"),
3979 withFiles(map[string][]byte{
3980 "libvndk27_arm.so": nil,
3981 "libvndk27_arm64.so": nil,
3982 "libvndk27_x86.so": nil,
3983 "libvndk27_x86_64.so": nil,
3984 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003985
Jooyung Hana0503a52023-08-23 13:12:50 +09003986 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 "lib/libvndk27_arm.so",
3988 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003989 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003990 })
Jooyung Han344d5432019-08-23 11:17:39 +09003991}
3992
Jooyung Han90eee022019-10-01 20:02:42 +09003993func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003994 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003995 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003996 name: "com.android.vndk.current",
Jooyung Han90eee022019-10-01 20:02:42 +09003997 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003998 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004000 }
4001 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004002 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004003 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004004 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004005 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004006 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004007 }
4008 apex_key {
4009 name: "myapex.key",
4010 public_key: "testkey.avbpubkey",
4011 private_key: "testkey.pem",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004012 }`+vndkLibrariesTxtFiles("28", "current"))
Jooyung Han90eee022019-10-01 20:02:42 +09004013
4014 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004015 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004016 apexManifestRule := module.Rule("apexManifestRule")
4017 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004018 }
4019
Jiyong Parkf58c46e2021-04-01 21:35:20 +09004020 assertApexName("com.android.vndk.v29", "com.android.vndk.current")
Colin Cross2807f002021-03-02 10:15:29 -08004021 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004022}
4023
Jooyung Han344d5432019-08-23 11:17:39 +09004024func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004025 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004026 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004027 name: "com.android.vndk.current",
4028 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004030 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004031 }
4032
4033 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004034 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004035 public_key: "testkey.avbpubkey",
4036 private_key: "testkey.pem",
4037 }
4038
4039 cc_library {
4040 name: "libvndk",
4041 srcs: ["mylib.cpp"],
4042 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004043 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004044 native_bridge_supported: true,
4045 host_supported: true,
4046 vndk: {
4047 enabled: true,
4048 },
4049 system_shared_libs: [],
4050 stl: "none",
Colin Cross2807f002021-03-02 10:15:29 -08004051 apex_available: [ "com.android.vndk.current" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004052 }
Colin Cross2807f002021-03-02 10:15:29 -08004053 `+vndkLibrariesTxtFiles("current"),
4054 withNativeBridgeEnabled)
Jooyung Han344d5432019-08-23 11:17:39 +09004055
Jooyung Hana0503a52023-08-23 13:12:50 +09004056 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 "lib/libvndk.so",
4058 "lib64/libvndk.so",
Jooyung Hane6436d72020-02-27 13:31:56 +09004059 "lib/libc++.so",
4060 "lib64/libc++.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004061 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004062 })
Jooyung Han344d5432019-08-23 11:17:39 +09004063}
4064
4065func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Cross2807f002021-03-02 10:15:29 -08004066 testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004067 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004068 name: "com.android.vndk.current",
4069 key: "com.android.vndk.current.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004070 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004071 native_bridge_supported: true,
4072 }
4073
4074 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004075 name: "com.android.vndk.current.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004076 public_key: "testkey.avbpubkey",
4077 private_key: "testkey.pem",
4078 }
4079
4080 cc_library {
4081 name: "libvndk",
4082 srcs: ["mylib.cpp"],
4083 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004084 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004085 native_bridge_supported: true,
4086 host_supported: true,
4087 vndk: {
4088 enabled: true,
4089 },
4090 system_shared_libs: [],
4091 stl: "none",
4092 }
4093 `)
4094}
4095
Jooyung Han31c470b2019-10-18 16:26:59 +09004096func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004097 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004099 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004100 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004101 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004102 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004103 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004104 }
4105
4106 apex_key {
4107 name: "myapex.key",
4108 public_key: "testkey.avbpubkey",
4109 private_key: "testkey.pem",
4110 }
4111
4112 vndk_prebuilt_shared {
4113 name: "libvndk27",
4114 version: "27",
4115 target_arch: "arm",
4116 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004117 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004118 vndk: {
4119 enabled: true,
4120 },
4121 arch: {
4122 arm: {
4123 srcs: ["libvndk27.so"],
4124 }
4125 },
4126 }
4127
4128 vndk_prebuilt_shared {
4129 name: "libvndk27",
4130 version: "27",
4131 target_arch: "arm",
4132 binder32bit: true,
4133 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004134 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004135 vndk: {
4136 enabled: true,
4137 },
4138 arch: {
4139 arm: {
4140 srcs: ["libvndk27binder32.so"],
4141 }
4142 },
Colin Cross2807f002021-03-02 10:15:29 -08004143 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004144 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004145 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004146 withFiles(map[string][]byte{
4147 "libvndk27.so": nil,
4148 "libvndk27binder32.so": nil,
4149 }),
4150 withBinder32bit,
4151 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07004152 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09004153 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
4154 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09004155 },
4156 }),
4157 )
4158
Jooyung Hana0503a52023-08-23 13:12:50 +09004159 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004160 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004161 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004162 })
4163}
4164
Jooyung Han45a96772020-06-15 14:59:42 +09004165func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004166 ctx := testApex(t, `
Jooyung Han45a96772020-06-15 14:59:42 +09004167 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004168 name: "com.android.vndk.current",
4169 key: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004170 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004171 updatable: false,
Jooyung Han45a96772020-06-15 14:59:42 +09004172 }
4173
4174 apex_key {
Colin Cross2807f002021-03-02 10:15:29 -08004175 name: "com.android.vndk.current.key",
Jooyung Han45a96772020-06-15 14:59:42 +09004176 public_key: "testkey.avbpubkey",
4177 private_key: "testkey.pem",
4178 }
4179
4180 cc_library {
4181 name: "libz",
4182 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004183 product_available: true,
Jooyung Han45a96772020-06-15 14:59:42 +09004184 vndk: {
4185 enabled: true,
4186 },
4187 stubs: {
4188 symbol_file: "libz.map.txt",
4189 versions: ["30"],
4190 }
4191 }
4192 `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
4193 "libz.map.txt": nil,
4194 }))
4195
Jooyung Hana0503a52023-08-23 13:12:50 +09004196 apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common").Rule("apexManifestRule")
Jooyung Han45a96772020-06-15 14:59:42 +09004197 provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
4198 ensureListEmpty(t, provideNativeLibs)
Jooyung Hana0503a52023-08-23 13:12:50 +09004199 ensureExactContents(t, ctx, "com.android.vndk.current", "android_common", []string{
Jooyung Han1724d582022-12-21 10:17:44 +09004200 "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
4201 "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
4202 "*/*",
4203 })
Jooyung Han45a96772020-06-15 14:59:42 +09004204}
4205
Jooyung Hane3f02812023-05-08 13:54:50 +09004206func TestVendorApexWithVndkPrebuilts(t *testing.T) {
4207 ctx := testApex(t, "",
4208 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
4209 variables.DeviceVndkVersion = proptools.StringPtr("27")
4210 }),
4211 android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
4212 cc.RegisterVendorSnapshotModules(ctx)
4213 }),
4214 withFiles(map[string][]byte{
4215 "vendor/foo/Android.bp": []byte(`
4216 apex {
4217 name: "myapex",
4218 binaries: ["foo"],
4219 key: "myapex.key",
4220 min_sdk_version: "27",
4221 vendor: true,
4222 }
4223
4224 cc_binary {
4225 name: "foo",
4226 vendor: true,
4227 srcs: ["abc.cpp"],
4228 shared_libs: [
4229 "libllndk",
4230 "libvndk",
4231 ],
4232 nocrt: true,
4233 system_shared_libs: [],
4234 min_sdk_version: "27",
4235 }
4236
4237 apex_key {
4238 name: "myapex.key",
4239 public_key: "testkey.avbpubkey",
4240 private_key: "testkey.pem",
4241 }
4242 `),
4243 // Simulate VNDK prebuilts with vendor_snapshot
4244 "prebuilts/vndk/Android.bp": []byte(`
4245 vndk_prebuilt_shared {
4246 name: "libllndk",
4247 version: "27",
4248 vendor_available: true,
4249 product_available: true,
4250 target_arch: "arm64",
4251 arch: {
4252 arm64: {
4253 srcs: ["libllndk.so"],
4254 },
4255 },
4256 }
4257
4258 vndk_prebuilt_shared {
4259 name: "libvndk",
4260 version: "27",
4261 vendor_available: true,
4262 product_available: true,
4263 target_arch: "arm64",
4264 arch: {
4265 arm64: {
4266 srcs: ["libvndk.so"],
4267 },
4268 },
4269 vndk: {
4270 enabled: true,
4271 },
4272 min_sdk_version: "27",
4273 }
4274
4275 vndk_prebuilt_shared {
4276 name: "libc++",
4277 version: "27",
4278 target_arch: "arm64",
4279 vendor_available: true,
4280 product_available: true,
4281 vndk: {
4282 enabled: true,
4283 support_system_process: true,
4284 },
4285 arch: {
4286 arm64: {
4287 srcs: ["libc++.so"],
4288 },
4289 },
4290 min_sdk_version: "apex_inherit",
4291 }
4292
4293 vendor_snapshot {
4294 name: "vendor_snapshot",
4295 version: "27",
4296 arch: {
4297 arm64: {
4298 vndk_libs: [
4299 "libc++",
4300 "libllndk",
4301 "libvndk",
4302 ],
4303 static_libs: [
4304 "libc++demangle",
4305 "libclang_rt.builtins",
4306 "libunwind",
4307 ],
4308 },
4309 }
4310 }
4311
4312 vendor_snapshot_static {
4313 name: "libclang_rt.builtins",
4314 version: "27",
4315 target_arch: "arm64",
4316 vendor: true,
4317 arch: {
4318 arm64: {
4319 src: "libclang_rt.builtins-aarch64-android.a",
4320 },
4321 },
4322 }
4323
4324 vendor_snapshot_static {
4325 name: "libc++demangle",
4326 version: "27",
4327 target_arch: "arm64",
4328 compile_multilib: "64",
4329 vendor: true,
4330 arch: {
4331 arm64: {
4332 src: "libc++demangle.a",
4333 },
4334 },
4335 min_sdk_version: "apex_inherit",
4336 }
4337
4338 vendor_snapshot_static {
4339 name: "libunwind",
4340 version: "27",
4341 target_arch: "arm64",
4342 compile_multilib: "64",
4343 vendor: true,
4344 arch: {
4345 arm64: {
4346 src: "libunwind.a",
4347 },
4348 },
4349 min_sdk_version: "apex_inherit",
4350 }
4351 `),
4352 }))
4353
4354 // Should embed the prebuilt VNDK libraries in the apex
Jooyung Hana0503a52023-08-23 13:12:50 +09004355 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hane3f02812023-05-08 13:54:50 +09004356 "bin/foo",
4357 "prebuilts/vndk/libc++.so:lib64/libc++.so",
4358 "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
4359 })
4360
4361 // Should link foo with prebuilt libraries (shared/static)
4362 ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
4363 android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
4364 android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
4365 android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
4366 android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
4367
4368 // Should declare the LLNDK library as a "required" external dependency
Jooyung Hana0503a52023-08-23 13:12:50 +09004369 manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hane3f02812023-05-08 13:54:50 +09004370 requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
4371 ensureListContains(t, requireNativeLibs, "libllndk.so")
4372}
4373
Jooyung Hane1633032019-08-01 17:41:43 +09004374func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004376 apex {
4377 name: "myapex_nodep",
4378 key: "myapex.key",
4379 native_shared_libs: ["lib_nodep"],
4380 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004381 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004382 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004383 }
4384
4385 apex {
4386 name: "myapex_dep",
4387 key: "myapex.key",
4388 native_shared_libs: ["lib_dep"],
4389 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004390 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004391 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004392 }
4393
4394 apex {
4395 name: "myapex_provider",
4396 key: "myapex.key",
4397 native_shared_libs: ["libfoo"],
4398 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004399 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004400 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004401 }
4402
4403 apex {
4404 name: "myapex_selfcontained",
4405 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004406 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004407 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004408 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004409 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004410 }
4411
4412 apex_key {
4413 name: "myapex.key",
4414 public_key: "testkey.avbpubkey",
4415 private_key: "testkey.pem",
4416 }
4417
4418 cc_library {
4419 name: "lib_nodep",
4420 srcs: ["mylib.cpp"],
4421 system_shared_libs: [],
4422 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004423 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004424 }
4425
4426 cc_library {
4427 name: "lib_dep",
4428 srcs: ["mylib.cpp"],
4429 shared_libs: ["libfoo"],
4430 system_shared_libs: [],
4431 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004432 apex_available: [
4433 "myapex_dep",
4434 "myapex_provider",
4435 "myapex_selfcontained",
4436 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004440 name: "lib_dep_on_bar",
4441 srcs: ["mylib.cpp"],
4442 shared_libs: ["libbar"],
4443 system_shared_libs: [],
4444 stl: "none",
4445 apex_available: [
4446 "myapex_selfcontained",
4447 ],
4448 }
4449
4450
4451 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004452 name: "libfoo",
4453 srcs: ["mytest.cpp"],
4454 stubs: {
4455 versions: ["1"],
4456 },
4457 system_shared_libs: [],
4458 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004459 apex_available: [
4460 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004461 ],
4462 }
4463
4464 cc_library {
4465 name: "libbar",
4466 srcs: ["mytest.cpp"],
4467 stubs: {
4468 versions: ["1"],
4469 },
4470 system_shared_libs: [],
4471 stl: "none",
4472 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004473 "myapex_selfcontained",
4474 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004475 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004476
Jooyung Hane1633032019-08-01 17:41:43 +09004477 `)
4478
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004479 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004480 var provideNativeLibs, requireNativeLibs []string
4481
Jooyung Hana0503a52023-08-23 13:12:50 +09004482 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004483 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4484 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004485 ensureListEmpty(t, provideNativeLibs)
4486 ensureListEmpty(t, requireNativeLibs)
4487
Jooyung Hana0503a52023-08-23 13:12:50 +09004488 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004489 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4490 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004491 ensureListEmpty(t, provideNativeLibs)
4492 ensureListContains(t, requireNativeLibs, "libfoo.so")
4493
Jooyung Hana0503a52023-08-23 13:12:50 +09004494 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004495 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4496 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004497 ensureListContains(t, provideNativeLibs, "libfoo.so")
4498 ensureListEmpty(t, requireNativeLibs)
4499
Jooyung Hana0503a52023-08-23 13:12:50 +09004500 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004501 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4502 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004503 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004504 ensureListEmpty(t, requireNativeLibs)
4505}
4506
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004507func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4508 ctx := testApex(t, `
4509 apex {
4510 name: "myapex",
4511 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004512 native_shared_libs: ["mylib"],
4513 updatable: false,
4514 }
4515
4516 apex_key {
4517 name: "myapex.key",
4518 public_key: "testkey.avbpubkey",
4519 private_key: "testkey.pem",
4520 }
4521
4522 cc_library {
4523 name: "mylib",
4524 srcs: ["mylib.cpp"],
4525 system_shared_libs: [],
4526 stl: "none",
4527 apex_available: [
4528 "//apex_available:platform",
4529 "myapex",
4530 ],
4531 }
4532 `, android.FixtureMergeEnv(map[string]string{
4533 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4534 }))
4535
Jooyung Hana0503a52023-08-23 13:12:50 +09004536 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004537 apexManifestRule := module.Rule("apexManifestRule")
4538 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4539}
4540
Vinh Tran8f5310f2022-10-07 18:16:47 -04004541func TestCompileMultilibProp(t *testing.T) {
4542 testCases := []struct {
4543 compileMultiLibProp string
4544 containedLibs []string
4545 notContainedLibs []string
4546 }{
4547 {
4548 containedLibs: []string{
4549 "image.apex/lib64/mylib.so",
4550 "image.apex/lib/mylib.so",
4551 },
4552 compileMultiLibProp: `compile_multilib: "both",`,
4553 },
4554 {
4555 containedLibs: []string{"image.apex/lib64/mylib.so"},
4556 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4557 compileMultiLibProp: `compile_multilib: "first",`,
4558 },
4559 {
4560 containedLibs: []string{"image.apex/lib64/mylib.so"},
4561 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4562 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4563 },
4564 {
4565 containedLibs: []string{"image.apex/lib64/mylib.so"},
4566 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4567 compileMultiLibProp: `compile_multilib: "64",`,
4568 },
4569 {
4570 containedLibs: []string{"image.apex/lib/mylib.so"},
4571 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4572 compileMultiLibProp: `compile_multilib: "32",`,
4573 },
4574 }
4575 for _, testCase := range testCases {
4576 ctx := testApex(t, fmt.Sprintf(`
4577 apex {
4578 name: "myapex",
4579 key: "myapex.key",
4580 %s
4581 native_shared_libs: ["mylib"],
4582 updatable: false,
4583 }
4584 apex_key {
4585 name: "myapex.key",
4586 public_key: "testkey.avbpubkey",
4587 private_key: "testkey.pem",
4588 }
4589 cc_library {
4590 name: "mylib",
4591 srcs: ["mylib.cpp"],
4592 apex_available: [
4593 "//apex_available:platform",
4594 "myapex",
4595 ],
4596 }
4597 `, testCase.compileMultiLibProp),
4598 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004599 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004600 apexRule := module.Rule("apexRule")
4601 copyCmds := apexRule.Args["copy_commands"]
4602 for _, containedLib := range testCase.containedLibs {
4603 ensureContains(t, copyCmds, containedLib)
4604 }
4605 for _, notContainedLib := range testCase.notContainedLibs {
4606 ensureNotContains(t, copyCmds, notContainedLib)
4607 }
4608 }
4609}
4610
Alex Light0851b882019-02-07 13:20:53 -08004611func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004612 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004613 apex {
4614 name: "myapex",
4615 key: "myapex.key",
4616 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004617 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004618 }
4619
4620 apex_key {
4621 name: "myapex.key",
4622 public_key: "testkey.avbpubkey",
4623 private_key: "testkey.pem",
4624 }
4625
4626 cc_library {
4627 name: "mylib_common",
4628 srcs: ["mylib.cpp"],
4629 system_shared_libs: [],
4630 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004631 apex_available: [
4632 "//apex_available:platform",
4633 "myapex",
4634 ],
Alex Light0851b882019-02-07 13:20:53 -08004635 }
4636 `)
4637
Jooyung Hana0503a52023-08-23 13:12:50 +09004638 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004639 apexRule := module.Rule("apexRule")
4640 copyCmds := apexRule.Args["copy_commands"]
4641
4642 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4643 t.Log("Apex was a test apex!")
4644 t.Fail()
4645 }
4646 // Ensure that main rule creates an output
4647 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4648
4649 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004650 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004651
4652 // Ensure that both direct and indirect deps are copied into apex
4653 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4654
Colin Cross7113d202019-11-20 16:39:12 -08004655 // Ensure that the platform variant ends with _shared
4656 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004657
Colin Cross56a83212020-09-15 18:30:11 -07004658 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004659 t.Log("Found mylib_common not in any apex!")
4660 t.Fail()
4661 }
4662}
4663
4664func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004665 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004666 apex_test {
4667 name: "myapex",
4668 key: "myapex.key",
4669 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004670 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004671 }
4672
4673 apex_key {
4674 name: "myapex.key",
4675 public_key: "testkey.avbpubkey",
4676 private_key: "testkey.pem",
4677 }
4678
4679 cc_library {
4680 name: "mylib_common_test",
4681 srcs: ["mylib.cpp"],
4682 system_shared_libs: [],
4683 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004684 // TODO: remove //apex_available:platform
4685 apex_available: [
4686 "//apex_available:platform",
4687 "myapex",
4688 ],
Alex Light0851b882019-02-07 13:20:53 -08004689 }
4690 `)
4691
Jooyung Hana0503a52023-08-23 13:12:50 +09004692 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004693 apexRule := module.Rule("apexRule")
4694 copyCmds := apexRule.Args["copy_commands"]
4695
4696 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4697 t.Log("Apex was not a test apex!")
4698 t.Fail()
4699 }
4700 // Ensure that main rule creates an output
4701 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4702
4703 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004704 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004705
4706 // Ensure that both direct and indirect deps are copied into apex
4707 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4708
Colin Cross7113d202019-11-20 16:39:12 -08004709 // Ensure that the platform variant ends with _shared
4710 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004711}
4712
Jooyung Han85707de2023-12-01 14:21:13 +09004713func TestLibzVendorIsntStable(t *testing.T) {
4714 ctx := testApex(t, `
4715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
4718 updatable: false,
4719 binaries: ["mybin"],
4720 }
4721 apex {
4722 name: "myvendorapex",
4723 key: "myapex.key",
4724 file_contexts: "myvendorapex_file_contexts",
4725 vendor: true,
4726 updatable: false,
4727 binaries: ["mybin"],
4728 }
4729 apex_key {
4730 name: "myapex.key",
4731 public_key: "testkey.avbpubkey",
4732 private_key: "testkey.pem",
4733 }
4734 cc_binary {
4735 name: "mybin",
4736 vendor_available: true,
4737 system_shared_libs: [],
4738 stl: "none",
4739 shared_libs: ["libz"],
4740 apex_available: ["//apex_available:anyapex"],
4741 }
4742 cc_library {
4743 name: "libz",
4744 vendor_available: true,
4745 system_shared_libs: [],
4746 stl: "none",
4747 stubs: {
4748 versions: ["28", "30"],
4749 },
4750 target: {
4751 vendor: {
4752 no_stubs: true,
4753 },
4754 },
4755 }
4756 `, withFiles(map[string][]byte{
4757 "myvendorapex_file_contexts": nil,
4758 }))
4759
4760 // libz provides stubs for core variant.
4761 {
4762 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4763 "bin/mybin",
4764 })
4765 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4766 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4767 }
4768 // libz doesn't provide stubs for vendor variant.
4769 {
4770 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4771 "bin/mybin",
4772 "lib64/libz.so",
4773 })
4774 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4775 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4776 }
4777}
4778
Alex Light9670d332019-01-29 18:07:33 -08004779func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004780 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004781 apex {
4782 name: "myapex",
4783 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004784 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004785 multilib: {
4786 first: {
4787 native_shared_libs: ["mylib_common"],
4788 }
4789 },
4790 target: {
4791 android: {
4792 multilib: {
4793 first: {
4794 native_shared_libs: ["mylib"],
4795 }
4796 }
4797 },
4798 host: {
4799 multilib: {
4800 first: {
4801 native_shared_libs: ["mylib2"],
4802 }
4803 }
4804 }
4805 }
4806 }
4807
4808 apex_key {
4809 name: "myapex.key",
4810 public_key: "testkey.avbpubkey",
4811 private_key: "testkey.pem",
4812 }
4813
4814 cc_library {
4815 name: "mylib",
4816 srcs: ["mylib.cpp"],
4817 system_shared_libs: [],
4818 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004819 // TODO: remove //apex_available:platform
4820 apex_available: [
4821 "//apex_available:platform",
4822 "myapex",
4823 ],
Alex Light9670d332019-01-29 18:07:33 -08004824 }
4825
4826 cc_library {
4827 name: "mylib_common",
4828 srcs: ["mylib.cpp"],
4829 system_shared_libs: [],
4830 stl: "none",
4831 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004832 // TODO: remove //apex_available:platform
4833 apex_available: [
4834 "//apex_available:platform",
4835 "myapex",
4836 ],
Alex Light9670d332019-01-29 18:07:33 -08004837 }
4838
4839 cc_library {
4840 name: "mylib2",
4841 srcs: ["mylib.cpp"],
4842 system_shared_libs: [],
4843 stl: "none",
4844 compile_multilib: "first",
4845 }
4846 `)
4847
Jooyung Hana0503a52023-08-23 13:12:50 +09004848 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004849 copyCmds := apexRule.Args["copy_commands"]
4850
4851 // Ensure that main rule creates an output
4852 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4853
4854 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004855 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4856 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4857 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004858
4859 // Ensure that both direct and indirect deps are copied into apex
4860 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4861 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4862 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4863
Colin Cross7113d202019-11-20 16:39:12 -08004864 // Ensure that the platform variant ends with _shared
4865 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4866 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4867 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004868}
Jiyong Park04480cf2019-02-06 00:16:29 +09004869
Jiyong Park59140302020-12-14 18:44:04 +09004870func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004871 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004872 apex {
4873 name: "myapex",
4874 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004875 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004876 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004877 arch: {
4878 arm64: {
4879 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004880 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004881 },
4882 x86_64: {
4883 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004884 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004885 },
4886 }
4887 }
4888
4889 apex_key {
4890 name: "myapex.key",
4891 public_key: "testkey.avbpubkey",
4892 private_key: "testkey.pem",
4893 }
4894
4895 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004896 name: "mylib.generic",
4897 srcs: ["mylib.cpp"],
4898 system_shared_libs: [],
4899 stl: "none",
4900 // TODO: remove //apex_available:platform
4901 apex_available: [
4902 "//apex_available:platform",
4903 "myapex",
4904 ],
4905 }
4906
4907 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004908 name: "mylib.arm64",
4909 srcs: ["mylib.cpp"],
4910 system_shared_libs: [],
4911 stl: "none",
4912 // TODO: remove //apex_available:platform
4913 apex_available: [
4914 "//apex_available:platform",
4915 "myapex",
4916 ],
4917 }
4918
4919 cc_library {
4920 name: "mylib.x64",
4921 srcs: ["mylib.cpp"],
4922 system_shared_libs: [],
4923 stl: "none",
4924 // TODO: remove //apex_available:platform
4925 apex_available: [
4926 "//apex_available:platform",
4927 "myapex",
4928 ],
4929 }
4930 `)
4931
Jooyung Hana0503a52023-08-23 13:12:50 +09004932 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004933 copyCmds := apexRule.Args["copy_commands"]
4934
4935 // Ensure that apex variant is created for the direct dep
4936 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004937 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004938 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4939
4940 // Ensure that both direct and indirect deps are copied into apex
4941 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4942 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4943}
4944
Jiyong Park04480cf2019-02-06 00:16:29 +09004945func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004946 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004947 apex {
4948 name: "myapex",
4949 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004950 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004951 updatable: false,
Jiyong Park04480cf2019-02-06 00:16:29 +09004952 }
4953
4954 apex_key {
4955 name: "myapex.key",
4956 public_key: "testkey.avbpubkey",
4957 private_key: "testkey.pem",
4958 }
4959
4960 sh_binary {
4961 name: "myscript",
4962 src: "mylib.cpp",
4963 filename: "myscript.sh",
4964 sub_dir: "script",
4965 }
4966 `)
4967
Jooyung Hana0503a52023-08-23 13:12:50 +09004968 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004969 copyCmds := apexRule.Args["copy_commands"]
4970
4971 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4972}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004973
Jooyung Han91df2082019-11-20 01:49:42 +09004974func TestApexInVariousPartition(t *testing.T) {
4975 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004976 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004977 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004978 {"", "system"},
4979 {"product_specific: true", "product"},
4980 {"soc_specific: true", "vendor"},
4981 {"proprietary: true", "vendor"},
4982 {"vendor: true", "vendor"},
4983 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004984 }
4985 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004986 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004987 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004988 apex {
4989 name: "myapex",
4990 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004991 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004992 `+tc.propName+`
4993 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004994
Jooyung Han91df2082019-11-20 01:49:42 +09004995 apex_key {
4996 name: "myapex.key",
4997 public_key: "testkey.avbpubkey",
4998 private_key: "testkey.pem",
4999 }
5000 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005001
Jooyung Hana0503a52023-08-23 13:12:50 +09005002 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005003 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005004 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005005 if actual != expected {
5006 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5007 }
Jooyung Han91df2082019-11-20 01:49:42 +09005008 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005009 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005010}
Jiyong Park67882562019-03-21 01:11:21 +09005011
Jooyung Han580eb4f2020-06-24 19:33:06 +09005012func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005013 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005014 apex {
5015 name: "myapex",
5016 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005017 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005018 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005019
Jooyung Han580eb4f2020-06-24 19:33:06 +09005020 apex_key {
5021 name: "myapex.key",
5022 public_key: "testkey.avbpubkey",
5023 private_key: "testkey.pem",
5024 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005025 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005026 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005027 rule := module.Output("file_contexts")
5028 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5029}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005030
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005032 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005033 apex {
5034 name: "myapex",
5035 key: "myapex.key",
5036 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005037 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005038 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005039
Jooyung Han580eb4f2020-06-24 19:33:06 +09005040 apex_key {
5041 name: "myapex.key",
5042 public_key: "testkey.avbpubkey",
5043 private_key: "testkey.pem",
5044 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005045 `, withFiles(map[string][]byte{
5046 "my_own_file_contexts": nil,
5047 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005048}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005049
Jooyung Han580eb4f2020-06-24 19:33:06 +09005050func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09005051 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052 apex {
5053 name: "myapex",
5054 key: "myapex.key",
5055 product_specific: true,
5056 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005057 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005058 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005059
Jooyung Han580eb4f2020-06-24 19:33:06 +09005060 apex_key {
5061 name: "myapex.key",
5062 public_key: "testkey.avbpubkey",
5063 private_key: "testkey.pem",
5064 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005065 `)
5066
Colin Cross1c460562021-02-16 17:55:47 -08005067 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005068 apex {
5069 name: "myapex",
5070 key: "myapex.key",
5071 product_specific: true,
5072 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005073 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076 apex_key {
5077 name: "myapex.key",
5078 public_key: "testkey.avbpubkey",
5079 private_key: "testkey.pem",
5080 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005081 `, withFiles(map[string][]byte{
5082 "product_specific_file_contexts": nil,
5083 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005084 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 rule := module.Output("file_contexts")
5086 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5087}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005088
Jooyung Han580eb4f2020-06-24 19:33:06 +09005089func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005090 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005091 apex {
5092 name: "myapex",
5093 key: "myapex.key",
5094 product_specific: true,
5095 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005096 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005097 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005098
Jooyung Han580eb4f2020-06-24 19:33:06 +09005099 apex_key {
5100 name: "myapex.key",
5101 public_key: "testkey.avbpubkey",
5102 private_key: "testkey.pem",
5103 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005104
Jooyung Han580eb4f2020-06-24 19:33:06 +09005105 filegroup {
5106 name: "my-file-contexts",
5107 srcs: ["product_specific_file_contexts"],
5108 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005109 `, withFiles(map[string][]byte{
5110 "product_specific_file_contexts": nil,
5111 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005113 rule := module.Output("file_contexts")
5114 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005115}
5116
Jiyong Park67882562019-03-21 01:11:21 +09005117func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005118 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005119 apex_key {
5120 name: "myapex.key",
5121 public_key: ":my.avbpubkey",
5122 private_key: ":my.pem",
5123 product_specific: true,
5124 }
5125
5126 filegroup {
5127 name: "my.avbpubkey",
5128 srcs: ["testkey2.avbpubkey"],
5129 }
5130
5131 filegroup {
5132 name: "my.pem",
5133 srcs: ["testkey2.pem"],
5134 }
5135 `)
5136
5137 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5138 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005139 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005140 if actual_pubkey != expected_pubkey {
5141 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5142 }
5143 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005144 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005145 if actual_privkey != expected_privkey {
5146 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5147 }
5148}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005149
5150func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005151 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005152 prebuilt_apex {
5153 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005154 arch: {
5155 arm64: {
5156 src: "myapex-arm64.apex",
5157 },
5158 arm: {
5159 src: "myapex-arm.apex",
5160 },
5161 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005162 }
5163 `)
5164
Wei Li340ee8e2022-03-18 17:33:24 -07005165 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5166 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005167
Jiyong Parkc95714e2019-03-29 14:23:10 +09005168 expectedInput := "myapex-arm64.apex"
5169 if prebuilt.inputApex.String() != expectedInput {
5170 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5171 }
Wei Li340ee8e2022-03-18 17:33:24 -07005172 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5173 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5174 rule := testingModule.Rule("genProvenanceMetaData")
5175 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5176 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5177 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5178 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005179
5180 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5181 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005182}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005183
Paul Duffinc0609c62021-03-01 17:27:16 +00005184func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01005185 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005186 prebuilt_apex {
5187 name: "myapex",
5188 }
5189 `)
5190}
5191
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005192func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005193 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005194 prebuilt_apex {
5195 name: "myapex",
5196 src: "myapex-arm.apex",
5197 filename: "notmyapex.apex",
5198 }
5199 `)
5200
Wei Li340ee8e2022-03-18 17:33:24 -07005201 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5202 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005203
5204 expected := "notmyapex.apex"
5205 if p.installFilename != expected {
5206 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5207 }
Wei Li340ee8e2022-03-18 17:33:24 -07005208 rule := testingModule.Rule("genProvenanceMetaData")
5209 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5210 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5211 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5212 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005213}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005214
Samiul Islam7c02e262021-09-08 17:48:28 +01005215func TestApexSetFilenameOverride(t *testing.T) {
5216 testApex(t, `
5217 apex_set {
5218 name: "com.company.android.myapex",
5219 apex_name: "com.android.myapex",
5220 set: "company-myapex.apks",
5221 filename: "com.company.android.myapex.apex"
5222 }
5223 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5224
5225 testApex(t, `
5226 apex_set {
5227 name: "com.company.android.myapex",
5228 apex_name: "com.android.myapex",
5229 set: "company-myapex.apks",
5230 filename: "com.company.android.myapex.capex"
5231 }
5232 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5233
5234 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5235 apex_set {
5236 name: "com.company.android.myapex",
5237 apex_name: "com.android.myapex",
5238 set: "company-myapex.apks",
5239 filename: "some-random-suffix"
5240 }
5241 `)
5242}
5243
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005244func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005245 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005246 prebuilt_apex {
5247 name: "myapex.prebuilt",
5248 src: "myapex-arm.apex",
5249 overrides: [
5250 "myapex",
5251 ],
5252 }
5253 `)
5254
Wei Li340ee8e2022-03-18 17:33:24 -07005255 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5256 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005257
5258 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005259 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005260 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005261 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005262 }
Wei Li340ee8e2022-03-18 17:33:24 -07005263 rule := testingModule.Rule("genProvenanceMetaData")
5264 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5265 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5266 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5267 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005268}
5269
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005270func TestPrebuiltApexName(t *testing.T) {
5271 testApex(t, `
5272 prebuilt_apex {
5273 name: "com.company.android.myapex",
5274 apex_name: "com.android.myapex",
5275 src: "company-myapex-arm.apex",
5276 }
5277 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5278
5279 testApex(t, `
5280 apex_set {
5281 name: "com.company.android.myapex",
5282 apex_name: "com.android.myapex",
5283 set: "company-myapex.apks",
5284 }
5285 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5286}
5287
5288func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
5289 _ = android.GroupFixturePreparers(
5290 java.PrepareForTestWithJavaDefaultModules,
5291 PrepareForTestWithApexBuildComponents,
5292 android.FixtureWithRootAndroidBp(`
5293 platform_bootclasspath {
5294 name: "platform-bootclasspath",
5295 fragments: [
5296 {
5297 apex: "com.android.art",
5298 module: "art-bootclasspath-fragment",
5299 },
5300 ],
5301 }
5302
5303 prebuilt_apex {
5304 name: "com.company.android.art",
5305 apex_name: "com.android.art",
5306 src: "com.company.android.art-arm.apex",
5307 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5308 }
5309
5310 prebuilt_bootclasspath_fragment {
5311 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005312 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005313 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005314 hidden_api: {
5315 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5316 metadata: "my-bootclasspath-fragment/metadata.csv",
5317 index: "my-bootclasspath-fragment/index.csv",
5318 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5319 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5320 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005321 }
5322
5323 java_import {
5324 name: "core-oj",
5325 jars: ["prebuilt.jar"],
5326 }
5327 `),
5328 ).RunTest(t)
5329}
5330
Paul Duffin092153d2021-01-26 11:42:39 +00005331// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
5332// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00005333func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01005334 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00005335
Paul Duffin89886cb2021-02-05 16:44:03 +00005336 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005337 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005338 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08005339 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005340 dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00005341 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09005342 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
5343 ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
5344 android.NormalizePathForTesting(dexJarBuildPath))
5345 }
5346
5347 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005348 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09005349 // Make sure the import has been given the correct path to the dex jar.
5350 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
5351 dexJarBuildPath := p.DexJarInstallPath()
5352 stem := android.RemoveOptionalPrebuiltPrefix(name)
5353 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
5354 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
5355 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00005356 }
5357
Paul Duffin39853512021-02-26 11:09:39 +00005358 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01005359 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00005360 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09005361 android.AssertArrayString(t, "Check if there is no source variant",
5362 []string{"android_common"},
5363 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00005364 }
5365
5366 t.Run("prebuilt only", func(t *testing.T) {
5367 bp := `
5368 prebuilt_apex {
5369 name: "myapex",
5370 arch: {
5371 arm64: {
5372 src: "myapex-arm64.apex",
5373 },
5374 arm: {
5375 src: "myapex-arm.apex",
5376 },
5377 },
Paul Duffin39853512021-02-26 11:09:39 +00005378 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005379 }
5380
5381 java_import {
5382 name: "libfoo",
5383 jars: ["libfoo.jar"],
5384 }
Paul Duffin39853512021-02-26 11:09:39 +00005385
5386 java_sdk_library_import {
5387 name: "libbar",
5388 public: {
5389 jars: ["libbar.jar"],
5390 },
5391 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005392 `
5393
5394 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5395 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5396
Martin Stjernholm44825602021-09-17 01:44:12 +01005397 deapexerName := deapexerModuleName("myapex")
5398 android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
5399
Paul Duffinf6932af2021-02-26 18:21:56 +00005400 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01005401 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00005402 rule := deapexer.Rule("deapexer")
5403 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
5404 t.Errorf("expected: %q, found: %q", expected, actual)
5405 }
5406
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005407 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01005408 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00005409 rule = prebuiltApex.Rule("android/soong/android.Cp")
5410 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
5411 t.Errorf("expected: %q, found: %q", expected, actual)
5412 }
5413
Paul Duffin89886cb2021-02-05 16:44:03 +00005414 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005415 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005416
5417 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005418 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005419 })
5420
5421 t.Run("prebuilt with source preferred", func(t *testing.T) {
5422
5423 bp := `
5424 prebuilt_apex {
5425 name: "myapex",
5426 arch: {
5427 arm64: {
5428 src: "myapex-arm64.apex",
5429 },
5430 arm: {
5431 src: "myapex-arm.apex",
5432 },
5433 },
Paul Duffin39853512021-02-26 11:09:39 +00005434 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005435 }
5436
5437 java_import {
5438 name: "libfoo",
5439 jars: ["libfoo.jar"],
5440 }
5441
5442 java_library {
5443 name: "libfoo",
5444 }
Paul Duffin39853512021-02-26 11:09:39 +00005445
5446 java_sdk_library_import {
5447 name: "libbar",
5448 public: {
5449 jars: ["libbar.jar"],
5450 },
5451 }
5452
5453 java_sdk_library {
5454 name: "libbar",
5455 srcs: ["foo/bar/MyClass.java"],
5456 unsafe_ignore_missing_latest_api: true,
5457 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005458 `
5459
5460 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5461 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5462
Paul Duffin89886cb2021-02-05 16:44:03 +00005463 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005464 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005465 ensureNoSourceVariant(t, ctx, "libfoo")
5466
5467 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005468 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005469 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005470 })
5471
5472 t.Run("prebuilt preferred with source", func(t *testing.T) {
5473 bp := `
5474 prebuilt_apex {
5475 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005476 arch: {
5477 arm64: {
5478 src: "myapex-arm64.apex",
5479 },
5480 arm: {
5481 src: "myapex-arm.apex",
5482 },
5483 },
Paul Duffin39853512021-02-26 11:09:39 +00005484 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005485 }
5486
5487 java_import {
5488 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005489 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005490 jars: ["libfoo.jar"],
5491 }
5492
5493 java_library {
5494 name: "libfoo",
5495 }
Paul Duffin39853512021-02-26 11:09:39 +00005496
5497 java_sdk_library_import {
5498 name: "libbar",
5499 prefer: true,
5500 public: {
5501 jars: ["libbar.jar"],
5502 },
5503 }
5504
5505 java_sdk_library {
5506 name: "libbar",
5507 srcs: ["foo/bar/MyClass.java"],
5508 unsafe_ignore_missing_latest_api: true,
5509 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005510 `
5511
5512 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5513 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5514
Paul Duffin89886cb2021-02-05 16:44:03 +00005515 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005516 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005517 ensureNoSourceVariant(t, ctx, "libfoo")
5518
5519 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005520 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005521 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005522 })
5523}
5524
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005526 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005527 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005528 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5529 // is disabled.
5530 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
5531 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005532
Paul Duffin37856732021-02-26 14:24:15 +00005533 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5534 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005535 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005536 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005537 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005538 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005539 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005540 foundLibfooJar = true
5541 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005542 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005543 }
5544 }
5545 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005546 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 +00005547 }
5548 }
5549
Paul Duffin40a3f652021-07-19 13:11:24 +01005550 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005551 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005552 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005553 var rule android.TestingBuildParams
5554
5555 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5556 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005557 }
5558
Paul Duffin40a3f652021-07-19 13:11:24 +01005559 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5560 t.Helper()
5561 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5562 var rule android.TestingBuildParams
5563
5564 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5565 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5566 }
5567
Paul Duffin89f570a2021-06-16 01:42:33 +01005568 fragment := java.ApexVariantReference{
5569 Apex: proptools.StringPtr("myapex"),
5570 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5571 }
5572
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 t.Run("prebuilt only", func(t *testing.T) {
5574 bp := `
5575 prebuilt_apex {
5576 name: "myapex",
5577 arch: {
5578 arm64: {
5579 src: "myapex-arm64.apex",
5580 },
5581 arm: {
5582 src: "myapex-arm.apex",
5583 },
5584 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005585 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5586 }
5587
5588 prebuilt_bootclasspath_fragment {
5589 name: "my-bootclasspath-fragment",
5590 contents: ["libfoo", "libbar"],
5591 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005592 hidden_api: {
5593 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5594 metadata: "my-bootclasspath-fragment/metadata.csv",
5595 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005596 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5597 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5598 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005599 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005600 }
5601
5602 java_import {
5603 name: "libfoo",
5604 jars: ["libfoo.jar"],
5605 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005606 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 }
Paul Duffin37856732021-02-26 14:24:15 +00005608
5609 java_sdk_library_import {
5610 name: "libbar",
5611 public: {
5612 jars: ["libbar.jar"],
5613 },
5614 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005615 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005616 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005617 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618 `
5619
Paul Duffin89f570a2021-06-16 01:42:33 +01005620 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005621 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5622 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005623
Paul Duffin537ea3d2021-05-14 10:38:00 +01005624 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005625 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005626 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005627 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005628 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005629 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 +01005630 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631 })
5632
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005633 t.Run("apex_set only", func(t *testing.T) {
5634 bp := `
5635 apex_set {
5636 name: "myapex",
5637 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005638 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005639 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005640 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5641 }
5642
5643 java_import {
5644 name: "myjavalib",
5645 jars: ["myjavalib.jar"],
5646 apex_available: ["myapex"],
5647 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005648 }
5649
5650 prebuilt_bootclasspath_fragment {
5651 name: "my-bootclasspath-fragment",
5652 contents: ["libfoo", "libbar"],
5653 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005654 hidden_api: {
5655 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5656 metadata: "my-bootclasspath-fragment/metadata.csv",
5657 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005658 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5659 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5660 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005661 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005662 }
5663
Liz Kammer2dc72442023-04-20 10:10:48 -04005664 prebuilt_systemserverclasspath_fragment {
5665 name: "my-systemserverclasspath-fragment",
5666 contents: ["libbaz"],
5667 apex_available: ["myapex"],
5668 }
5669
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005670 java_import {
5671 name: "libfoo",
5672 jars: ["libfoo.jar"],
5673 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005674 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005675 }
5676
5677 java_sdk_library_import {
5678 name: "libbar",
5679 public: {
5680 jars: ["libbar.jar"],
5681 },
5682 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005683 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005684 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005685 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005686
5687 java_sdk_library_import {
5688 name: "libbaz",
5689 public: {
5690 jars: ["libbaz.jar"],
5691 },
5692 apex_available: ["myapex"],
5693 shared_library: false,
5694 permitted_packages: ["baz"],
5695 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005696 `
5697
Paul Duffin89f570a2021-06-16 01:42:33 +01005698 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005699 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5700 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
5701
Paul Duffin537ea3d2021-05-14 10:38:00 +01005702 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005703 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005704 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005705 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005706 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005707 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 +01005708 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005709
5710 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5711
5712 overrideNames := []string{
5713 "",
5714 "myjavalib.myapex",
5715 "libfoo.myapex",
5716 "libbar.myapex",
5717 "libbaz.myapex",
5718 }
5719 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5720 for i, e := range mkEntries {
5721 g := e.OverrideName
5722 if w := overrideNames[i]; w != g {
5723 t.Errorf("Expected override name %q, got %q", w, g)
5724 }
5725 }
5726
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005727 })
5728
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005729 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5730 bp := `
5731 prebuilt_apex {
5732 name: "myapex",
5733 arch: {
5734 arm64: {
5735 src: "myapex-arm64.apex",
5736 },
5737 arm: {
5738 src: "myapex-arm.apex",
5739 },
5740 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005741 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5742 }
5743
5744 prebuilt_bootclasspath_fragment {
5745 name: "my-bootclasspath-fragment",
5746 contents: ["libfoo", "libbar"],
5747 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005748 hidden_api: {
5749 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5750 metadata: "my-bootclasspath-fragment/metadata.csv",
5751 index: "my-bootclasspath-fragment/index.csv",
5752 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5753 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5754 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005755 }
5756
5757 java_import {
5758 name: "libfoo",
5759 jars: ["libfoo.jar"],
5760 apex_available: ["myapex"],
5761 }
5762
5763 java_library {
5764 name: "libfoo",
5765 srcs: ["foo/bar/MyClass.java"],
5766 apex_available: ["myapex"],
5767 }
Paul Duffin37856732021-02-26 14:24:15 +00005768
5769 java_sdk_library_import {
5770 name: "libbar",
5771 public: {
5772 jars: ["libbar.jar"],
5773 },
5774 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005775 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005776 }
5777
5778 java_sdk_library {
5779 name: "libbar",
5780 srcs: ["foo/bar/MyClass.java"],
5781 unsafe_ignore_missing_latest_api: true,
5782 apex_available: ["myapex"],
5783 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005784 `
5785
5786 // In this test the source (java_library) libfoo is active since the
5787 // prebuilt (java_import) defaults to prefer:false. However the
5788 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5789 // find the dex boot jar in it. We either need to disable the source libfoo
5790 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005791 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005792 // dexbootjar check is skipped if AllowMissingDependencies is true
5793 preparerAllowMissingDeps := android.GroupFixturePreparers(
5794 preparer,
5795 android.PrepareForTestWithAllowMissingDependencies,
5796 )
5797 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005798 })
5799
5800 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5801 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005802 apex {
5803 name: "myapex",
5804 key: "myapex.key",
5805 updatable: false,
5806 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5807 }
5808
5809 apex_key {
5810 name: "myapex.key",
5811 public_key: "testkey.avbpubkey",
5812 private_key: "testkey.pem",
5813 }
5814
5815 bootclasspath_fragment {
5816 name: "my-bootclasspath-fragment",
5817 contents: ["libfoo", "libbar"],
5818 apex_available: ["myapex"],
5819 hidden_api: {
5820 split_packages: ["*"],
5821 },
5822 }
5823
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005824 prebuilt_apex {
5825 name: "myapex",
5826 arch: {
5827 arm64: {
5828 src: "myapex-arm64.apex",
5829 },
5830 arm: {
5831 src: "myapex-arm.apex",
5832 },
5833 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005834 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5835 }
5836
5837 prebuilt_bootclasspath_fragment {
5838 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005839 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005840 contents: ["libfoo", "libbar"],
5841 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005842 hidden_api: {
5843 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5844 metadata: "my-bootclasspath-fragment/metadata.csv",
5845 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005846 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5847 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5848 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005849 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005850 }
5851
5852 java_import {
5853 name: "libfoo",
5854 prefer: true,
5855 jars: ["libfoo.jar"],
5856 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005857 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005858 }
5859
5860 java_library {
5861 name: "libfoo",
5862 srcs: ["foo/bar/MyClass.java"],
5863 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005864 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005865 }
Paul Duffin37856732021-02-26 14:24:15 +00005866
5867 java_sdk_library_import {
5868 name: "libbar",
5869 prefer: true,
5870 public: {
5871 jars: ["libbar.jar"],
5872 },
5873 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005874 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005875 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005876 }
5877
5878 java_sdk_library {
5879 name: "libbar",
5880 srcs: ["foo/bar/MyClass.java"],
5881 unsafe_ignore_missing_latest_api: true,
5882 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005883 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005884 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005885 `
5886
Paul Duffin89f570a2021-06-16 01:42:33 +01005887 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01005888 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5889 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005890
Paul Duffin537ea3d2021-05-14 10:38:00 +01005891 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005892 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005893 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005894 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005895 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005896 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 +01005897 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005898 })
5899
5900 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5901 bp := `
5902 apex {
5903 name: "myapex",
5904 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005905 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005906 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005907 }
5908
5909 apex_key {
5910 name: "myapex.key",
5911 public_key: "testkey.avbpubkey",
5912 private_key: "testkey.pem",
5913 }
5914
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005915 bootclasspath_fragment {
5916 name: "my-bootclasspath-fragment",
5917 contents: ["libfoo", "libbar"],
5918 apex_available: ["myapex"],
5919 hidden_api: {
5920 split_packages: ["*"],
5921 },
5922 }
5923
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005924 prebuilt_apex {
5925 name: "myapex",
5926 arch: {
5927 arm64: {
5928 src: "myapex-arm64.apex",
5929 },
5930 arm: {
5931 src: "myapex-arm.apex",
5932 },
5933 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005934 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5935 }
5936
5937 prebuilt_bootclasspath_fragment {
5938 name: "my-bootclasspath-fragment",
5939 contents: ["libfoo", "libbar"],
5940 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005941 hidden_api: {
5942 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5943 metadata: "my-bootclasspath-fragment/metadata.csv",
5944 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005945 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5946 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5947 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005948 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005949 }
5950
5951 java_import {
5952 name: "libfoo",
5953 jars: ["libfoo.jar"],
5954 apex_available: ["myapex"],
5955 }
5956
5957 java_library {
5958 name: "libfoo",
5959 srcs: ["foo/bar/MyClass.java"],
5960 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005961 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005962 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005963 }
Paul Duffin37856732021-02-26 14:24:15 +00005964
5965 java_sdk_library_import {
5966 name: "libbar",
5967 public: {
5968 jars: ["libbar.jar"],
5969 },
5970 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005971 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005972 }
5973
5974 java_sdk_library {
5975 name: "libbar",
5976 srcs: ["foo/bar/MyClass.java"],
5977 unsafe_ignore_missing_latest_api: true,
5978 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005979 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005980 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005981 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005982 `
5983
Paul Duffin89f570a2021-06-16 01:42:33 +01005984 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005985 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5986 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 +00005987
Paul Duffin537ea3d2021-05-14 10:38:00 +01005988 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01005989 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01005990 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5991 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005992 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5993 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 +01005994 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005995 })
5996
5997 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5998 bp := `
5999 apex {
6000 name: "myapex",
6001 enabled: false,
6002 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006003 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006004 }
6005
6006 apex_key {
6007 name: "myapex.key",
6008 public_key: "testkey.avbpubkey",
6009 private_key: "testkey.pem",
6010 }
6011
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006012 bootclasspath_fragment {
6013 name: "my-bootclasspath-fragment",
6014 enabled: false,
6015 contents: ["libfoo", "libbar"],
6016 apex_available: ["myapex"],
6017 hidden_api: {
6018 split_packages: ["*"],
6019 },
6020 }
6021
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006022 prebuilt_apex {
6023 name: "myapex",
6024 arch: {
6025 arm64: {
6026 src: "myapex-arm64.apex",
6027 },
6028 arm: {
6029 src: "myapex-arm.apex",
6030 },
6031 },
Paul Duffin89f570a2021-06-16 01:42:33 +01006032 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6033 }
6034
6035 prebuilt_bootclasspath_fragment {
6036 name: "my-bootclasspath-fragment",
6037 contents: ["libfoo", "libbar"],
6038 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01006039 hidden_api: {
6040 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6041 metadata: "my-bootclasspath-fragment/metadata.csv",
6042 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01006043 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
6044 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
6045 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006046 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006047 }
6048
6049 java_import {
6050 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006051 jars: ["libfoo.jar"],
6052 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006053 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006054 }
6055
6056 java_library {
6057 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006058 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006059 srcs: ["foo/bar/MyClass.java"],
6060 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006061 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006062 }
Paul Duffin37856732021-02-26 14:24:15 +00006063
6064 java_sdk_library_import {
6065 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006066 public: {
6067 jars: ["libbar.jar"],
6068 },
6069 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006070 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006071 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00006072 }
6073
6074 java_sdk_library {
6075 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006076 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00006077 srcs: ["foo/bar/MyClass.java"],
6078 unsafe_ignore_missing_latest_api: true,
6079 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006080 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006081 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006082 `
6083
Paul Duffin89f570a2021-06-16 01:42:33 +01006084 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin55607122021-03-30 23:32:51 +01006085 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
6086 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00006087
Paul Duffin537ea3d2021-05-14 10:38:00 +01006088 // Verify the correct module jars contribute to the hiddenapi index file.
Paul Duffin54e41972021-07-19 13:23:40 +01006089 checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
Paul Duffin40a3f652021-07-19 13:11:24 +01006090 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006091 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006092 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006093 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 +01006094 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006095 })
6096}
6097
Roland Levillain630846d2019-06-26 12:48:34 +01006098func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006099 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006100 apex_test {
6101 name: "myapex",
6102 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006103 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006104 tests: [
6105 "mytest",
Roland Levillain9b5fde92019-06-28 15:41:19 +01006106 "mytests",
Roland Levillain630846d2019-06-26 12:48:34 +01006107 ],
6108 }
6109
6110 apex_key {
6111 name: "myapex.key",
6112 public_key: "testkey.avbpubkey",
6113 private_key: "testkey.pem",
6114 }
6115
Liz Kammer1c14a212020-05-12 15:26:55 -07006116 filegroup {
6117 name: "fg",
6118 srcs: [
6119 "baz",
6120 "bar/baz"
6121 ],
6122 }
6123
Roland Levillain630846d2019-06-26 12:48:34 +01006124 cc_test {
6125 name: "mytest",
6126 gtest: false,
6127 srcs: ["mytest.cpp"],
6128 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006129 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006130 system_shared_libs: [],
6131 static_executable: true,
6132 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006133 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006134 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006135
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006136 cc_library {
6137 name: "mylib",
6138 srcs: ["mylib.cpp"],
6139 system_shared_libs: [],
6140 stl: "none",
6141 }
6142
Liz Kammer5bd365f2020-05-27 15:15:11 -07006143 filegroup {
6144 name: "fg2",
6145 srcs: [
6146 "testdata/baz"
6147 ],
6148 }
6149
Roland Levillain9b5fde92019-06-28 15:41:19 +01006150 cc_test {
6151 name: "mytests",
6152 gtest: false,
6153 srcs: [
6154 "mytest1.cpp",
6155 "mytest2.cpp",
6156 "mytest3.cpp",
6157 ],
6158 test_per_src: true,
6159 relative_install_path: "test",
6160 system_shared_libs: [],
6161 static_executable: true,
6162 stl: "none",
Liz Kammer5bd365f2020-05-27 15:15:11 -07006163 data: [
6164 ":fg",
6165 ":fg2",
6166 ],
Roland Levillain9b5fde92019-06-28 15:41:19 +01006167 }
Roland Levillain630846d2019-06-26 12:48:34 +01006168 `)
6169
Jooyung Hana0503a52023-08-23 13:12:50 +09006170 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006171 copyCmds := apexRule.Args["copy_commands"]
6172
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006173 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006174 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006175 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006176
Liz Kammer1c14a212020-05-12 15:26:55 -07006177 //Ensure that test data are copied into apex.
6178 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6179 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6180
Roland Levillain9b5fde92019-06-28 15:41:19 +01006181 // Ensure that test deps built with `test_per_src` are copied into apex.
6182 ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
6183 ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
6184 ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
Roland Levillainf89cd092019-07-29 16:22:59 +01006185
6186 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006187 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006188 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006189 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006190 prefix := "TARGET_"
6191 var builder strings.Builder
6192 data.Custom(&builder, name, prefix, "", data)
6193 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006194 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
6195 ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
6196 ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
6197 ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006198 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006199}
6200
Jooyung Hand48f3c32019-08-23 11:18:57 +09006201func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
6202 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6203 apex {
6204 name: "myapex",
6205 key: "myapex.key",
6206 native_shared_libs: ["libfoo"],
6207 }
6208
6209 apex_key {
6210 name: "myapex.key",
6211 public_key: "testkey.avbpubkey",
6212 private_key: "testkey.pem",
6213 }
6214
6215 cc_library {
6216 name: "libfoo",
6217 stl: "none",
6218 system_shared_libs: [],
6219 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006220 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006221 }
6222 `)
6223 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6224 apex {
6225 name: "myapex",
6226 key: "myapex.key",
6227 java_libs: ["myjar"],
6228 }
6229
6230 apex_key {
6231 name: "myapex.key",
6232 public_key: "testkey.avbpubkey",
6233 private_key: "testkey.pem",
6234 }
6235
6236 java_library {
6237 name: "myjar",
6238 srcs: ["foo/bar/MyClass.java"],
6239 sdk_version: "none",
6240 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006241 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006242 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006243 }
6244 `)
6245}
6246
Bill Peckhama41a6962021-01-11 10:58:54 -08006247func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006248 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006249 apex {
6250 name: "myapex",
6251 key: "myapex.key",
6252 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006253 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006254 }
6255
6256 apex_key {
6257 name: "myapex.key",
6258 public_key: "testkey.avbpubkey",
6259 private_key: "testkey.pem",
6260 }
6261
6262 java_import {
6263 name: "myjavaimport",
6264 apex_available: ["myapex"],
6265 jars: ["my.jar"],
6266 compile_dex: true,
6267 }
6268 `)
6269
Jooyung Hana0503a52023-08-23 13:12:50 +09006270 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006271 apexRule := module.Rule("apexRule")
6272 copyCmds := apexRule.Args["copy_commands"]
6273 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6274}
6275
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006276func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006277 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006278 apex {
6279 name: "myapex",
6280 key: "myapex.key",
6281 apps: [
6282 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006283 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006284 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006285 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006286 }
6287
6288 apex_key {
6289 name: "myapex.key",
6290 public_key: "testkey.avbpubkey",
6291 private_key: "testkey.pem",
6292 }
6293
6294 android_app {
6295 name: "AppFoo",
6296 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006297 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006298 system_modules: "none",
Jiyong Park8be103b2019-11-08 15:53:48 +09006299 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006300 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006301 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006302 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006303
6304 android_app {
6305 name: "AppFooPriv",
6306 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006307 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006308 system_modules: "none",
6309 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006310 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006311 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006312 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006313 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006314
6315 cc_library_shared {
6316 name: "libjni",
6317 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006318 shared_libs: ["libfoo"],
6319 stl: "none",
6320 system_shared_libs: [],
6321 apex_available: [ "myapex" ],
6322 sdk_version: "current",
6323 }
6324
6325 cc_library_shared {
6326 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006327 stl: "none",
6328 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006329 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006330 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006331 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006332 `)
6333
Jooyung Hana0503a52023-08-23 13:12:50 +09006334 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006335 apexRule := module.Rule("apexRule")
6336 copyCmds := apexRule.Args["copy_commands"]
6337
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006338 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6339 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006340 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006341
Colin Crossaede88c2020-08-11 12:17:01 -07006342 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006343 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006344 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006345 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006346 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006347 // JNI libraries including transitive deps are
6348 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006349 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006350 // ... embedded inside APK (jnilibs.zip)
6351 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6352 // ... and not directly inside the APEX
6353 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6354 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006355
6356 apexBundle := module.Module().(*apexBundle)
6357 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6358 var builder strings.Builder
6359 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6360 androidMk := builder.String()
6361 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6362 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6363 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6364 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6365 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6366 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 +01006367}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006368
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006369func TestApexWithAppImportBuildId(t *testing.T) {
6370 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6371 for _, id := range invalidBuildIds {
6372 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6373 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6374 variables.BuildId = proptools.StringPtr(id)
6375 })
6376 testApexError(t, message, `apex {
6377 name: "myapex",
6378 key: "myapex.key",
6379 apps: ["AppFooPrebuilt"],
6380 updatable: false,
6381 }
6382
6383 apex_key {
6384 name: "myapex.key",
6385 public_key: "testkey.avbpubkey",
6386 private_key: "testkey.pem",
6387 }
6388
6389 android_app_import {
6390 name: "AppFooPrebuilt",
6391 apk: "PrebuiltAppFoo.apk",
6392 presigned: true,
6393 apex_available: ["myapex"],
6394 }
6395 `, fixture)
6396 }
6397}
6398
Dario Frenicde2a032019-10-27 00:29:22 +01006399func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006400 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006401 apex {
6402 name: "myapex",
6403 key: "myapex.key",
6404 apps: [
6405 "AppFooPrebuilt",
6406 "AppFooPrivPrebuilt",
6407 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006408 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006409 }
6410
6411 apex_key {
6412 name: "myapex.key",
6413 public_key: "testkey.avbpubkey",
6414 private_key: "testkey.pem",
6415 }
6416
6417 android_app_import {
6418 name: "AppFooPrebuilt",
6419 apk: "PrebuiltAppFoo.apk",
6420 presigned: true,
6421 dex_preopt: {
6422 enabled: false,
6423 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006424 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006425 }
6426
6427 android_app_import {
6428 name: "AppFooPrivPrebuilt",
6429 apk: "PrebuiltAppFooPriv.apk",
6430 privileged: true,
6431 presigned: true,
6432 dex_preopt: {
6433 enabled: false,
6434 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006435 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006436 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006437 }
6438 `)
6439
Jooyung Hana0503a52023-08-23 13:12:50 +09006440 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006441 apexRule := module.Rule("apexRule")
6442 copyCmds := apexRule.Args["copy_commands"]
6443
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006444 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6445 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006446}
6447
6448func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006449 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006450 apex {
6451 name: "myapex",
6452 key: "myapex.key",
6453 apps: [
6454 "AppFoo",
6455 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006456 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006457 }
6458
6459 apex_key {
6460 name: "myapex.key",
6461 public_key: "testkey.avbpubkey",
6462 private_key: "testkey.pem",
6463 }
6464
6465 android_app {
6466 name: "AppFoo",
6467 srcs: ["foo/bar/MyClass.java"],
6468 sdk_version: "none",
6469 system_modules: "none",
6470 apex_available: [ "myapex" ],
6471 }
6472
6473 android_app_import {
6474 name: "AppFoo",
6475 apk: "AppFooPrebuilt.apk",
6476 filename: "AppFooPrebuilt.apk",
6477 presigned: true,
6478 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006479 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006480 }
6481 `, withFiles(map[string][]byte{
6482 "AppFooPrebuilt.apk": nil,
6483 }))
6484
Jooyung Hana0503a52023-08-23 13:12:50 +09006485 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006486 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006487 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006488}
6489
Dario Freni6f3937c2019-12-20 22:58:03 +00006490func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006491 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006492 apex {
6493 name: "myapex",
6494 key: "myapex.key",
6495 apps: [
6496 "TesterHelpAppFoo",
6497 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006498 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006499 }
6500
6501 apex_key {
6502 name: "myapex.key",
6503 public_key: "testkey.avbpubkey",
6504 private_key: "testkey.pem",
6505 }
6506
6507 android_test_helper_app {
6508 name: "TesterHelpAppFoo",
6509 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006510 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006511 }
6512
6513 `)
6514
Jooyung Hana0503a52023-08-23 13:12:50 +09006515 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006516 apexRule := module.Rule("apexRule")
6517 copyCmds := apexRule.Args["copy_commands"]
6518
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006519 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006520}
6521
Jooyung Han18020ea2019-11-13 10:50:48 +09006522func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6523 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006524 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006525 apex {
6526 name: "myapex",
6527 key: "myapex.key",
6528 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006529 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006530 }
6531
6532 apex_key {
6533 name: "myapex.key",
6534 public_key: "testkey.avbpubkey",
6535 private_key: "testkey.pem",
6536 }
6537
6538 apex {
6539 name: "otherapex",
6540 key: "myapex.key",
6541 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006542 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006543 }
6544
6545 cc_defaults {
6546 name: "libfoo-defaults",
6547 apex_available: ["otherapex"],
6548 }
6549
6550 cc_library {
6551 name: "libfoo",
6552 defaults: ["libfoo-defaults"],
6553 stl: "none",
6554 system_shared_libs: [],
6555 }`)
6556}
6557
Paul Duffine52e66f2020-03-30 17:54:29 +01006558func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006560 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006561 apex {
6562 name: "myapex",
6563 key: "myapex.key",
6564 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006565 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006566 }
6567
6568 apex_key {
6569 name: "myapex.key",
6570 public_key: "testkey.avbpubkey",
6571 private_key: "testkey.pem",
6572 }
6573
6574 apex {
6575 name: "otherapex",
6576 key: "otherapex.key",
6577 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006578 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006579 }
6580
6581 apex_key {
6582 name: "otherapex.key",
6583 public_key: "testkey.avbpubkey",
6584 private_key: "testkey.pem",
6585 }
6586
6587 cc_library {
6588 name: "libfoo",
6589 stl: "none",
6590 system_shared_libs: [],
6591 apex_available: ["otherapex"],
6592 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006593}
Jiyong Park127b40b2019-09-30 16:04:35 +09006594
Paul Duffine52e66f2020-03-30 17:54:29 +01006595func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006596 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006597 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006598.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006599.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006600.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006601.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006602.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006603.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006604 apex {
6605 name: "myapex",
6606 key: "myapex.key",
6607 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006608 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006609 }
6610
6611 apex_key {
6612 name: "myapex.key",
6613 public_key: "testkey.avbpubkey",
6614 private_key: "testkey.pem",
6615 }
6616
Jiyong Park127b40b2019-09-30 16:04:35 +09006617 cc_library {
6618 name: "libfoo",
6619 stl: "none",
6620 shared_libs: ["libbar"],
6621 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006622 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006623 }
6624
6625 cc_library {
6626 name: "libbar",
6627 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006628 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006629 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006630 apex_available: ["myapex"],
6631 }
6632
6633 cc_library {
6634 name: "libbaz",
6635 stl: "none",
6636 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006637 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006638}
Jiyong Park127b40b2019-09-30 16:04:35 +09006639
Liz Kammer5f108fa2023-05-11 14:33:17 -04006640func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6641 testApex(t, `
6642 apex {
6643 name: "myapex",
6644 key: "myapex.key",
6645 native_shared_libs: ["libfoo"],
6646 updatable: false,
6647 }
6648
6649 apex_key {
6650 name: "myapex.key",
6651 public_key: "testkey.avbpubkey",
6652 private_key: "testkey.pem",
6653 }
6654
6655 cc_library {
6656 name: "libfoo",
6657 stl: "none",
6658 static_libs: ["libbar"],
6659 system_shared_libs: [],
6660 apex_available: ["myapex"],
6661 }
6662
6663 cc_library {
6664 name: "libbar",
6665 stl: "none",
6666 shared_libs: ["libbaz"],
6667 system_shared_libs: [],
6668 apex_available: ["myapex"],
6669 }
6670
6671 cc_library {
6672 name: "libbaz",
6673 stl: "none",
6674 system_shared_libs: [],
6675 }`)
6676
6677 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6678 apex {
6679 name: "myapex",
6680 key: "myapex.key",
6681 native_shared_libs: ["libfoo"],
6682 updatable: false,
6683 }
6684
6685 apex_key {
6686 name: "myapex.key",
6687 public_key: "testkey.avbpubkey",
6688 private_key: "testkey.pem",
6689 }
6690
6691 cc_library {
6692 name: "libfoo",
6693 stl: "none",
6694 static_libs: ["libbar"],
6695 system_shared_libs: [],
6696 apex_available: ["myapex"],
6697 }
6698
6699 cc_library {
6700 name: "libbar",
6701 stl: "none",
6702 system_shared_libs: [],
6703 }`)
6704}
6705
Paul Duffine52e66f2020-03-30 17:54:29 +01006706func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006707 testApexError(t, "\"otherapex\" is not a valid module name", `
6708 apex {
6709 name: "myapex",
6710 key: "myapex.key",
6711 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006712 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006713 }
6714
6715 apex_key {
6716 name: "myapex.key",
6717 public_key: "testkey.avbpubkey",
6718 private_key: "testkey.pem",
6719 }
6720
6721 cc_library {
6722 name: "libfoo",
6723 stl: "none",
6724 system_shared_libs: [],
6725 apex_available: ["otherapex"],
6726 }`)
6727
Paul Duffine52e66f2020-03-30 17:54:29 +01006728 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006729 apex {
6730 name: "myapex",
6731 key: "myapex.key",
6732 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006733 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006734 }
6735
6736 apex_key {
6737 name: "myapex.key",
6738 public_key: "testkey.avbpubkey",
6739 private_key: "testkey.pem",
6740 }
6741
6742 cc_library {
6743 name: "libfoo",
6744 stl: "none",
6745 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006746 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006747 apex_available: ["myapex"],
6748 }
6749
6750 cc_library {
6751 name: "libbar",
6752 stl: "none",
6753 system_shared_libs: [],
6754 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006755 }
6756
6757 cc_library {
6758 name: "libbaz",
6759 stl: "none",
6760 system_shared_libs: [],
6761 stubs: {
6762 versions: ["10", "20", "30"],
6763 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006764 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006765}
Jiyong Park127b40b2019-09-30 16:04:35 +09006766
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006767func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6768 t.Run("negative variant_version produces error", func(t *testing.T) {
6769 testApexError(t, "expected an integer between 0-9; got -1", `
6770 apex {
6771 name: "myapex",
6772 key: "myapex.key",
6773 apex_available_name: "com.android.foo",
6774 variant_version: "-1",
6775 updatable: false,
6776 }
6777 apex_key {
6778 name: "myapex.key",
6779 public_key: "testkey.avbpubkey",
6780 private_key: "testkey.pem",
6781 }
6782 `)
6783 })
6784
6785 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6786 testApexError(t, "expected an integer between 0-9; got 10", `
6787 apex {
6788 name: "myapex",
6789 key: "myapex.key",
6790 apex_available_name: "com.android.foo",
6791 variant_version: "10",
6792 updatable: false,
6793 }
6794 apex_key {
6795 name: "myapex.key",
6796 public_key: "testkey.avbpubkey",
6797 private_key: "testkey.pem",
6798 }
6799 `)
6800 })
6801}
6802
6803func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6804 context := android.GroupFixturePreparers(
6805 android.PrepareForIntegrationTestWithAndroid,
6806 PrepareForTestWithApexBuildComponents,
6807 android.FixtureMergeMockFs(android.MockFS{
6808 "system/sepolicy/apex/foo-file_contexts": nil,
6809 "system/sepolicy/apex/bar-file_contexts": nil,
6810 }),
6811 )
6812 result := context.RunTestWithBp(t, `
6813 apex {
6814 name: "foo",
6815 key: "myapex.key",
6816 apex_available_name: "com.android.foo",
6817 variant_version: "0",
6818 updatable: false,
6819 }
6820 apex {
6821 name: "bar",
6822 key: "myapex.key",
6823 apex_available_name: "com.android.foo",
6824 variant_version: "3",
6825 updatable: false,
6826 }
6827 apex_key {
6828 name: "myapex.key",
6829 public_key: "testkey.avbpubkey",
6830 private_key: "testkey.pem",
6831 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006832 override_apex {
6833 name: "myoverrideapex",
6834 base: "bar",
6835 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006836 `)
6837
Jooyung Hana0503a52023-08-23 13:12:50 +09006838 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006839 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6840 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6841 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6842 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6843 }
6844
Jooyung Hana0503a52023-08-23 13:12:50 +09006845 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006846 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6847 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6848 barActualDefaultVersion := barManifestRule.Args["default_version"]
6849 if barActualDefaultVersion != barExpectedDefaultVersion {
6850 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6851 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006852
Jooyung Hana0503a52023-08-23 13:12:50 +09006853 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_bar").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006854 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6855 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6856 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6857 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006858}
6859
Sam Delmericoca816532023-06-02 14:09:50 -04006860func TestApexAvailable_ApexAvailableName(t *testing.T) {
6861 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6862 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6863 apex {
6864 name: "myapex_sminus",
6865 key: "myapex.key",
6866 apps: ["AppFoo"],
6867 apex_available_name: "myapex",
6868 updatable: false,
6869 }
6870 apex {
6871 name: "myapex",
6872 key: "myapex.key",
6873 apps: ["AppFoo"],
6874 updatable: false,
6875 }
6876 apex_key {
6877 name: "myapex.key",
6878 public_key: "testkey.avbpubkey",
6879 private_key: "testkey.pem",
6880 }
6881 android_app {
6882 name: "AppFoo",
6883 srcs: ["foo/bar/MyClass.java"],
6884 sdk_version: "none",
6885 system_modules: "none",
6886 apex_available: [ "myapex_sminus" ],
6887 }`,
6888 android.FixtureMergeMockFs(android.MockFS{
6889 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6890 }),
6891 )
6892 })
6893
6894 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6895 testApex(t, `
6896 apex {
6897 name: "myapex_sminus",
6898 key: "myapex.key",
6899 apps: ["AppFoo"],
6900 apex_available_name: "myapex",
6901 updatable: false,
6902 }
6903 apex {
6904 name: "myapex",
6905 key: "myapex.key",
6906 apps: ["AppFoo"],
6907 updatable: false,
6908 }
6909 apex_key {
6910 name: "myapex.key",
6911 public_key: "testkey.avbpubkey",
6912 private_key: "testkey.pem",
6913 }
6914 android_app {
6915 name: "AppFoo",
6916 srcs: ["foo/bar/MyClass.java"],
6917 sdk_version: "none",
6918 system_modules: "none",
6919 apex_available: [ "myapex" ],
6920 }`,
6921 android.FixtureMergeMockFs(android.MockFS{
6922 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6923 }),
6924 )
6925 })
6926
6927 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6928 testApex(t, `
6929 override_apex {
6930 name: "myoverrideapex_sminus",
6931 base: "myapex_sminus",
6932 key: "myapex.key",
6933 apps: ["AppFooOverride"],
6934 }
6935 override_apex {
6936 name: "myoverrideapex",
6937 base: "myapex",
6938 key: "myapex.key",
6939 apps: ["AppFooOverride"],
6940 }
6941 apex {
6942 name: "myapex_sminus",
6943 key: "myapex.key",
6944 apps: ["AppFoo"],
6945 apex_available_name: "myapex",
6946 updatable: false,
6947 }
6948 apex {
6949 name: "myapex",
6950 key: "myapex.key",
6951 apps: ["AppFoo"],
6952 updatable: false,
6953 }
6954 apex_key {
6955 name: "myapex.key",
6956 public_key: "testkey.avbpubkey",
6957 private_key: "testkey.pem",
6958 }
6959 android_app {
6960 name: "AppFooOverride",
6961 srcs: ["foo/bar/MyClass.java"],
6962 sdk_version: "none",
6963 system_modules: "none",
6964 apex_available: [ "myapex" ],
6965 }
6966 android_app {
6967 name: "AppFoo",
6968 srcs: ["foo/bar/MyClass.java"],
6969 sdk_version: "none",
6970 system_modules: "none",
6971 apex_available: [ "myapex" ],
6972 }`,
6973 android.FixtureMergeMockFs(android.MockFS{
6974 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6975 }),
6976 )
6977 })
6978}
6979
6980func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6981 context := android.GroupFixturePreparers(
6982 android.PrepareForIntegrationTestWithAndroid,
6983 PrepareForTestWithApexBuildComponents,
6984 java.PrepareForTestWithDexpreopt,
6985 android.FixtureMergeMockFs(android.MockFS{
6986 "system/sepolicy/apex/myapex-file_contexts": nil,
6987 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6988 }),
6989 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6990 variables.BuildId = proptools.StringPtr("buildid")
6991 }),
6992 )
6993 context.RunTestWithBp(t, `
6994 override_apex {
6995 name: "myoverrideapex_sminus",
6996 base: "myapex_sminus",
6997 }
6998 override_apex {
6999 name: "myoverrideapex",
7000 base: "myapex",
7001 }
7002 apex {
7003 name: "myapex",
7004 key: "myapex.key",
7005 apps: ["AppFoo"],
7006 updatable: false,
7007 }
7008 apex {
7009 name: "myapex_sminus",
7010 apex_available_name: "myapex",
7011 key: "myapex.key",
7012 apps: ["AppFoo_sminus"],
7013 updatable: false,
7014 }
7015 apex_key {
7016 name: "myapex.key",
7017 public_key: "testkey.avbpubkey",
7018 private_key: "testkey.pem",
7019 }
7020 android_app {
7021 name: "AppFoo",
7022 srcs: ["foo/bar/MyClass.java"],
7023 sdk_version: "none",
7024 system_modules: "none",
7025 apex_available: [ "myapex" ],
7026 }
7027 android_app {
7028 name: "AppFoo_sminus",
7029 srcs: ["foo/bar/MyClass.java"],
7030 sdk_version: "none",
7031 min_sdk_version: "29",
7032 system_modules: "none",
7033 apex_available: [ "myapex" ],
7034 }`)
7035}
7036
Jiyong Park89e850a2020-04-07 16:37:39 +09007037func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007038 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007039 apex {
7040 name: "myapex",
7041 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007042 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007043 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007044 }
7045
7046 apex_key {
7047 name: "myapex.key",
7048 public_key: "testkey.avbpubkey",
7049 private_key: "testkey.pem",
7050 }
7051
7052 cc_library {
7053 name: "libfoo",
7054 stl: "none",
7055 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007056 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007057 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007058 }
7059
7060 cc_library {
7061 name: "libfoo2",
7062 stl: "none",
7063 system_shared_libs: [],
7064 shared_libs: ["libbaz"],
7065 apex_available: ["//apex_available:platform"],
7066 }
7067
7068 cc_library {
7069 name: "libbar",
7070 stl: "none",
7071 system_shared_libs: [],
7072 apex_available: ["myapex"],
7073 }
7074
7075 cc_library {
7076 name: "libbaz",
7077 stl: "none",
7078 system_shared_libs: [],
7079 apex_available: ["myapex"],
7080 stubs: {
7081 versions: ["1"],
7082 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007083 }`)
7084
Jiyong Park89e850a2020-04-07 16:37:39 +09007085 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7086 // because it depends on libbar which isn't available to platform
7087 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7088 if libfoo.NotAvailableForPlatform() != true {
7089 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7090 }
7091
7092 // libfoo2 however can be available to platform because it depends on libbaz which provides
7093 // stubs
7094 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7095 if libfoo2.NotAvailableForPlatform() == true {
7096 t.Errorf("%q should be available to platform", libfoo2.String())
7097 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007098}
Jiyong Parka90ca002019-10-07 15:47:24 +09007099
Paul Duffine52e66f2020-03-30 17:54:29 +01007100func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007101 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007102 apex {
7103 name: "myapex",
7104 key: "myapex.key",
7105 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007106 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007107 }
7108
7109 apex_key {
7110 name: "myapex.key",
7111 public_key: "testkey.avbpubkey",
7112 private_key: "testkey.pem",
7113 }
7114
7115 cc_library {
7116 name: "libfoo",
7117 stl: "none",
7118 system_shared_libs: [],
7119 apex_available: ["myapex"],
7120 static: {
7121 apex_available: ["//apex_available:platform"],
7122 },
7123 }`)
7124
Jiyong Park89e850a2020-04-07 16:37:39 +09007125 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7126 if libfooShared.NotAvailableForPlatform() != true {
7127 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7128 }
7129 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7130 if libfooStatic.NotAvailableForPlatform() != false {
7131 t.Errorf("%q should be available to platform", libfooStatic.String())
7132 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007133}
7134
Jiyong Park5d790c32019-11-15 18:40:32 +09007135func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007136 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007137 apex {
7138 name: "myapex",
7139 key: "myapex.key",
7140 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007141 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007142 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007143 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007144 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007145 }
7146
7147 override_apex {
7148 name: "override_myapex",
7149 base: "myapex",
7150 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007151 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007152 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007153 overrides: ["unknownapex"],
Baligh Uddin004d7172020-02-19 21:29:28 -08007154 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007155 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007156 key: "mynewapex.key",
7157 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007158 }
7159
7160 apex_key {
7161 name: "myapex.key",
7162 public_key: "testkey.avbpubkey",
7163 private_key: "testkey.pem",
7164 }
7165
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007166 apex_key {
7167 name: "mynewapex.key",
7168 public_key: "testkey2.avbpubkey",
7169 private_key: "testkey2.pem",
7170 }
7171
7172 android_app_certificate {
7173 name: "myapex.certificate",
7174 certificate: "testkey",
7175 }
7176
Jiyong Park5d790c32019-11-15 18:40:32 +09007177 android_app {
7178 name: "app",
7179 srcs: ["foo/bar/MyClass.java"],
7180 package_name: "foo",
7181 sdk_version: "none",
7182 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007183 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007184 }
7185
7186 override_android_app {
7187 name: "override_app",
7188 base: "app",
7189 package_name: "bar",
7190 }
markchien7c803b82021-08-26 22:10:06 +08007191
7192 bpf {
7193 name: "bpf",
7194 srcs: ["bpf.c"],
7195 }
7196
7197 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007198 name: "overrideBpf",
7199 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007200 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007201
7202 prebuilt_etc {
7203 name: "myetc",
7204 src: "myprebuilt",
7205 }
7206
7207 prebuilt_etc {
7208 name: "override_myetc",
7209 src: "override_myprebuilt",
7210 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007211 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007212
Jooyung Hana0503a52023-08-23 13:12:50 +09007213 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
7214 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007215 if originalVariant.GetOverriddenBy() != "" {
7216 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7217 }
7218 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7219 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7220 }
7221
Jooyung Hana0503a52023-08-23 13:12:50 +09007222 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007223 apexRule := module.Rule("apexRule")
7224 copyCmds := apexRule.Args["copy_commands"]
7225
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007226 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7227 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007228
markchien7c803b82021-08-26 22:10:06 +08007229 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007230 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007231
Daniel Norman5a3ce132021-08-26 15:44:43 -07007232 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7233 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7234
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007235 apexBundle := module.Module().(*apexBundle)
7236 name := apexBundle.Name()
7237 if name != "override_myapex" {
7238 t.Errorf("name should be \"override_myapex\", but was %q", name)
7239 }
7240
Baligh Uddin004d7172020-02-19 21:29:28 -08007241 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7242 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7243 }
7244
Jiyong Park20bacab2020-03-03 11:45:41 +09007245 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007246 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007247 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7248
7249 signApkRule := module.Rule("signapk")
7250 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007251
Colin Crossaa255532020-07-03 13:18:24 -07007252 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007253 var builder strings.Builder
7254 data.Custom(&builder, name, "TARGET_", "", data)
7255 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007256 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7257 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007258 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007259 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007260 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007261 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007262 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007263 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007264}
7265
Albert Martineefabcf2022-03-21 20:11:16 +00007266func TestMinSdkVersionOverride(t *testing.T) {
7267 // Override from 29 to 31
7268 minSdkOverride31 := "31"
7269 ctx := testApex(t, `
7270 apex {
7271 name: "myapex",
7272 key: "myapex.key",
7273 native_shared_libs: ["mylib"],
7274 updatable: true,
7275 min_sdk_version: "29"
7276 }
7277
7278 override_apex {
7279 name: "override_myapex",
7280 base: "myapex",
7281 logging_parent: "com.foo.bar",
7282 package_name: "test.overridden.package"
7283 }
7284
7285 apex_key {
7286 name: "myapex.key",
7287 public_key: "testkey.avbpubkey",
7288 private_key: "testkey.pem",
7289 }
7290
7291 cc_library {
7292 name: "mylib",
7293 srcs: ["mylib.cpp"],
7294 runtime_libs: ["libbar"],
7295 system_shared_libs: [],
7296 stl: "none",
7297 apex_available: [ "myapex" ],
7298 min_sdk_version: "apex_inherit"
7299 }
7300
7301 cc_library {
7302 name: "libbar",
7303 srcs: ["mylib.cpp"],
7304 system_shared_libs: [],
7305 stl: "none",
7306 apex_available: [ "myapex" ],
7307 min_sdk_version: "apex_inherit"
7308 }
7309
7310 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7311
Jooyung Hana0503a52023-08-23 13:12:50 +09007312 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007313 copyCmds := apexRule.Args["copy_commands"]
7314
7315 // Ensure that direct non-stubs dep is always included
7316 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7317
7318 // Ensure that runtime_libs dep in included
7319 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7320
7321 // Ensure libraries target overridden min_sdk_version value
7322 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7323}
7324
7325func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7326 // Attempt to override from 31 to 29, should be a NOOP
7327 minSdkOverride29 := "29"
7328 ctx := testApex(t, `
7329 apex {
7330 name: "myapex",
7331 key: "myapex.key",
7332 native_shared_libs: ["mylib"],
7333 updatable: true,
7334 min_sdk_version: "31"
7335 }
7336
7337 override_apex {
7338 name: "override_myapex",
7339 base: "myapex",
7340 logging_parent: "com.foo.bar",
7341 package_name: "test.overridden.package"
7342 }
7343
7344 apex_key {
7345 name: "myapex.key",
7346 public_key: "testkey.avbpubkey",
7347 private_key: "testkey.pem",
7348 }
7349
7350 cc_library {
7351 name: "mylib",
7352 srcs: ["mylib.cpp"],
7353 runtime_libs: ["libbar"],
7354 system_shared_libs: [],
7355 stl: "none",
7356 apex_available: [ "myapex" ],
7357 min_sdk_version: "apex_inherit"
7358 }
7359
7360 cc_library {
7361 name: "libbar",
7362 srcs: ["mylib.cpp"],
7363 system_shared_libs: [],
7364 stl: "none",
7365 apex_available: [ "myapex" ],
7366 min_sdk_version: "apex_inherit"
7367 }
7368
7369 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7370
Jooyung Hana0503a52023-08-23 13:12:50 +09007371 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007372 copyCmds := apexRule.Args["copy_commands"]
7373
7374 // Ensure that direct non-stubs dep is always included
7375 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7376
7377 // Ensure that runtime_libs dep in included
7378 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7379
7380 // Ensure libraries target the original min_sdk_version value rather than the overridden
7381 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7382}
7383
Jooyung Han214bf372019-11-12 13:03:50 +09007384func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007385 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007386 apex {
7387 name: "myapex",
7388 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007389 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007390 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007391 }
7392
7393 apex_key {
7394 name: "myapex.key",
7395 public_key: "testkey.avbpubkey",
7396 private_key: "testkey.pem",
7397 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007398
7399 cc_library {
7400 name: "mylib",
7401 srcs: ["mylib.cpp"],
7402 stl: "libc++",
7403 system_shared_libs: [],
7404 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007405 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007406 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007407 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007408
Jooyung Hana0503a52023-08-23 13:12:50 +09007409 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007410 args := module.Rule("apexRule").Args
7411 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007412 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007413
7414 // The copies of the libraries in the apex should have one more dependency than
7415 // the ones outside the apex, namely the unwinder. Ideally we should check
7416 // the dependency names directly here but for some reason the names are blank in
7417 // this test.
7418 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007419 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007420 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7421 if len(apexImplicits) != len(nonApexImplicits)+1 {
7422 t.Errorf("%q missing unwinder dep", lib)
7423 }
7424 }
Jooyung Han214bf372019-11-12 13:03:50 +09007425}
7426
Paul Duffine05480a2021-03-08 15:07:14 +00007427var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007428 "api/current.txt": nil,
7429 "api/removed.txt": nil,
7430 "api/system-current.txt": nil,
7431 "api/system-removed.txt": nil,
7432 "api/test-current.txt": nil,
7433 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007434
Anton Hanssondff2c782020-12-21 17:10:01 +00007435 "100/public/api/foo.txt": nil,
7436 "100/public/api/foo-removed.txt": nil,
7437 "100/system/api/foo.txt": nil,
7438 "100/system/api/foo-removed.txt": nil,
7439
Paul Duffineedc5d52020-06-12 17:46:39 +01007440 // For java_sdk_library_import
7441 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007442}
7443
Jooyung Han58f26ab2019-12-18 15:34:32 +09007444func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007445 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007446 apex {
7447 name: "myapex",
7448 key: "myapex.key",
7449 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007450 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007451 }
7452
7453 apex_key {
7454 name: "myapex.key",
7455 public_key: "testkey.avbpubkey",
7456 private_key: "testkey.pem",
7457 }
7458
7459 java_sdk_library {
7460 name: "foo",
7461 srcs: ["a.java"],
7462 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007463 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007464 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007465
7466 prebuilt_apis {
7467 name: "sdk",
7468 api_dirs: ["100"],
7469 }
Paul Duffin9b879592020-05-26 13:21:35 +01007470 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007471
7472 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007473 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007474 "javalib/foo.jar",
7475 "etc/permissions/foo.xml",
7476 })
7477 // Permission XML should point to the activated path of impl jar of java_sdk_library
Jiyong Parke3833882020-02-17 17:28:10 +09007478 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
Pedro Loureiro9956e5e2021-09-07 17:21:59 +00007479 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 +09007480}
7481
Paul Duffin9b879592020-05-26 13:21:35 +01007482func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007483 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007484 apex {
7485 name: "myapex",
7486 key: "myapex.key",
7487 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007488 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007489 }
7490
7491 apex_key {
7492 name: "myapex.key",
7493 public_key: "testkey.avbpubkey",
7494 private_key: "testkey.pem",
7495 }
7496
7497 java_sdk_library {
7498 name: "foo",
7499 srcs: ["a.java"],
7500 api_packages: ["foo"],
7501 apex_available: ["myapex"],
7502 sdk_version: "none",
7503 system_modules: "none",
7504 }
7505
7506 java_library {
7507 name: "bar",
7508 srcs: ["a.java"],
7509 libs: ["foo"],
7510 apex_available: ["myapex"],
7511 sdk_version: "none",
7512 system_modules: "none",
7513 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007514
7515 prebuilt_apis {
7516 name: "sdk",
7517 api_dirs: ["100"],
7518 }
Paul Duffin9b879592020-05-26 13:21:35 +01007519 `, withFiles(filesForSdkLibrary))
7520
7521 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007522 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007523 "javalib/bar.jar",
7524 "javalib/foo.jar",
7525 "etc/permissions/foo.xml",
7526 })
7527
7528 // The bar library should depend on the implementation jar.
7529 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007530 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007531 t.Errorf("expected %q, found %#q", expected, actual)
7532 }
7533}
7534
7535func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007536 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007537 apex {
7538 name: "myapex",
7539 key: "myapex.key",
7540 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007541 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007542 }
7543
7544 apex_key {
7545 name: "myapex.key",
7546 public_key: "testkey.avbpubkey",
7547 private_key: "testkey.pem",
7548 }
7549
7550 java_sdk_library {
7551 name: "foo",
7552 srcs: ["a.java"],
7553 api_packages: ["foo"],
7554 apex_available: ["myapex"],
7555 sdk_version: "none",
7556 system_modules: "none",
7557 }
7558
7559 java_library {
7560 name: "bar",
7561 srcs: ["a.java"],
7562 libs: ["foo"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007566
7567 prebuilt_apis {
7568 name: "sdk",
7569 api_dirs: ["100"],
7570 }
Paul Duffin9b879592020-05-26 13:21:35 +01007571 `, withFiles(filesForSdkLibrary))
7572
7573 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007574 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007575 "javalib/foo.jar",
7576 "etc/permissions/foo.xml",
7577 })
7578
7579 // The bar library should depend on the stubs jar.
7580 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007581 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007582 t.Errorf("expected %q, found %#q", expected, actual)
7583 }
7584}
7585
Paul Duffineedc5d52020-06-12 17:46:39 +01007586func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007587 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007588 prebuilt_apis {
7589 name: "sdk",
7590 api_dirs: ["100"],
7591 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007592 withFiles(map[string][]byte{
7593 "apex/a.java": nil,
7594 "apex/apex_manifest.json": nil,
7595 "apex/Android.bp": []byte(`
7596 package {
7597 default_visibility: ["//visibility:private"],
7598 }
7599
7600 apex {
7601 name: "myapex",
7602 key: "myapex.key",
7603 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007604 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007605 }
7606
7607 apex_key {
7608 name: "myapex.key",
7609 public_key: "testkey.avbpubkey",
7610 private_key: "testkey.pem",
7611 }
7612
7613 java_library {
7614 name: "bar",
7615 srcs: ["a.java"],
7616 libs: ["foo"],
7617 apex_available: ["myapex"],
7618 sdk_version: "none",
7619 system_modules: "none",
7620 }
7621`),
7622 "source/a.java": nil,
7623 "source/api/current.txt": nil,
7624 "source/api/removed.txt": nil,
7625 "source/Android.bp": []byte(`
7626 package {
7627 default_visibility: ["//visibility:private"],
7628 }
7629
7630 java_sdk_library {
7631 name: "foo",
7632 visibility: ["//apex"],
7633 srcs: ["a.java"],
7634 api_packages: ["foo"],
7635 apex_available: ["myapex"],
7636 sdk_version: "none",
7637 system_modules: "none",
7638 public: {
7639 enabled: true,
7640 },
7641 }
7642`),
7643 "prebuilt/a.jar": nil,
7644 "prebuilt/Android.bp": []byte(`
7645 package {
7646 default_visibility: ["//visibility:private"],
7647 }
7648
7649 java_sdk_library_import {
7650 name: "foo",
7651 visibility: ["//apex", "//source"],
7652 apex_available: ["myapex"],
7653 prefer: true,
7654 public: {
7655 jars: ["a.jar"],
7656 },
7657 }
7658`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007659 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007660 )
7661
7662 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007663 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007664 "javalib/bar.jar",
7665 "javalib/foo.jar",
7666 "etc/permissions/foo.xml",
7667 })
7668
7669 // The bar library should depend on the implementation jar.
7670 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007671 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007672 t.Errorf("expected %q, found %#q", expected, actual)
7673 }
7674}
7675
7676func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7677 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7678 apex {
7679 name: "myapex",
7680 key: "myapex.key",
7681 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007682 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007683 }
7684
7685 apex_key {
7686 name: "myapex.key",
7687 public_key: "testkey.avbpubkey",
7688 private_key: "testkey.pem",
7689 }
7690
7691 java_sdk_library_import {
7692 name: "foo",
7693 apex_available: ["myapex"],
7694 prefer: true,
7695 public: {
7696 jars: ["a.jar"],
7697 },
7698 }
7699
7700 `, withFiles(filesForSdkLibrary))
7701}
7702
atrost6e126252020-01-27 17:01:16 +00007703func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007704 result := android.GroupFixturePreparers(
7705 prepareForApexTest,
7706 java.PrepareForTestWithPlatformCompatConfig,
7707 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007708 apex {
7709 name: "myapex",
7710 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007711 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007712 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007713 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007714 }
7715
7716 apex_key {
7717 name: "myapex.key",
7718 public_key: "testkey.avbpubkey",
7719 private_key: "testkey.pem",
7720 }
7721
7722 platform_compat_config {
7723 name: "myjar-platform-compat-config",
7724 src: ":myjar",
7725 }
7726
7727 java_library {
7728 name: "myjar",
7729 srcs: ["foo/bar/MyClass.java"],
7730 sdk_version: "none",
7731 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007732 apex_available: [ "myapex" ],
7733 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007734
7735 // Make sure that a preferred prebuilt does not affect the apex contents.
7736 prebuilt_platform_compat_config {
7737 name: "myjar-platform-compat-config",
7738 metadata: "compat-config/metadata.xml",
7739 prefer: true,
7740 }
atrost6e126252020-01-27 17:01:16 +00007741 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007742 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007743 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007744 "etc/compatconfig/myjar-platform-compat-config.xml",
7745 "javalib/myjar.jar",
7746 })
7747}
7748
Jooyung Han862c0d62022-12-21 10:15:37 +09007749func TestNoDupeApexFiles(t *testing.T) {
7750 android.GroupFixturePreparers(
7751 android.PrepareForTestWithAndroidBuildComponents,
7752 PrepareForTestWithApexBuildComponents,
7753 prepareForTestWithMyapex,
7754 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7755 ).
7756 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7757 RunTestWithBp(t, `
7758 apex {
7759 name: "myapex",
7760 key: "myapex.key",
7761 prebuilts: ["foo", "bar"],
7762 updatable: false,
7763 }
7764
7765 apex_key {
7766 name: "myapex.key",
7767 public_key: "testkey.avbpubkey",
7768 private_key: "testkey.pem",
7769 }
7770
7771 prebuilt_etc {
7772 name: "foo",
7773 src: "myprebuilt",
7774 filename_from_src: true,
7775 }
7776
7777 prebuilt_etc {
7778 name: "bar",
7779 src: "myprebuilt",
7780 filename_from_src: true,
7781 }
7782 `)
7783}
7784
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007785func TestApexUnwantedTransitiveDeps(t *testing.T) {
7786 bp := `
7787 apex {
7788 name: "myapex",
7789 key: "myapex.key",
7790 native_shared_libs: ["libfoo"],
7791 updatable: false,
7792 unwanted_transitive_deps: ["libbar"],
7793 }
7794
7795 apex_key {
7796 name: "myapex.key",
7797 public_key: "testkey.avbpubkey",
7798 private_key: "testkey.pem",
7799 }
7800
7801 cc_library {
7802 name: "libfoo",
7803 srcs: ["foo.cpp"],
7804 shared_libs: ["libbar"],
7805 apex_available: ["myapex"],
7806 }
7807
7808 cc_library {
7809 name: "libbar",
7810 srcs: ["bar.cpp"],
7811 apex_available: ["myapex"],
7812 }`
7813 ctx := testApex(t, bp)
7814 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7815 "*/libc++.so",
7816 "*/libfoo.so",
7817 // not libbar.so
7818 })
7819}
7820
Jiyong Park479321d2019-12-16 11:47:12 +09007821func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7822 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7823 apex {
7824 name: "myapex",
7825 key: "myapex.key",
7826 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007827 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007828 }
7829
7830 apex_key {
7831 name: "myapex.key",
7832 public_key: "testkey.avbpubkey",
7833 private_key: "testkey.pem",
7834 }
7835
7836 java_library {
7837 name: "myjar",
7838 srcs: ["foo/bar/MyClass.java"],
7839 sdk_version: "none",
7840 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007841 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007842 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007843 }
7844 `)
7845}
7846
Jiyong Park7afd1072019-12-30 16:56:33 +09007847func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007848 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007849 apex {
7850 name: "myapex",
7851 key: "myapex.key",
7852 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007853 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007854 }
7855
7856 apex_key {
7857 name: "myapex.key",
7858 public_key: "testkey.avbpubkey",
7859 private_key: "testkey.pem",
7860 }
7861
7862 cc_library {
7863 name: "mylib",
7864 srcs: ["mylib.cpp"],
7865 system_shared_libs: [],
7866 stl: "none",
7867 required: ["a", "b"],
7868 host_required: ["c", "d"],
7869 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007870 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007871 }
7872 `)
7873
Jooyung Hana0503a52023-08-23 13:12:50 +09007874 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007875 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007876 name := apexBundle.BaseModuleName()
7877 prefix := "TARGET_"
7878 var builder strings.Builder
7879 data.Custom(&builder, name, prefix, "", data)
7880 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007881 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007882 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7883 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007884}
7885
Jiyong Park7cd10e32020-01-14 09:22:18 +09007886func TestSymlinksFromApexToSystem(t *testing.T) {
7887 bp := `
7888 apex {
7889 name: "myapex",
7890 key: "myapex.key",
7891 native_shared_libs: ["mylib"],
7892 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007893 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007894 }
7895
Jiyong Park9d677202020-02-19 16:29:35 +09007896 apex {
7897 name: "myapex.updatable",
7898 key: "myapex.key",
7899 native_shared_libs: ["mylib"],
7900 java_libs: ["myjar"],
7901 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007902 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007903 }
7904
Jiyong Park7cd10e32020-01-14 09:22:18 +09007905 apex_key {
7906 name: "myapex.key",
7907 public_key: "testkey.avbpubkey",
7908 private_key: "testkey.pem",
7909 }
7910
7911 cc_library {
7912 name: "mylib",
7913 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007914 shared_libs: [
7915 "myotherlib",
7916 "myotherlib_ext",
7917 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007918 system_shared_libs: [],
7919 stl: "none",
7920 apex_available: [
7921 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007922 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007923 "//apex_available:platform",
7924 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007925 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007926 }
7927
7928 cc_library {
7929 name: "myotherlib",
7930 srcs: ["mylib.cpp"],
7931 system_shared_libs: [],
7932 stl: "none",
7933 apex_available: [
7934 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007935 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007936 "//apex_available:platform",
7937 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007938 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007939 }
7940
Jiyong Parkce243632023-02-17 18:22:25 +09007941 cc_library {
7942 name: "myotherlib_ext",
7943 srcs: ["mylib.cpp"],
7944 system_shared_libs: [],
7945 system_ext_specific: true,
7946 stl: "none",
7947 apex_available: [
7948 "myapex",
7949 "myapex.updatable",
7950 "//apex_available:platform",
7951 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007952 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007953 }
7954
Jiyong Park7cd10e32020-01-14 09:22:18 +09007955 java_library {
7956 name: "myjar",
7957 srcs: ["foo/bar/MyClass.java"],
7958 sdk_version: "none",
7959 system_modules: "none",
7960 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007961 apex_available: [
7962 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007963 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007964 "//apex_available:platform",
7965 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007966 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967 }
7968
7969 java_library {
7970 name: "myotherjar",
7971 srcs: ["foo/bar/MyClass.java"],
7972 sdk_version: "none",
7973 system_modules: "none",
7974 apex_available: [
7975 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007976 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007977 "//apex_available:platform",
7978 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007979 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007980 }
7981 `
7982
7983 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7984 for _, f := range files {
7985 if f.path == file {
7986 if f.isLink {
7987 t.Errorf("%q is not a real file", file)
7988 }
7989 return
7990 }
7991 }
7992 t.Errorf("%q is not found", file)
7993 }
7994
Jiyong Parkce243632023-02-17 18:22:25 +09007995 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007996 for _, f := range files {
7997 if f.path == file {
7998 if !f.isLink {
7999 t.Errorf("%q is not a symlink", file)
8000 }
Jiyong Parkce243632023-02-17 18:22:25 +09008001 if f.src != target {
8002 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8003 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008004 return
8005 }
8006 }
8007 t.Errorf("%q is not found", file)
8008 }
8009
Jiyong Park9d677202020-02-19 16:29:35 +09008010 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8011 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008012 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008013 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 ensureRealfileExists(t, files, "javalib/myjar.jar")
8015 ensureRealfileExists(t, files, "lib64/mylib.so")
8016 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008017 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008018
Jooyung Hana0503a52023-08-23 13:12:50 +09008019 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008020 ensureRealfileExists(t, files, "javalib/myjar.jar")
8021 ensureRealfileExists(t, files, "lib64/mylib.so")
8022 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008023 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008024
8025 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008026 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008027 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008028 ensureRealfileExists(t, files, "javalib/myjar.jar")
8029 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008030 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8031 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008032
Jooyung Hana0503a52023-08-23 13:12:50 +09008033 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008034 ensureRealfileExists(t, files, "javalib/myjar.jar")
8035 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008036 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8037 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008038}
8039
Yo Chiange8128052020-07-23 20:09:18 +08008040func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008041 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008042 apex {
8043 name: "myapex",
8044 key: "myapex.key",
8045 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008046 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008047 }
8048
8049 apex_key {
8050 name: "myapex.key",
8051 public_key: "testkey.avbpubkey",
8052 private_key: "testkey.pem",
8053 }
8054
8055 cc_library_shared {
8056 name: "mylib",
8057 srcs: ["mylib.cpp"],
8058 shared_libs: ["myotherlib"],
8059 system_shared_libs: [],
8060 stl: "none",
8061 apex_available: [
8062 "myapex",
8063 "//apex_available:platform",
8064 ],
8065 }
8066
8067 cc_prebuilt_library_shared {
8068 name: "myotherlib",
8069 srcs: ["prebuilt.so"],
8070 system_shared_libs: [],
8071 stl: "none",
8072 apex_available: [
8073 "myapex",
8074 "//apex_available:platform",
8075 ],
8076 }
8077 `)
8078
Jooyung Hana0503a52023-08-23 13:12:50 +09008079 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008080 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008081 var builder strings.Builder
8082 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8083 androidMk := builder.String()
8084 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008085 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008086 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8087 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8088 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008089 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008090}
8091
Jooyung Han643adc42020-02-27 13:50:06 +09008092func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008093 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008094 apex {
8095 name: "myapex",
8096 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008097 binaries: ["mybin"],
8098 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008099 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008100 }
8101
8102 apex_key {
8103 name: "myapex.key",
8104 public_key: "testkey.avbpubkey",
8105 private_key: "testkey.pem",
8106 }
8107
8108 cc_library {
8109 name: "mylib",
8110 srcs: ["mylib.cpp"],
8111 shared_libs: ["mylib2"],
8112 system_shared_libs: [],
8113 stl: "none",
8114 apex_available: [ "myapex" ],
8115 }
8116
8117 cc_library {
8118 name: "mylib2",
8119 srcs: ["mylib.cpp"],
8120 system_shared_libs: [],
8121 stl: "none",
8122 apex_available: [ "myapex" ],
8123 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008124
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008125 // Used as both a JNI library and a regular shared library.
8126 cc_library {
8127 name: "mylib3",
8128 srcs: ["mylib.cpp"],
8129 system_shared_libs: [],
8130 stl: "none",
8131 apex_available: [ "myapex" ],
8132 }
8133
8134 cc_binary {
8135 name: "mybin",
8136 srcs: ["mybin.cpp"],
8137 shared_libs: ["mylib3"],
8138 system_shared_libs: [],
8139 stl: "none",
8140 apex_available: [ "myapex" ],
8141 }
8142
Jiyong Park34d5c332022-02-24 18:02:44 +09008143 rust_ffi_shared {
8144 name: "libfoo.rust",
8145 crate_name: "foo",
8146 srcs: ["foo.rs"],
8147 shared_libs: ["libfoo.shared_from_rust"],
8148 prefer_rlib: true,
8149 apex_available: ["myapex"],
8150 }
8151
8152 cc_library_shared {
8153 name: "libfoo.shared_from_rust",
8154 srcs: ["mylib.cpp"],
8155 system_shared_libs: [],
8156 stl: "none",
8157 stubs: {
8158 versions: ["10", "11", "12"],
8159 },
8160 }
8161
Jooyung Han643adc42020-02-27 13:50:06 +09008162 `)
8163
Jooyung Hana0503a52023-08-23 13:12:50 +09008164 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008165 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008166 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008167 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008168 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008169 "lib64/mylib.so",
8170 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008171 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008172 "lib64/libfoo.rust.so",
8173 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8174 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008175 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008176
8177 // b/220397949
8178 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008179}
8180
Jooyung Han49f67012020-04-17 13:43:10 +09008181func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008182 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008183 apex {
8184 name: "myapex",
8185 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008186 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008187 }
8188 apex_key {
8189 name: "myapex.key",
8190 public_key: "testkey.avbpubkey",
8191 private_key: "testkey.pem",
8192 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008193 `,
8194 android.FixtureModifyConfig(func(config android.Config) {
8195 delete(config.Targets, android.Android)
8196 config.AndroidCommonTarget = android.Target{}
8197 }),
8198 )
Jooyung Han49f67012020-04-17 13:43:10 +09008199
8200 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8201 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8202 }
8203}
8204
Jiyong Parkbd159612020-02-28 15:22:21 +09008205func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008206 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008207 apex {
8208 name: "myapex",
8209 key: "myapex.key",
8210 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008211 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008212 }
8213
8214 apex_key {
8215 name: "myapex.key",
8216 public_key: "testkey.avbpubkey",
8217 private_key: "testkey.pem",
8218 }
8219
8220 android_app {
8221 name: "AppFoo",
8222 srcs: ["foo/bar/MyClass.java"],
8223 sdk_version: "none",
8224 system_modules: "none",
8225 apex_available: [ "myapex" ],
8226 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008227 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008228
Jooyung Hana0503a52023-08-23 13:12:50 +09008229 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008230 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008231
8232 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008233 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 +09008234}
8235
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008236func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008237 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008238 apex {
8239 name: "myapex",
8240 key: "myapex.key",
8241 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008242 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008243 }
8244
8245 apex_key {
8246 name: "myapex.key",
8247 public_key: "testkey.avbpubkey",
8248 private_key: "testkey.pem",
8249 }
8250
8251 android_app_set {
8252 name: "AppSet",
8253 set: "AppSet.apks",
8254 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008255 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008256 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008257 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008258 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8259 s := mod.Rule("apexRule").Args["copy_commands"]
8260 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008261 if len(copyCmds) != 4 {
8262 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008263 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008264 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8265 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008266 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8267 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008268
8269 // Ensure that canned_fs_config has an entry for the app set zip file
8270 generateFsRule := mod.Rule("generateFsConfig")
8271 cmd := generateFsRule.RuleParams.Command
8272 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008273}
8274
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008275func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008276 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008277 apex_set {
8278 name: "myapex",
8279 filename: "foo_v2.apex",
8280 sanitized: {
8281 none: { set: "myapex.apks", },
8282 hwaddress: { set: "myapex.hwasan.apks", },
8283 },
Paul Duffin24704672021-04-06 16:09:30 +01008284 }
8285 `
8286 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008287
Paul Duffin24704672021-04-06 16:09:30 +01008288 // Check that the extractor produces the correct output file from the correct input file.
8289 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008290
Paul Duffin24704672021-04-06 16:09:30 +01008291 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8292 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008293
Paul Duffin24704672021-04-06 16:09:30 +01008294 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8295
8296 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008297 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8298 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008299
8300 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008301}
8302
Pranav Guptaeba03b02022-09-27 00:27:08 +00008303func TestApexSetApksModuleAssignment(t *testing.T) {
8304 ctx := testApex(t, `
8305 apex_set {
8306 name: "myapex",
8307 set: ":myapex_apks_file",
8308 }
8309
8310 filegroup {
8311 name: "myapex_apks_file",
8312 srcs: ["myapex.apks"],
8313 }
8314 `)
8315
8316 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
8317
8318 // Check that the extractor produces the correct apks file from the input module
8319 extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
8320 extractedApex := m.Output(extractorOutput)
8321
8322 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8323}
8324
Paul Duffin89f570a2021-06-16 01:42:33 +01008325func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008326 t.Helper()
8327
Paul Duffin55607122021-03-30 23:32:51 +01008328 fs := android.MockFS{
8329 "a.java": nil,
8330 "a.jar": nil,
8331 "apex_manifest.json": nil,
8332 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008333 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008334 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8335 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8336 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008337 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008338 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008339
Paul Duffin55607122021-03-30 23:32:51 +01008340 errorHandler := android.FixtureExpectsNoErrors
8341 if errmsg != "" {
8342 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008343 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008344
Paul Duffin55607122021-03-30 23:32:51 +01008345 result := android.GroupFixturePreparers(
8346 cc.PrepareForTestWithCcDefaultModules,
8347 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008348 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008349 java.PrepareForTestWithJavaSdkLibraryFiles,
8350 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008351 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008352 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008353 android.FixtureModifyMockFS(func(fs android.MockFS) {
8354 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8355 insert := ""
8356 for _, fragment := range fragments {
8357 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8358 }
8359 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8360 platform_bootclasspath {
8361 name: "platform-bootclasspath",
8362 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008363 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008364 %s
8365 ],
8366 }
8367 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008368 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008369 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008370 // Dexpreopt for boot jars requires the ART boot image profile.
8371 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8372 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008373 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008374 ).
8375 ExtendWithErrorHandler(errorHandler).
8376 RunTestWithBp(t, bp)
8377
8378 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008379}
8380
Paul Duffin5556c5f2022-06-09 17:32:21 +00008381func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008382 preparers := android.GroupFixturePreparers(
8383 java.PrepareForTestWithJavaDefaultModules,
8384 PrepareForTestWithApexBuildComponents,
8385 ).
8386 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
8387 "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
8388
8389 bpBase := `
8390 apex_set {
8391 name: "com.android.myapex",
8392 installable: true,
8393 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8394 set: "myapex.apks",
8395 }
8396
8397 apex_set {
8398 name: "com.mycompany.android.myapex",
8399 apex_name: "com.android.myapex",
8400 installable: true,
8401 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8402 set: "company-myapex.apks",
8403 }
8404
8405 prebuilt_bootclasspath_fragment {
8406 name: "my-bootclasspath-fragment",
8407 apex_available: ["com.android.myapex"],
8408 %s
8409 }
8410 `
8411
8412 t.Run("java_import", func(t *testing.T) {
8413 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8414 java_import {
8415 name: "libfoo",
8416 jars: ["libfoo.jar"],
8417 apex_available: ["com.android.myapex"],
8418 }
8419 `)
8420 })
8421
8422 t.Run("java_sdk_library_import", func(t *testing.T) {
8423 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8424 java_sdk_library_import {
8425 name: "libfoo",
8426 public: {
8427 jars: ["libbar.jar"],
8428 },
8429 apex_available: ["com.android.myapex"],
8430 }
8431 `)
8432 })
8433
8434 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8435 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8436 image_name: "art",
8437 contents: ["libfoo"],
8438 `)+`
8439 java_sdk_library_import {
8440 name: "libfoo",
8441 public: {
8442 jars: ["libbar.jar"],
8443 },
8444 apex_available: ["com.android.myapex"],
8445 }
8446 `)
8447 })
8448}
8449
Paul Duffin5556c5f2022-06-09 17:32:21 +00008450func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8451 preparers := android.GroupFixturePreparers(
8452 java.PrepareForTestWithJavaDefaultModules,
8453 PrepareForTestWithApexBuildComponents,
8454 )
8455
8456 bpBase := `
8457 apex_set {
8458 name: "com.android.myapex",
8459 installable: true,
8460 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8461 set: "myapex.apks",
8462 }
8463
8464 apex_set {
8465 name: "com.android.myapex_compressed",
8466 apex_name: "com.android.myapex",
8467 installable: true,
8468 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8469 set: "myapex_compressed.apks",
8470 }
8471
8472 prebuilt_bootclasspath_fragment {
8473 name: "my-bootclasspath-fragment",
8474 apex_available: [
8475 "com.android.myapex",
8476 "com.android.myapex_compressed",
8477 ],
8478 hidden_api: {
8479 annotation_flags: "annotation-flags.csv",
8480 metadata: "metadata.csv",
8481 index: "index.csv",
8482 signature_patterns: "signature_patterns.csv",
8483 },
8484 %s
8485 }
8486 `
8487
8488 t.Run("java_import", func(t *testing.T) {
8489 result := preparers.RunTestWithBp(t,
8490 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8491 java_import {
8492 name: "libfoo",
8493 jars: ["libfoo.jar"],
8494 apex_available: [
8495 "com.android.myapex",
8496 "com.android.myapex_compressed",
8497 ],
8498 }
8499 `)
8500
8501 module := result.Module("libfoo", "android_common_com.android.myapex")
8502 usesLibraryDep := module.(java.UsesLibraryDependency)
8503 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8504 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8505 usesLibraryDep.DexJarBuildPath().Path())
8506 })
8507
8508 t.Run("java_sdk_library_import", func(t *testing.T) {
8509 result := preparers.RunTestWithBp(t,
8510 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8511 java_sdk_library_import {
8512 name: "libfoo",
8513 public: {
8514 jars: ["libbar.jar"],
8515 },
8516 apex_available: [
8517 "com.android.myapex",
8518 "com.android.myapex_compressed",
8519 ],
8520 compile_dex: true,
8521 }
8522 `)
8523
8524 module := result.Module("libfoo", "android_common_com.android.myapex")
8525 usesLibraryDep := module.(java.UsesLibraryDependency)
8526 android.AssertPathRelativeToTopEquals(t, "dex jar path",
8527 "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
8528 usesLibraryDep.DexJarBuildPath().Path())
8529 })
8530
8531 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8532 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8533 image_name: "art",
8534 contents: ["libfoo"],
8535 `)+`
8536 java_sdk_library_import {
8537 name: "libfoo",
8538 public: {
8539 jars: ["libbar.jar"],
8540 },
8541 apex_available: [
8542 "com.android.myapex",
8543 "com.android.myapex_compressed",
8544 ],
8545 compile_dex: true,
8546 }
8547 `)
8548 })
8549}
8550
Jooyung Han548640b2020-04-27 12:10:30 +09008551func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8552 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8553 apex {
8554 name: "myapex",
8555 key: "myapex.key",
8556 updatable: true,
8557 }
8558
8559 apex_key {
8560 name: "myapex.key",
8561 public_key: "testkey.avbpubkey",
8562 private_key: "testkey.pem",
8563 }
8564 `)
8565}
8566
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008567func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8568 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8569 apex {
8570 name: "myapex",
8571 key: "myapex.key",
8572 }
8573
8574 apex_key {
8575 name: "myapex.key",
8576 public_key: "testkey.avbpubkey",
8577 private_key: "testkey.pem",
8578 }
8579 `)
8580}
8581
Jooyung Handfc864c2023-03-20 18:19:07 +09008582func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
8583 testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
Daniel Norman69109112021-12-02 12:52:42 -08008584 apex {
8585 name: "myapex",
8586 key: "myapex.key",
8587 updatable: true,
Jooyung Handfc864c2023-03-20 18:19:07 +09008588 use_vndk_as_stable: true,
Daniel Norman69109112021-12-02 12:52:42 -08008589 soc_specific: true,
8590 }
8591
8592 apex_key {
8593 name: "myapex.key",
8594 public_key: "testkey.avbpubkey",
8595 private_key: "testkey.pem",
8596 }
8597 `)
8598}
8599
Jooyung Han02873da2023-03-22 17:41:03 +09008600func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
8601 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
8602 apex {
8603 name: "myapex",
8604 key: "myapex.key",
8605 updatable: false,
8606 min_sdk_version: "29",
8607 use_vndk_as_stable: true,
8608 vendor: true,
8609 }
8610
8611 apex_key {
8612 name: "myapex.key",
8613 public_key: "testkey.avbpubkey",
8614 private_key: "testkey.pem",
8615 }
8616 `)
8617}
8618
Jooyung Handfc864c2023-03-20 18:19:07 +09008619func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
8620 testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
8621 apex {
8622 name: "myapex",
8623 key: "myapex.key",
8624 updatable: false,
8625 use_vndk_as_stable: true,
8626 }
8627
8628 apex_key {
8629 name: "myapex.key",
8630 public_key: "testkey.avbpubkey",
8631 private_key: "testkey.pem",
8632 }
8633 `)
8634}
8635
satayevb98371c2021-06-15 16:49:50 +01008636func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8637 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8638 apex {
8639 name: "myapex",
8640 key: "myapex.key",
8641 systemserverclasspath_fragments: [
8642 "mysystemserverclasspathfragment",
8643 ],
8644 min_sdk_version: "29",
8645 updatable: true,
8646 }
8647
8648 apex_key {
8649 name: "myapex.key",
8650 public_key: "testkey.avbpubkey",
8651 private_key: "testkey.pem",
8652 }
8653
8654 java_library {
8655 name: "foo",
8656 srcs: ["b.java"],
8657 min_sdk_version: "29",
8658 installable: true,
8659 apex_available: [
8660 "myapex",
8661 ],
8662 }
8663
8664 systemserverclasspath_fragment {
8665 name: "mysystemserverclasspathfragment",
8666 generate_classpaths_proto: false,
8667 contents: [
8668 "foo",
8669 ],
8670 apex_available: [
8671 "myapex",
8672 ],
8673 }
satayevabcd5972021-08-06 17:49:46 +01008674 `,
8675 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8676 )
satayevb98371c2021-06-15 16:49:50 +01008677}
8678
Paul Duffin064b70c2020-11-02 17:32:38 +00008679func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008680 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008681 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008682 fragment := java.ApexVariantReference{
8683 Apex: proptools.StringPtr("myapex"),
8684 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8685 }
8686
Paul Duffin064b70c2020-11-02 17:32:38 +00008687 testDexpreoptWithApexes(t, `
8688 prebuilt_apex {
8689 name: "myapex" ,
8690 arch: {
8691 arm64: {
8692 src: "myapex-arm64.apex",
8693 },
8694 arm: {
8695 src: "myapex-arm.apex",
8696 },
8697 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008698 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8699 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008700
Paul Duffin89f570a2021-06-16 01:42:33 +01008701 prebuilt_bootclasspath_fragment {
8702 name: "my-bootclasspath-fragment",
8703 contents: ["libfoo"],
8704 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008705 hidden_api: {
8706 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8707 metadata: "my-bootclasspath-fragment/metadata.csv",
8708 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008709 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8710 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8711 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008712 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008713 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008714
Paul Duffin89f570a2021-06-16 01:42:33 +01008715 java_import {
8716 name: "libfoo",
8717 jars: ["libfoo.jar"],
8718 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008719 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008720 }
8721 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008722 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008723}
8724
Spandan Dasf14e2542021-11-12 00:01:37 +00008725func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008726 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008727 bp += `
8728 apex_key {
8729 name: "myapex.key",
8730 public_key: "testkey.avbpubkey",
8731 private_key: "testkey.pem",
8732 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008733 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008734 "lib1/src/A.java": nil,
8735 "lib2/src/B.java": nil,
8736 "system/sepolicy/apex/myapex-file_contexts": nil,
8737 }
8738
Paul Duffin45338f02021-03-30 23:07:52 +01008739 errorHandler := android.FixtureExpectsNoErrors
8740 if errmsg != "" {
8741 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008742 }
Colin Crossae8600b2020-10-29 17:09:13 -07008743
Paul Duffin45338f02021-03-30 23:07:52 +01008744 android.GroupFixturePreparers(
8745 android.PrepareForTestWithAndroidBuildComponents,
8746 java.PrepareForTestWithJavaBuildComponents,
8747 PrepareForTestWithApexBuildComponents,
8748 android.PrepareForTestWithNeverallowRules(rules),
8749 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008750 apexBootJars := make([]string, 0, len(bootJars))
8751 for _, apexBootJar := range bootJars {
8752 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008753 }
satayevd604b212021-07-21 14:23:52 +01008754 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008755 }),
8756 fs.AddToFixture(),
8757 ).
8758 ExtendWithErrorHandler(errorHandler).
8759 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008760}
8761
8762func TestApexPermittedPackagesRules(t *testing.T) {
8763 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008764 name string
8765 expectedError string
8766 bp string
8767 bootJars []string
8768 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008769 }{
8770
8771 {
8772 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8773 expectedError: "",
8774 bp: `
8775 java_library {
8776 name: "bcp_lib1",
8777 srcs: ["lib1/src/*.java"],
8778 permitted_packages: ["foo.bar"],
8779 apex_available: ["myapex"],
8780 sdk_version: "none",
8781 system_modules: "none",
8782 }
8783 java_library {
8784 name: "nonbcp_lib2",
8785 srcs: ["lib2/src/*.java"],
8786 apex_available: ["myapex"],
8787 permitted_packages: ["a.b"],
8788 sdk_version: "none",
8789 system_modules: "none",
8790 }
8791 apex {
8792 name: "myapex",
8793 key: "myapex.key",
8794 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008795 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008796 }`,
8797 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008798 bcpPermittedPackages: map[string][]string{
8799 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008800 "foo.bar",
8801 },
8802 },
8803 },
8804 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008805 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008806 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 +01008807 bp: `
8808 java_library {
8809 name: "bcp_lib1",
8810 srcs: ["lib1/src/*.java"],
8811 apex_available: ["myapex"],
8812 permitted_packages: ["foo.bar"],
8813 sdk_version: "none",
8814 system_modules: "none",
8815 }
8816 java_library {
8817 name: "bcp_lib2",
8818 srcs: ["lib2/src/*.java"],
8819 apex_available: ["myapex"],
8820 permitted_packages: ["foo.bar", "bar.baz"],
8821 sdk_version: "none",
8822 system_modules: "none",
8823 }
8824 apex {
8825 name: "myapex",
8826 key: "myapex.key",
8827 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008828 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008829 }
8830 `,
8831 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008832 bcpPermittedPackages: map[string][]string{
8833 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008834 "foo.bar",
8835 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008836 "bcp_lib2": []string{
8837 "foo.bar",
8838 },
8839 },
8840 },
8841 {
8842 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8843 expectedError: "",
8844 bp: `
8845 java_library {
8846 name: "bcp_lib_restricted",
8847 srcs: ["lib1/src/*.java"],
8848 apex_available: ["myapex"],
8849 permitted_packages: ["foo.bar"],
8850 sdk_version: "none",
8851 min_sdk_version: "29",
8852 system_modules: "none",
8853 }
8854 java_library {
8855 name: "bcp_lib_unrestricted",
8856 srcs: ["lib2/src/*.java"],
8857 apex_available: ["myapex"],
8858 permitted_packages: ["foo.bar", "bar.baz"],
8859 sdk_version: "none",
8860 min_sdk_version: "29",
8861 system_modules: "none",
8862 }
8863 apex {
8864 name: "myapex",
8865 key: "myapex.key",
8866 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8867 updatable: true,
8868 min_sdk_version: "29",
8869 }
8870 `,
8871 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8872 bcpPermittedPackages: map[string][]string{
8873 "bcp_lib1_non_updateable": []string{
8874 "foo.bar",
8875 },
8876 // 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 +01008877 },
8878 },
8879 }
8880 for _, tc := range testcases {
8881 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008882 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8883 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008884 })
8885 }
8886}
8887
Jiyong Park62304bb2020-04-13 16:19:48 +09008888func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008889 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008890 apex {
8891 name: "myapex",
8892 key: "myapex.key",
8893 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008894 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008895 }
8896
8897 apex_key {
8898 name: "myapex.key",
8899 public_key: "testkey.avbpubkey",
8900 private_key: "testkey.pem",
8901 }
8902
8903 cc_library {
8904 name: "mylib",
8905 srcs: ["mylib.cpp"],
8906 system_shared_libs: [],
8907 stl: "none",
8908 stubs: {
8909 versions: ["1"],
8910 },
8911 apex_available: ["myapex"],
8912 }
8913
8914 cc_library {
8915 name: "myprivlib",
8916 srcs: ["mylib.cpp"],
8917 system_shared_libs: [],
8918 stl: "none",
8919 apex_available: ["myapex"],
8920 }
8921
8922
8923 cc_test {
8924 name: "mytest",
8925 gtest: false,
8926 srcs: ["mylib.cpp"],
8927 system_shared_libs: [],
8928 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008929 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008930 test_for: ["myapex"]
8931 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008932
8933 cc_library {
8934 name: "mytestlib",
8935 srcs: ["mylib.cpp"],
8936 system_shared_libs: [],
8937 shared_libs: ["mylib", "myprivlib"],
8938 stl: "none",
8939 test_for: ["myapex"],
8940 }
8941
8942 cc_benchmark {
8943 name: "mybench",
8944 srcs: ["mylib.cpp"],
8945 system_shared_libs: [],
8946 shared_libs: ["mylib", "myprivlib"],
8947 stl: "none",
8948 test_for: ["myapex"],
8949 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008950 `)
8951
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008952 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008953 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008954 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8955 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8956 }
8957
8958 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008959 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008960 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8961 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8962 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8963}
Jiyong Park46a512f2020-12-04 18:02:13 +09008964
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008965func TestIndirectTestFor(t *testing.T) {
8966 ctx := testApex(t, `
8967 apex {
8968 name: "myapex",
8969 key: "myapex.key",
8970 native_shared_libs: ["mylib", "myprivlib"],
8971 updatable: false,
8972 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008973
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008974 apex_key {
8975 name: "myapex.key",
8976 public_key: "testkey.avbpubkey",
8977 private_key: "testkey.pem",
8978 }
8979
8980 cc_library {
8981 name: "mylib",
8982 srcs: ["mylib.cpp"],
8983 system_shared_libs: [],
8984 stl: "none",
8985 stubs: {
8986 versions: ["1"],
8987 },
8988 apex_available: ["myapex"],
8989 }
8990
8991 cc_library {
8992 name: "myprivlib",
8993 srcs: ["mylib.cpp"],
8994 system_shared_libs: [],
8995 stl: "none",
8996 shared_libs: ["mylib"],
8997 apex_available: ["myapex"],
8998 }
8999
9000 cc_library {
9001 name: "mytestlib",
9002 srcs: ["mylib.cpp"],
9003 system_shared_libs: [],
9004 shared_libs: ["myprivlib"],
9005 stl: "none",
9006 test_for: ["myapex"],
9007 }
9008 `)
9009
9010 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01009011 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00009012 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
9013 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
9014 }
9015
9016 // The platform variant of mytestlib links to the platform variant of the
9017 // internal myprivlib.
9018 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
9019
9020 // The platform variant of myprivlib links to the platform variant of mylib
9021 // and bypasses its stubs.
9022 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 +09009023}
9024
Martin Stjernholmec009002021-03-27 15:18:31 +00009025func TestTestForForLibInOtherApex(t *testing.T) {
9026 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
9027 _ = testApex(t, `
9028 apex {
9029 name: "com.android.art",
9030 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009031 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009032 updatable: false,
9033 }
9034
9035 apex {
9036 name: "com.android.art.debug",
9037 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00009038 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009039 updatable: false,
9040 }
9041
9042 apex_key {
9043 name: "myapex.key",
9044 public_key: "testkey.avbpubkey",
9045 private_key: "testkey.pem",
9046 }
9047
9048 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009049 name: "libnativebridge",
9050 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009051 system_shared_libs: [],
9052 stl: "none",
9053 stubs: {
9054 versions: ["1"],
9055 },
9056 apex_available: ["com.android.art", "com.android.art.debug"],
9057 }
9058
9059 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00009060 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00009061 srcs: ["mylib.cpp"],
9062 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00009063 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00009064 stl: "none",
9065 apex_available: ["com.android.art.debug"],
9066 test_for: ["com.android.art"],
9067 }
9068 `,
9069 android.MockFS{
9070 "system/sepolicy/apex/com.android.art-file_contexts": nil,
9071 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
9072 }.AddToFixture())
9073}
9074
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009075// TODO(jungjw): Move this to proptools
9076func intPtr(i int) *int {
9077 return &i
9078}
9079
9080func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009081 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009082 apex_set {
9083 name: "myapex",
9084 set: "myapex.apks",
9085 filename: "foo_v2.apex",
9086 overrides: ["foo"],
9087 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009088 `,
9089 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9090 variables.Platform_sdk_version = intPtr(30)
9091 }),
9092 android.FixtureModifyConfig(func(config android.Config) {
9093 config.Targets[android.Android] = []android.Target{
9094 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9095 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9096 }
9097 }),
9098 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009099
Paul Duffin24704672021-04-06 16:09:30 +01009100 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009101
9102 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009103 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009104 actual := extractedApex.Args["abis"]
9105 expected := "ARMEABI_V7A,ARM64_V8A"
9106 if actual != expected {
9107 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9108 }
9109 actual = extractedApex.Args["sdk-version"]
9110 expected = "30"
9111 if actual != expected {
9112 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9113 }
9114
Paul Duffin6717d882021-06-15 19:09:41 +01009115 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009116 a := m.Module().(*ApexSet)
9117 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009118 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009119 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9120 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9121 }
9122}
9123
Anton Hansson805e0a52022-11-25 14:06:46 +00009124func TestApexSet_NativeBridge(t *testing.T) {
9125 ctx := testApex(t, `
9126 apex_set {
9127 name: "myapex",
9128 set: "myapex.apks",
9129 filename: "foo_v2.apex",
9130 overrides: ["foo"],
9131 }
9132 `,
9133 android.FixtureModifyConfig(func(config android.Config) {
9134 config.Targets[android.Android] = []android.Target{
9135 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9136 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9137 }
9138 }),
9139 )
9140
9141 m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
9142
9143 // Check extract_apks tool parameters. No native bridge arch expected
9144 extractedApex := m.Output("extracted/myapex.apks")
9145 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9146}
9147
Jiyong Park7d95a512020-05-10 15:16:24 +09009148func TestNoStaticLinkingToStubsLib(t *testing.T) {
9149 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9150 apex {
9151 name: "myapex",
9152 key: "myapex.key",
9153 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009154 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009155 }
9156
9157 apex_key {
9158 name: "myapex.key",
9159 public_key: "testkey.avbpubkey",
9160 private_key: "testkey.pem",
9161 }
9162
9163 cc_library {
9164 name: "mylib",
9165 srcs: ["mylib.cpp"],
9166 static_libs: ["otherlib"],
9167 system_shared_libs: [],
9168 stl: "none",
9169 apex_available: [ "myapex" ],
9170 }
9171
9172 cc_library {
9173 name: "otherlib",
9174 srcs: ["mylib.cpp"],
9175 system_shared_libs: [],
9176 stl: "none",
9177 stubs: {
9178 versions: ["1", "2", "3"],
9179 },
9180 apex_available: [ "myapex" ],
9181 }
9182 `)
9183}
9184
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009185func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009186 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009187 apex {
9188 name: "myapex",
9189 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009190 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009191 custom_sign_tool: "sign_myapex",
9192 }
9193
9194 apex_key {
9195 name: "myapex.key",
9196 public_key: "testkey.avbpubkey",
9197 private_key: "testkey.pem",
9198 }
9199 `)
9200
Jooyung Han286957d2023-10-30 16:17:56 +09009201 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009202 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009203 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 +09009204}
9205
9206func TestApexKeysTxtOverrides(t *testing.T) {
9207 ctx := testApex(t, `
9208 apex {
9209 name: "myapex",
9210 key: "myapex.key",
9211 updatable: false,
9212 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009213 }
9214
9215 apex_key {
9216 name: "myapex.key",
9217 public_key: "testkey.avbpubkey",
9218 private_key: "testkey.pem",
9219 }
9220
9221 prebuilt_apex {
9222 name: "myapex",
9223 prefer: true,
9224 arch: {
9225 arm64: {
9226 src: "myapex-arm64.apex",
9227 },
9228 arm: {
9229 src: "myapex-arm.apex",
9230 },
9231 },
9232 }
9233
9234 apex_set {
9235 name: "myapex_set",
9236 set: "myapex.apks",
9237 filename: "myapex_set.apex",
9238 overrides: ["myapex"],
9239 }
9240 `)
9241
Colin Crossf61d03d2023-11-02 16:56:39 -07009242 content := android.ContentFromFileRuleForTests(t, ctx,
9243 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009244 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07009245 content = android.ContentFromFileRuleForTests(t, ctx,
9246 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009247 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 +09009248}
9249
Jooyung Han938b5932020-06-20 12:47:47 +09009250func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009251 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009252 apex {
9253 name: "myapex",
9254 key: "myapex.key",
9255 apps: ["app"],
9256 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009257 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009258 }
9259
9260 apex_key {
9261 name: "myapex.key",
9262 public_key: "testkey.avbpubkey",
9263 private_key: "testkey.pem",
9264 }
9265
9266 android_app {
9267 name: "app",
9268 srcs: ["foo/bar/MyClass.java"],
9269 package_name: "foo",
9270 sdk_version: "none",
9271 system_modules: "none",
9272 apex_available: [ "myapex" ],
9273 }
9274 `, withFiles(map[string][]byte{
9275 "sub/Android.bp": []byte(`
9276 override_apex {
9277 name: "override_myapex",
9278 base: "myapex",
9279 apps: ["override_app"],
9280 allowed_files: ":allowed",
9281 }
9282 // Overridable "path" property should be referenced indirectly
9283 filegroup {
9284 name: "allowed",
9285 srcs: ["allowed.txt"],
9286 }
9287 override_android_app {
9288 name: "override_app",
9289 base: "app",
9290 package_name: "bar",
9291 }
9292 `),
9293 }))
9294
Jooyung Hana0503a52023-08-23 13:12:50 +09009295 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009296 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9297 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9298 }
9299
Jooyung Hana0503a52023-08-23 13:12:50 +09009300 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009301 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9302 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9303 }
9304}
9305
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009306func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009307 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009308 apex {
9309 name: "myapex",
9310 key: "myapex.key",
9311 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009312 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009313 }
9314
9315 apex_key {
9316 name: "myapex.key",
9317 public_key: "testkey.avbpubkey",
9318 private_key: "testkey.pem",
9319 }
9320
9321 cc_library {
9322 name: "mylib",
9323 srcs: ["mylib.cpp"],
9324 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009325 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009326 },
9327 apex_available: ["myapex"],
9328 }
9329
9330 cc_prebuilt_library_shared {
9331 name: "mylib",
9332 prefer: false,
9333 srcs: ["prebuilt.so"],
9334 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009335 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009336 },
9337 apex_available: ["myapex"],
9338 }
9339 `)
9340}
9341
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009342func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009343 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009344 apex {
9345 name: "myapex",
9346 key: "myapex.key",
9347 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009348 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009349 }
9350 apex_key {
9351 name: "myapex.key",
9352 public_key: "testkey.avbpubkey",
9353 private_key: "testkey.pem",
9354 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009355 `,
9356 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9357 variables.CompressedApex = proptools.BoolPtr(true)
9358 }),
9359 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009360
Jooyung Hana0503a52023-08-23 13:12:50 +09009361 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009362 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9363
Jooyung Hana0503a52023-08-23 13:12:50 +09009364 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009365 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9366
9367 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009368 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009369 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9370
9371 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009372 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009373 var builder strings.Builder
9374 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9375 androidMk := builder.String()
9376 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9377}
9378
Martin Stjernholm2856c662020-12-02 15:03:42 +00009379func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009380 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009381 apex {
9382 name: "myapex",
9383 key: "myapex.key",
9384 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009385 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009386 }
9387
9388 apex_key {
9389 name: "myapex.key",
9390 public_key: "testkey.avbpubkey",
9391 private_key: "testkey.pem",
9392 }
9393
9394 cc_library {
9395 name: "mylib",
9396 srcs: ["mylib.cpp"],
9397 apex_available: ["myapex"],
9398 shared_libs: ["otherlib"],
9399 system_shared_libs: [],
9400 }
9401
9402 cc_library {
9403 name: "otherlib",
9404 srcs: ["mylib.cpp"],
9405 stubs: {
9406 versions: ["current"],
9407 },
9408 }
9409
9410 cc_prebuilt_library_shared {
9411 name: "otherlib",
9412 prefer: true,
9413 srcs: ["prebuilt.so"],
9414 stubs: {
9415 versions: ["current"],
9416 },
9417 }
9418 `)
9419
Jooyung Hana0503a52023-08-23 13:12:50 +09009420 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009421 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009422 var builder strings.Builder
9423 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9424 androidMk := builder.String()
9425
9426 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9427 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009428 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009429}
9430
Jiyong Parke3867542020-12-03 17:28:25 +09009431func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009432 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009437 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009438 }
9439
9440 apex_key {
9441 name: "myapex.key",
9442 public_key: "testkey.avbpubkey",
9443 private_key: "testkey.pem",
9444 }
9445
9446 cc_library {
9447 name: "mylib",
9448 srcs: ["mylib.cpp"],
9449 system_shared_libs: [],
9450 stl: "none",
9451 apex_available: ["myapex"],
9452 shared_libs: ["mylib2"],
9453 target: {
9454 apex: {
9455 exclude_shared_libs: ["mylib2"],
9456 },
9457 },
9458 }
9459
9460 cc_library {
9461 name: "mylib2",
9462 srcs: ["mylib.cpp"],
9463 system_shared_libs: [],
9464 stl: "none",
9465 }
9466 `)
9467
9468 // Check if mylib is linked to mylib2 for the non-apex target
9469 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9470 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9471
9472 // Make sure that the link doesn't occur for the apex target
9473 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9474 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9475
9476 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009477 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009478 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9479}
9480
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009481func TestPrebuiltStubLibDep(t *testing.T) {
9482 bpBase := `
9483 apex {
9484 name: "myapex",
9485 key: "myapex.key",
9486 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009487 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009488 }
9489 apex_key {
9490 name: "myapex.key",
9491 public_key: "testkey.avbpubkey",
9492 private_key: "testkey.pem",
9493 }
9494 cc_library {
9495 name: "mylib",
9496 srcs: ["mylib.cpp"],
9497 apex_available: ["myapex"],
9498 shared_libs: ["stublib"],
9499 system_shared_libs: [],
9500 }
9501 apex {
9502 name: "otherapex",
9503 enabled: %s,
9504 key: "myapex.key",
9505 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009506 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009507 }
9508 `
9509
9510 stublibSourceBp := `
9511 cc_library {
9512 name: "stublib",
9513 srcs: ["mylib.cpp"],
9514 apex_available: ["otherapex"],
9515 system_shared_libs: [],
9516 stl: "none",
9517 stubs: {
9518 versions: ["1"],
9519 },
9520 }
9521 `
9522
9523 stublibPrebuiltBp := `
9524 cc_prebuilt_library_shared {
9525 name: "stublib",
9526 srcs: ["prebuilt.so"],
9527 apex_available: ["otherapex"],
9528 stubs: {
9529 versions: ["1"],
9530 },
9531 %s
9532 }
9533 `
9534
9535 tests := []struct {
9536 name string
9537 stublibBp string
9538 usePrebuilt bool
9539 modNames []string // Modules to collect AndroidMkEntries for
9540 otherApexEnabled []string
9541 }{
9542 {
9543 name: "only_source",
9544 stublibBp: stublibSourceBp,
9545 usePrebuilt: false,
9546 modNames: []string{"stublib"},
9547 otherApexEnabled: []string{"true", "false"},
9548 },
9549 {
9550 name: "source_preferred",
9551 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9552 usePrebuilt: false,
9553 modNames: []string{"stublib", "prebuilt_stublib"},
9554 otherApexEnabled: []string{"true", "false"},
9555 },
9556 {
9557 name: "prebuilt_preferred",
9558 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9559 usePrebuilt: true,
9560 modNames: []string{"stublib", "prebuilt_stublib"},
9561 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9562 },
9563 {
9564 name: "only_prebuilt",
9565 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9566 usePrebuilt: true,
9567 modNames: []string{"stublib"},
9568 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9569 },
9570 }
9571
9572 for _, test := range tests {
9573 t.Run(test.name, func(t *testing.T) {
9574 for _, otherApexEnabled := range test.otherApexEnabled {
9575 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009576 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009577
9578 type modAndMkEntries struct {
9579 mod *cc.Module
9580 mkEntries android.AndroidMkEntries
9581 }
9582 entries := []*modAndMkEntries{}
9583
9584 // Gather shared lib modules that are installable
9585 for _, modName := range test.modNames {
9586 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9587 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9588 continue
9589 }
9590 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Colin Crossa9c8c9f2020-12-16 10:20:23 -08009591 if !mod.Enabled() || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009592 continue
9593 }
Colin Crossaa255532020-07-03 13:18:24 -07009594 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009595 if ent.Disabled {
9596 continue
9597 }
9598 entries = append(entries, &modAndMkEntries{
9599 mod: mod,
9600 mkEntries: ent,
9601 })
9602 }
9603 }
9604 }
9605
9606 var entry *modAndMkEntries = nil
9607 for _, ent := range entries {
9608 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9609 if entry != nil {
9610 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9611 } else {
9612 entry = ent
9613 }
9614 }
9615 }
9616
9617 if entry == nil {
9618 t.Errorf("AndroidMk entry for \"stublib\" missing")
9619 } else {
9620 isPrebuilt := entry.mod.Prebuilt() != nil
9621 if isPrebuilt != test.usePrebuilt {
9622 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9623 }
9624 if !entry.mod.IsStubs() {
9625 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9626 }
9627 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9628 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9629 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009630 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009631 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009632 if !android.InList(expected, cflags) {
9633 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9634 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009635 }
9636 })
9637 }
9638 })
9639 }
9640}
9641
Colin Crossc33e5212021-05-25 18:16:02 -07009642func TestApexJavaCoverage(t *testing.T) {
9643 bp := `
9644 apex {
9645 name: "myapex",
9646 key: "myapex.key",
9647 java_libs: ["mylib"],
9648 bootclasspath_fragments: ["mybootclasspathfragment"],
9649 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9650 updatable: false,
9651 }
9652
9653 apex_key {
9654 name: "myapex.key",
9655 public_key: "testkey.avbpubkey",
9656 private_key: "testkey.pem",
9657 }
9658
9659 java_library {
9660 name: "mylib",
9661 srcs: ["mylib.java"],
9662 apex_available: ["myapex"],
9663 compile_dex: true,
9664 }
9665
9666 bootclasspath_fragment {
9667 name: "mybootclasspathfragment",
9668 contents: ["mybootclasspathlib"],
9669 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009670 hidden_api: {
9671 split_packages: ["*"],
9672 },
Colin Crossc33e5212021-05-25 18:16:02 -07009673 }
9674
9675 java_library {
9676 name: "mybootclasspathlib",
9677 srcs: ["mybootclasspathlib.java"],
9678 apex_available: ["myapex"],
9679 compile_dex: true,
9680 }
9681
9682 systemserverclasspath_fragment {
9683 name: "mysystemserverclasspathfragment",
9684 contents: ["mysystemserverclasspathlib"],
9685 apex_available: ["myapex"],
9686 }
9687
9688 java_library {
9689 name: "mysystemserverclasspathlib",
9690 srcs: ["mysystemserverclasspathlib.java"],
9691 apex_available: ["myapex"],
9692 compile_dex: true,
9693 }
9694 `
9695
9696 result := android.GroupFixturePreparers(
9697 PrepareForTestWithApexBuildComponents,
9698 prepareForTestWithMyapex,
9699 java.PrepareForTestWithJavaDefaultModules,
9700 android.PrepareForTestWithAndroidBuildComponents,
9701 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009702 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9703 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009704 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009705 ).RunTest(t)
9706
9707 // Make sure jacoco ran on both mylib and mybootclasspathlib
9708 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9709 t.Errorf("Failed to find jacoco rule for mylib")
9710 }
9711 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9712 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9713 }
9714 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9715 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9716 }
9717}
9718
Jiyong Park192600a2021-08-03 07:52:17 +00009719func TestProhibitStaticExecutable(t *testing.T) {
9720 testApexError(t, `executable mybin is static`, `
9721 apex {
9722 name: "myapex",
9723 key: "myapex.key",
9724 binaries: ["mybin"],
9725 min_sdk_version: "29",
9726 }
9727
9728 apex_key {
9729 name: "myapex.key",
9730 public_key: "testkey.avbpubkey",
9731 private_key: "testkey.pem",
9732 }
9733
9734 cc_binary {
9735 name: "mybin",
9736 srcs: ["mylib.cpp"],
9737 relative_install_path: "foo/bar",
9738 static_executable: true,
9739 system_shared_libs: [],
9740 stl: "none",
9741 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009742 min_sdk_version: "29",
9743 }
9744 `)
9745
9746 testApexError(t, `executable mybin.rust is static`, `
9747 apex {
9748 name: "myapex",
9749 key: "myapex.key",
9750 binaries: ["mybin.rust"],
9751 min_sdk_version: "29",
9752 }
9753
9754 apex_key {
9755 name: "myapex.key",
9756 public_key: "testkey.avbpubkey",
9757 private_key: "testkey.pem",
9758 }
9759
9760 rust_binary {
9761 name: "mybin.rust",
9762 srcs: ["foo.rs"],
9763 static_executable: true,
9764 apex_available: ["myapex"],
9765 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009766 }
9767 `)
9768}
9769
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009770func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9771 ctx := testApex(t, `
9772 apex {
9773 name: "myapex",
9774 key: "myapex.key",
9775 updatable: false,
9776 java_libs: ["foo"],
9777 }
9778
9779 apex_key {
9780 name: "myapex.key",
9781 public_key: "testkey.avbpubkey",
9782 private_key: "testkey.pem",
9783 }
9784
9785 java_library {
9786 name: "foo",
9787 srcs: ["foo.java"],
9788 apex_available: ["myapex"],
9789 installable: true,
9790 }
9791 `,
9792 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9793 )
9794
Jooyung Hana0503a52023-08-23 13:12:50 +09009795 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009796 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9797 var builder strings.Builder
9798 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9799 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009800 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 +00009801}
9802
9803func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9804 ctx := testApex(t, `
9805 prebuilt_apex {
9806 name: "myapex",
9807 arch: {
9808 arm64: {
9809 src: "myapex-arm64.apex",
9810 },
9811 arm: {
9812 src: "myapex-arm.apex",
9813 },
9814 },
9815 exported_java_libs: ["foo"],
9816 }
9817
9818 java_import {
9819 name: "foo",
9820 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009821 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009822 }
9823 `,
9824 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9825 )
9826
9827 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9828 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9829 mainModuleEntries := entriesList[0]
9830 android.AssertArrayString(t,
9831 "LOCAL_REQUIRED_MODULES",
9832 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9833 []string{
9834 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9835 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9836 })
9837}
9838
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009839func TestAndroidMk_RequiredModules(t *testing.T) {
9840 ctx := testApex(t, `
9841 apex {
9842 name: "myapex",
9843 key: "myapex.key",
9844 updatable: false,
9845 java_libs: ["foo"],
9846 required: ["otherapex"],
9847 }
9848
9849 apex {
9850 name: "otherapex",
9851 key: "myapex.key",
9852 updatable: false,
9853 java_libs: ["foo"],
9854 required: ["otherapex"],
9855 }
9856
9857 apex_key {
9858 name: "myapex.key",
9859 public_key: "testkey.avbpubkey",
9860 private_key: "testkey.pem",
9861 }
9862
9863 java_library {
9864 name: "foo",
9865 srcs: ["foo.java"],
9866 apex_available: ["myapex", "otherapex"],
9867 installable: true,
9868 }
9869 `)
9870
Jooyung Hana0503a52023-08-23 13:12:50 +09009871 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009872 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9873 var builder strings.Builder
9874 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9875 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009876 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009877}
9878
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009879func TestAndroidMk_RequiredDeps(t *testing.T) {
9880 ctx := testApex(t, `
9881 apex {
9882 name: "myapex",
9883 key: "myapex.key",
9884 updatable: false,
9885 }
9886
9887 apex_key {
9888 name: "myapex.key",
9889 public_key: "testkey.avbpubkey",
9890 private_key: "testkey.pem",
9891 }
9892 `)
9893
Jooyung Hana0503a52023-08-23 13:12:50 +09009894 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009895 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009896 data := android.AndroidMkDataForTest(t, ctx, bundle)
9897 var builder strings.Builder
9898 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9899 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009900 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009901}
9902
Jooyung Hana6d36672022-02-24 13:58:07 +09009903func TestApexOutputFileProducer(t *testing.T) {
9904 for _, tc := range []struct {
9905 name string
9906 ref string
9907 expected_data []string
9908 }{
9909 {
9910 name: "test_using_output",
9911 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009912 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009913 },
9914 {
9915 name: "test_using_apex",
9916 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009917 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009918 },
9919 } {
9920 t.Run(tc.name, func(t *testing.T) {
9921 ctx := testApex(t, `
9922 apex {
9923 name: "myapex",
9924 key: "myapex.key",
9925 compressible: true,
9926 updatable: false,
9927 }
9928
9929 apex_key {
9930 name: "myapex.key",
9931 public_key: "testkey.avbpubkey",
9932 private_key: "testkey.pem",
9933 }
9934
9935 java_test {
9936 name: "`+tc.name+`",
9937 srcs: ["a.java"],
9938 data: ["`+tc.ref+`"],
9939 }
9940 `,
9941 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9942 variables.CompressedApex = proptools.BoolPtr(true)
9943 }))
9944 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9945 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9946 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9947 })
9948 }
9949}
9950
satayev758968a2021-12-06 11:42:40 +00009951func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9952 preparer := android.GroupFixturePreparers(
9953 PrepareForTestWithApexBuildComponents,
9954 prepareForTestWithMyapex,
9955 java.PrepareForTestWithJavaSdkLibraryFiles,
9956 java.PrepareForTestWithJavaDefaultModules,
9957 android.PrepareForTestWithAndroidBuildComponents,
9958 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9959 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9960 )
9961
9962 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9963 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9964 preparer.RunTestWithBp(t, `
9965 apex {
9966 name: "myapex",
9967 key: "myapex.key",
9968 bootclasspath_fragments: ["mybootclasspathfragment"],
9969 min_sdk_version: "30",
9970 updatable: false,
9971 }
9972
9973 apex_key {
9974 name: "myapex.key",
9975 public_key: "testkey.avbpubkey",
9976 private_key: "testkey.pem",
9977 }
9978
9979 bootclasspath_fragment {
9980 name: "mybootclasspathfragment",
9981 contents: ["mybootclasspathlib"],
9982 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009983 hidden_api: {
9984 split_packages: ["*"],
9985 },
satayev758968a2021-12-06 11:42:40 +00009986 }
9987
9988 java_sdk_library {
9989 name: "mybootclasspathlib",
9990 srcs: ["mybootclasspathlib.java"],
9991 apex_available: ["myapex"],
9992 compile_dex: true,
9993 unsafe_ignore_missing_latest_api: true,
9994 min_sdk_version: "31",
9995 static_libs: ["util"],
9996 }
9997
9998 java_library {
9999 name: "util",
10000 srcs: ["a.java"],
10001 apex_available: ["myapex"],
10002 min_sdk_version: "31",
10003 static_libs: ["another_util"],
10004 }
10005
10006 java_library {
10007 name: "another_util",
10008 srcs: ["a.java"],
10009 min_sdk_version: "31",
10010 apex_available: ["myapex"],
10011 }
10012 `)
10013 })
10014
10015 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10016 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
10017 preparer.RunTestWithBp(t, `
10018 apex {
10019 name: "myapex",
10020 key: "myapex.key",
10021 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10022 min_sdk_version: "30",
10023 updatable: false,
10024 }
10025
10026 apex_key {
10027 name: "myapex.key",
10028 public_key: "testkey.avbpubkey",
10029 private_key: "testkey.pem",
10030 }
10031
10032 systemserverclasspath_fragment {
10033 name: "mysystemserverclasspathfragment",
10034 contents: ["mysystemserverclasspathlib"],
10035 apex_available: ["myapex"],
10036 }
10037
10038 java_sdk_library {
10039 name: "mysystemserverclasspathlib",
10040 srcs: ["mysystemserverclasspathlib.java"],
10041 apex_available: ["myapex"],
10042 compile_dex: true,
10043 min_sdk_version: "32",
10044 unsafe_ignore_missing_latest_api: true,
10045 static_libs: ["util"],
10046 }
10047
10048 java_library {
10049 name: "util",
10050 srcs: ["a.java"],
10051 apex_available: ["myapex"],
10052 min_sdk_version: "31",
10053 static_libs: ["another_util"],
10054 }
10055
10056 java_library {
10057 name: "another_util",
10058 srcs: ["a.java"],
10059 min_sdk_version: "31",
10060 apex_available: ["myapex"],
10061 }
10062 `)
10063 })
10064
10065 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10066 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
10067 RunTestWithBp(t, `
10068 apex {
10069 name: "myapex",
10070 key: "myapex.key",
10071 bootclasspath_fragments: ["mybootclasspathfragment"],
10072 min_sdk_version: "30",
10073 updatable: false,
10074 }
10075
10076 apex_key {
10077 name: "myapex.key",
10078 public_key: "testkey.avbpubkey",
10079 private_key: "testkey.pem",
10080 }
10081
10082 bootclasspath_fragment {
10083 name: "mybootclasspathfragment",
10084 contents: ["mybootclasspathlib"],
10085 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010086 hidden_api: {
10087 split_packages: ["*"],
10088 },
satayev758968a2021-12-06 11:42:40 +000010089 }
10090
10091 java_sdk_library {
10092 name: "mybootclasspathlib",
10093 srcs: ["mybootclasspathlib.java"],
10094 apex_available: ["myapex"],
10095 compile_dex: true,
10096 unsafe_ignore_missing_latest_api: true,
10097 }
10098 `)
10099 })
10100
10101 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10102 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10103 RunTestWithBp(t, `
10104 apex {
10105 name: "myapex",
10106 key: "myapex.key",
10107 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10108 min_sdk_version: "30",
10109 updatable: false,
10110 }
10111
10112 apex_key {
10113 name: "myapex.key",
10114 public_key: "testkey.avbpubkey",
10115 private_key: "testkey.pem",
10116 }
10117
10118 systemserverclasspath_fragment {
10119 name: "mysystemserverclasspathfragment",
10120 contents: ["mysystemserverclasspathlib"],
10121 apex_available: ["myapex"],
10122 }
10123
10124 java_sdk_library {
10125 name: "mysystemserverclasspathlib",
10126 srcs: ["mysystemserverclasspathlib.java"],
10127 apex_available: ["myapex"],
10128 compile_dex: true,
10129 unsafe_ignore_missing_latest_api: true,
10130 }
10131 `)
10132 })
10133}
10134
Jiakai Zhang6decef92022-01-12 17:56:19 +000010135// Verifies that the APEX depends on all the Make modules in the list.
10136func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10137 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10138 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010139 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010140 }
10141}
10142
10143// Verifies that the APEX does not depend on any of the Make modules in the list.
10144func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10145 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10146 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010147 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010148 }
10149}
10150
Cole Faust1021ccd2023-02-26 21:15:25 -080010151// TODO(b/193460475): Re-enable this test
10152//func TestApexStrictUpdtabilityLint(t *testing.T) {
10153// bpTemplate := `
10154// apex {
10155// name: "myapex",
10156// key: "myapex.key",
10157// java_libs: ["myjavalib"],
10158// updatable: %v,
10159// min_sdk_version: "29",
10160// }
10161// apex_key {
10162// name: "myapex.key",
10163// }
10164// java_library {
10165// name: "myjavalib",
10166// srcs: ["MyClass.java"],
10167// apex_available: [ "myapex" ],
10168// lint: {
10169// strict_updatability_linting: %v,
10170// },
10171// sdk_version: "current",
10172// min_sdk_version: "29",
10173// }
10174// `
10175// fs := android.MockFS{
10176// "lint-baseline.xml": nil,
10177// }
10178//
10179// testCases := []struct {
10180// testCaseName string
10181// apexUpdatable bool
10182// javaStrictUpdtabilityLint bool
10183// lintFileExists bool
10184// disallowedFlagExpected bool
10185// }{
10186// {
10187// testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10188// apexUpdatable: true,
10189// javaStrictUpdtabilityLint: true,
10190// lintFileExists: false,
10191// disallowedFlagExpected: false,
10192// },
10193// {
10194// testCaseName: "non-updatable apex respects strict_updatability of javalib",
10195// apexUpdatable: false,
10196// javaStrictUpdtabilityLint: false,
10197// lintFileExists: true,
10198// disallowedFlagExpected: false,
10199// },
10200// {
10201// testCaseName: "non-updatable apex respects strict updatability of javalib",
10202// apexUpdatable: false,
10203// javaStrictUpdtabilityLint: true,
10204// lintFileExists: true,
10205// disallowedFlagExpected: true,
10206// },
10207// {
10208// testCaseName: "updatable apex sets strict updatability of javalib to true",
10209// apexUpdatable: true,
10210// javaStrictUpdtabilityLint: false, // will be set to true by mutator
10211// lintFileExists: true,
10212// disallowedFlagExpected: true,
10213// },
10214// }
10215//
10216// for _, testCase := range testCases {
10217// bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
10218// fixtures := []android.FixturePreparer{}
10219// if testCase.lintFileExists {
10220// fixtures = append(fixtures, fs.AddToFixture())
10221// }
10222//
10223// result := testApex(t, bp, fixtures...)
10224// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10225// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10226// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10227//
10228// if disallowedFlagActual != testCase.disallowedFlagExpected {
10229// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10230// }
10231// }
10232//}
10233//
10234//func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10235// bp := `
10236// apex {
10237// name: "myapex",
10238// key: "myapex.key",
10239// java_libs: ["myjavalib"],
10240// updatable: true,
10241// min_sdk_version: "29",
10242// }
10243// apex_key {
10244// name: "myapex.key",
10245// }
10246// java_library {
10247// name: "myjavalib",
10248// srcs: ["MyClass.java"],
10249// apex_available: [ "myapex" ],
10250// sdk_version: "current",
10251// min_sdk_version: "29",
10252// }
10253// `
10254//
10255// testCases := []struct {
10256// testCaseName string
10257// moduleDirectory string
10258// disallowedFlagExpected bool
10259// }{
10260// {
10261// testCaseName: "lintable module defined outside libcore",
10262// moduleDirectory: "",
10263// disallowedFlagExpected: true,
10264// },
10265// {
10266// testCaseName: "lintable module defined in libcore root directory",
10267// moduleDirectory: "libcore/",
10268// disallowedFlagExpected: false,
10269// },
10270// {
10271// testCaseName: "lintable module defined in libcore child directory",
10272// moduleDirectory: "libcore/childdir/",
10273// disallowedFlagExpected: true,
10274// },
10275// }
10276//
10277// for _, testCase := range testCases {
10278// lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10279// bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10280// result := testApex(t, "", lintFileCreator, bpFileCreator)
10281// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10282// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10283// cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10284// disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10285//
10286// if disallowedFlagActual != testCase.disallowedFlagExpected {
10287// t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10288// }
10289// }
10290//}
10291//
10292//// checks transtive deps of an apex coming from bootclasspath_fragment
10293//func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10294// bp := `
10295// apex {
10296// name: "myapex",
10297// key: "myapex.key",
10298// bootclasspath_fragments: ["mybootclasspathfragment"],
10299// updatable: true,
10300// min_sdk_version: "29",
10301// }
10302// apex_key {
10303// name: "myapex.key",
10304// }
10305// bootclasspath_fragment {
10306// name: "mybootclasspathfragment",
10307// contents: ["myjavalib"],
10308// apex_available: ["myapex"],
10309// hidden_api: {
10310// split_packages: ["*"],
10311// },
10312// }
10313// java_library {
10314// name: "myjavalib",
10315// srcs: ["MyClass.java"],
10316// apex_available: [ "myapex" ],
10317// sdk_version: "current",
10318// min_sdk_version: "29",
10319// compile_dex: true,
10320// }
10321// `
10322// fs := android.MockFS{
10323// "lint-baseline.xml": nil,
10324// }
10325//
10326// result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10327// myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10328// sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
10329// if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10330// t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10331// }
10332//}
Spandan Das66773252022-01-15 00:23:18 +000010333
Spandan Das42e89502022-05-06 22:12:55 +000010334// updatable apexes should propagate updatable=true to its apps
10335func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10336 bp := `
10337 apex {
10338 name: "myapex",
10339 key: "myapex.key",
10340 updatable: %v,
10341 apps: [
10342 "myapp",
10343 ],
10344 min_sdk_version: "30",
10345 }
10346 apex_key {
10347 name: "myapex.key",
10348 }
10349 android_app {
10350 name: "myapp",
10351 updatable: %v,
10352 apex_available: [
10353 "myapex",
10354 ],
10355 sdk_version: "current",
10356 min_sdk_version: "30",
10357 }
10358 `
10359 testCases := []struct {
10360 name string
10361 apex_is_updatable_bp bool
10362 app_is_updatable_bp bool
10363 app_is_updatable_expected bool
10364 }{
10365 {
10366 name: "Non-updatable apex respects updatable property of non-updatable app",
10367 apex_is_updatable_bp: false,
10368 app_is_updatable_bp: false,
10369 app_is_updatable_expected: false,
10370 },
10371 {
10372 name: "Non-updatable apex respects updatable property of updatable app",
10373 apex_is_updatable_bp: false,
10374 app_is_updatable_bp: true,
10375 app_is_updatable_expected: true,
10376 },
10377 {
10378 name: "Updatable apex respects updatable property of updatable app",
10379 apex_is_updatable_bp: true,
10380 app_is_updatable_bp: true,
10381 app_is_updatable_expected: true,
10382 },
10383 {
10384 name: "Updatable apex sets updatable=true on non-updatable app",
10385 apex_is_updatable_bp: true,
10386 app_is_updatable_bp: false,
10387 app_is_updatable_expected: true,
10388 },
10389 }
10390 for _, testCase := range testCases {
10391 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10392 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10393 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10394 }
10395}
10396
Kiyoung Kim487689e2022-07-26 09:48:22 +090010397func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10398 bp := `
10399 apex {
10400 name: "myapex",
10401 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010402 native_shared_libs: ["libbaz"],
10403 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010404 min_sdk_version: "29",
10405 }
10406 apex_key {
10407 name: "myapex.key",
10408 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010409 cc_binary {
10410 name: "binfoo",
10411 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010412 apex_available: ["myapex"],
10413 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010414 recovery_available: false,
10415 }
10416 cc_library {
10417 name: "libbar",
10418 srcs: ["libbar.cc"],
10419 stubs: {
10420 symbol_file: "libbar.map.txt",
10421 versions: [
10422 "29",
10423 ],
10424 },
10425 }
10426 cc_library {
10427 name: "libbaz",
10428 srcs: ["libbaz.cc"],
10429 apex_available: ["myapex"],
10430 min_sdk_version: "29",
10431 stubs: {
10432 symbol_file: "libbaz.map.txt",
10433 versions: [
10434 "29",
10435 ],
10436 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010437 }
10438 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010439 name: "libbar",
10440 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010441 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010442 variants: ["apex.29"],
10443 }
10444 cc_api_variant {
10445 name: "libbar",
10446 variant: "apex",
10447 version: "29",
10448 src: "libbar_apex_29.so",
10449 }
10450 cc_api_library {
10451 name: "libbaz",
10452 src: "libbaz_stub.so",
10453 min_sdk_version: "29",
10454 variants: ["apex.29"],
10455 }
10456 cc_api_variant {
10457 name: "libbaz",
10458 variant: "apex",
10459 version: "29",
10460 src: "libbaz_apex_29.so",
10461 }
10462 cc_api_library {
10463 name: "libqux",
10464 src: "libqux_stub.so",
10465 min_sdk_version: "29",
10466 variants: ["apex.29"],
10467 }
10468 cc_api_variant {
10469 name: "libqux",
10470 variant: "apex",
10471 version: "29",
10472 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010473 }
10474 api_imports {
10475 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010476 apex_shared_libs: [
10477 "libbar",
10478 "libbaz",
10479 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010480 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010481 }
10482 `
10483 result := testApex(t, bp)
10484
10485 hasDep := func(m android.Module, wantDep android.Module) bool {
10486 t.Helper()
10487 var found bool
10488 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10489 if dep == wantDep {
10490 found = true
10491 }
10492 })
10493 return found
10494 }
10495
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010496 // Library defines stubs and cc_api_library should be used with cc_api_library
10497 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10498 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10499 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010500
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010501 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10502 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010503
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010504 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10505 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10506 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10507 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10508
10509 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10510 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10511 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10512 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10513 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10514
10515 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10516 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10517 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10518
10519 // cc_api_library defined without original library should be linked with cc_api_library
10520 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10521 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10522 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10523}
10524
10525func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10526 bp := `
10527 apex {
10528 name: "myapex",
10529 key: "myapex.key",
10530 native_shared_libs: ["libbar"],
10531 min_sdk_version: "29",
10532 }
10533 apex_key {
10534 name: "myapex.key",
10535 }
10536 cc_binary {
10537 name: "binfoo",
10538 shared_libs: ["libbar"],
10539 recovery_available: false,
10540 }
10541 cc_library {
10542 name: "libbar",
10543 srcs: ["libbar.cc"],
10544 apex_available: ["myapex"],
10545 min_sdk_version: "29",
10546 stubs: {
10547 symbol_file: "libbar.map.txt",
10548 versions: [
10549 "29",
10550 ],
10551 },
10552 }
10553 cc_api_library {
10554 name: "libbar",
10555 src: "libbar_stub.so",
10556 variants: ["apex.29"],
10557 }
10558 cc_api_variant {
10559 name: "libbar",
10560 variant: "apex",
10561 version: "29",
10562 src: "libbar_apex_29.so",
10563 }
10564 api_imports {
10565 name: "api_imports",
10566 apex_shared_libs: [
10567 "libbar",
10568 ],
10569 }
10570 `
10571
10572 result := testApex(t, bp)
10573
10574 hasDep := func(m android.Module, wantDep android.Module) bool {
10575 t.Helper()
10576 var found bool
10577 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10578 if dep == wantDep {
10579 found = true
10580 }
10581 })
10582 return found
10583 }
10584
10585 // Library defines stubs and cc_api_library should be used with cc_api_library
10586 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10587 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10588 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10589
10590 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10591 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10592
10593 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10594 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10595 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10596 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010597}
Dennis Shend4f5d932023-01-31 20:27:21 +000010598
10599func TestTrimmedApex(t *testing.T) {
10600 bp := `
10601 apex {
10602 name: "myapex",
10603 key: "myapex.key",
10604 native_shared_libs: ["libfoo","libbaz"],
10605 min_sdk_version: "29",
10606 trim_against: "mydcla",
10607 }
10608 apex {
10609 name: "mydcla",
10610 key: "myapex.key",
10611 native_shared_libs: ["libfoo","libbar"],
10612 min_sdk_version: "29",
10613 file_contexts: ":myapex-file_contexts",
10614 dynamic_common_lib_apex: true,
10615 }
10616 apex_key {
10617 name: "myapex.key",
10618 }
10619 cc_library {
10620 name: "libfoo",
10621 shared_libs: ["libc"],
10622 apex_available: ["myapex","mydcla"],
10623 min_sdk_version: "29",
10624 }
10625 cc_library {
10626 name: "libbar",
10627 shared_libs: ["libc"],
10628 apex_available: ["myapex","mydcla"],
10629 min_sdk_version: "29",
10630 }
10631 cc_library {
10632 name: "libbaz",
10633 shared_libs: ["libc"],
10634 apex_available: ["myapex","mydcla"],
10635 min_sdk_version: "29",
10636 }
10637 cc_api_library {
10638 name: "libc",
10639 src: "libc.so",
10640 min_sdk_version: "29",
10641 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010642 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010643 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010644 }
10645 api_imports {
10646 name: "api_imports",
10647 shared_libs: [
10648 "libc",
10649 ],
10650 header_libs: [],
10651 }
10652 `
10653 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010654 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010655 apexRule := module.MaybeRule("apexRule")
10656 if apexRule.Rule == nil {
10657 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10658 }
10659
10660 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010661 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010662 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10663 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10664 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10665 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10666}
Jingwen Chendea7a642023-03-28 11:30:50 +000010667
10668func TestCannedFsConfig(t *testing.T) {
10669 ctx := testApex(t, `
10670 apex {
10671 name: "myapex",
10672 key: "myapex.key",
10673 updatable: false,
10674 }
10675
10676 apex_key {
10677 name: "myapex.key",
10678 public_key: "testkey.avbpubkey",
10679 private_key: "testkey.pem",
10680 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010681 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010682 generateFsRule := mod.Rule("generateFsConfig")
10683 cmd := generateFsRule.RuleParams.Command
10684
10685 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10686}
10687
10688func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10689 ctx := testApex(t, `
10690 apex {
10691 name: "myapex",
10692 key: "myapex.key",
10693 canned_fs_config: "my_config",
10694 updatable: false,
10695 }
10696
10697 apex_key {
10698 name: "myapex.key",
10699 public_key: "testkey.avbpubkey",
10700 private_key: "testkey.pem",
10701 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010702 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010703 generateFsRule := mod.Rule("generateFsConfig")
10704 cmd := generateFsRule.RuleParams.Command
10705
10706 // Ensure that canned_fs_config has "cat my_config" at the end
10707 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10708}
Spandan Das20fce2d2023-04-12 17:21:39 +000010709
10710func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10711 testCases := []struct {
10712 desc string
10713 hasStubs bool
10714 apexAvailable string
10715 expectedError string
10716 }{
10717 {
10718 desc: "non-stub library can have multiple apex_available",
10719 hasStubs: false,
10720 apexAvailable: `["myapex", "otherapex"]`,
10721 },
10722 {
10723 desc: "stub library should not be available to anyapex",
10724 hasStubs: true,
10725 apexAvailable: `["//apex_available:anyapex"]`,
10726 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10727 },
10728 {
10729 desc: "stub library should not be available to multiple apexes",
10730 hasStubs: true,
10731 apexAvailable: `["myapex", "otherapex"]`,
10732 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10733 },
10734 {
10735 desc: "stub library can be available to a core apex and a test apex",
10736 hasStubs: true,
10737 apexAvailable: `["myapex", "test_myapex"]`,
10738 },
10739 }
10740 bpTemplate := `
10741 cc_library {
10742 name: "libfoo",
10743 %v
10744 apex_available: %v,
10745 }
10746 apex {
10747 name: "myapex",
10748 key: "apex.key",
10749 updatable: false,
10750 native_shared_libs: ["libfoo"],
10751 }
10752 apex {
10753 name: "otherapex",
10754 key: "apex.key",
10755 updatable: false,
10756 }
10757 apex_test {
10758 name: "test_myapex",
10759 key: "apex.key",
10760 updatable: false,
10761 native_shared_libs: ["libfoo"],
10762 }
10763 apex_key {
10764 name: "apex.key",
10765 }
10766 `
10767 for _, tc := range testCases {
10768 stubs := ""
10769 if tc.hasStubs {
10770 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10771 }
10772 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10773 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10774 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10775 })
10776 if tc.expectedError == "" {
10777 testApex(t, bp, mockFsFixturePreparer)
10778 } else {
10779 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10780 }
10781 }
10782}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010783
10784func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10785 context := android.GroupFixturePreparers(
10786 android.PrepareForIntegrationTestWithAndroid,
10787 cc.PrepareForIntegrationTestWithCc,
10788 PrepareForTestWithApexBuildComponents,
10789 prepareForTestWithMyapex,
10790 filesystem.PrepareForTestWithFilesystemBuildComponents,
10791 )
10792 result := context.RunTestWithBp(t, `
10793 android_system_image {
10794 name: "myfilesystem",
10795 deps: [
10796 "libfoo",
10797 ],
10798 linker_config_src: "linker.config.json",
10799 }
10800
10801 cc_library {
10802 name: "libfoo",
10803 shared_libs: [
10804 "libbar",
10805 ],
10806 stl: "none",
10807 }
10808
10809 cc_library {
10810 name: "libbar",
10811 stl: "none",
10812 apex_available: ["myapex"],
10813 }
10814
10815 apex {
10816 name: "myapex",
10817 native_shared_libs: ["libbar"],
10818 key: "myapex.key",
10819 updatable: false,
10820 }
10821
10822 apex_key {
10823 name: "myapex.key",
10824 public_key: "testkey.avbpubkey",
10825 private_key: "testkey.pem",
10826 }
10827 `)
10828
10829 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
10830 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10831 inputs.Strings(),
10832 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10833}
Yu Liueae7b362023-11-16 17:05:47 -080010834
10835var apex_default_bp = `
10836 apex_key {
10837 name: "myapex.key",
10838 public_key: "testkey.avbpubkey",
10839 private_key: "testkey.pem",
10840 }
10841
10842 filegroup {
10843 name: "myapex.manifest",
10844 srcs: ["apex_manifest.json"],
10845 }
10846
10847 filegroup {
10848 name: "myapex.androidmanifest",
10849 srcs: ["AndroidManifest.xml"],
10850 }
10851`
10852
10853func TestAconfigFilesJavaDeps(t *testing.T) {
10854 ctx := testApex(t, apex_default_bp+`
10855 apex {
10856 name: "myapex",
10857 manifest: ":myapex.manifest",
10858 androidManifest: ":myapex.androidmanifest",
10859 key: "myapex.key",
10860 java_libs: [
10861 "my_java_library_foo",
10862 "my_java_library_bar",
10863 ],
10864 updatable: false,
10865 }
10866
10867 java_library {
10868 name: "my_java_library_foo",
10869 srcs: ["foo/bar/MyClass.java"],
10870 sdk_version: "none",
10871 system_modules: "none",
10872 static_libs: ["my_java_aconfig_library_foo"],
10873 // TODO: remove //apex_available:platform
10874 apex_available: [
10875 "//apex_available:platform",
10876 "myapex",
10877 ],
10878 }
10879
10880 java_library {
10881 name: "my_java_library_bar",
10882 srcs: ["foo/bar/MyClass.java"],
10883 sdk_version: "none",
10884 system_modules: "none",
10885 static_libs: ["my_java_aconfig_library_bar"],
10886 // TODO: remove //apex_available:platform
10887 apex_available: [
10888 "//apex_available:platform",
10889 "myapex",
10890 ],
10891 }
10892
10893 aconfig_declarations {
10894 name: "my_aconfig_declarations_foo",
10895 package: "com.example.package",
10896 container: "myapex",
10897 srcs: ["foo.aconfig"],
10898 }
10899
10900 java_aconfig_library {
10901 name: "my_java_aconfig_library_foo",
10902 aconfig_declarations: "my_aconfig_declarations_foo",
10903 // TODO: remove //apex_available:platform
10904 apex_available: [
10905 "//apex_available:platform",
10906 "myapex",
10907 ],
10908 }
10909
10910 aconfig_declarations {
10911 name: "my_aconfig_declarations_bar",
10912 package: "com.example.package",
10913 container: "myapex",
10914 srcs: ["bar.aconfig"],
10915 }
10916
10917 java_aconfig_library {
10918 name: "my_java_aconfig_library_bar",
10919 aconfig_declarations: "my_aconfig_declarations_bar",
10920 // TODO: remove //apex_available:platform
10921 apex_available: [
10922 "//apex_available:platform",
10923 "myapex",
10924 ],
10925 }
10926 `)
10927
10928 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10929 s := mod.Rule("apexRule").Args["copy_commands"]
10930 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
10931 if len(copyCmds) != 5 {
10932 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10933 }
10934
10935 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
10936
10937 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10938 s = " " + combineAconfigRule.Args["cache_files"]
10939 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10940 if len(aconfigArgs) != 2 {
10941 t.Fatalf("Expected 2 commands, got %d in:\n%s", len(aconfigArgs), s)
10942 }
10943 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10944 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
10945
10946 buildParams := combineAconfigRule.BuildParams
10947 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10948 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
10949 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10950}
10951
10952func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10953 ctx := testApex(t, apex_default_bp+`
10954 apex {
10955 name: "myapex",
10956 manifest: ":myapex.manifest",
10957 androidManifest: ":myapex.androidmanifest",
10958 key: "myapex.key",
10959 java_libs: [
10960 "my_java_library_foo",
10961 ],
10962 native_shared_libs: [
10963 "my_cc_library_bar",
10964 ],
10965 binaries: [
10966 "my_cc_binary_baz",
10967 ],
10968 updatable: false,
10969 }
10970
10971 java_library {
10972 name: "my_java_library_foo",
10973 srcs: ["foo/bar/MyClass.java"],
10974 sdk_version: "none",
10975 system_modules: "none",
10976 static_libs: ["my_java_aconfig_library_foo"],
10977 // TODO: remove //apex_available:platform
10978 apex_available: [
10979 "//apex_available:platform",
10980 "myapex",
10981 ],
10982 }
10983
10984 cc_library {
10985 name: "my_cc_library_bar",
10986 srcs: ["foo/bar/MyClass.cc"],
10987 static_libs: ["my_cc_aconfig_library_bar"],
10988 // TODO: remove //apex_available:platform
10989 apex_available: [
10990 "//apex_available:platform",
10991 "myapex",
10992 ],
10993 }
10994
10995 cc_binary {
10996 name: "my_cc_binary_baz",
10997 srcs: ["foo/bar/MyClass.cc"],
10998 static_libs: ["my_cc_aconfig_library_baz"],
10999 // TODO: remove //apex_available:platform
11000 apex_available: [
11001 "//apex_available:platform",
11002 "myapex",
11003 ],
11004 }
11005
11006 aconfig_declarations {
11007 name: "my_aconfig_declarations_foo",
11008 package: "com.example.package",
11009 container: "myapex",
11010 srcs: ["foo.aconfig"],
11011 }
11012
11013 java_aconfig_library {
11014 name: "my_java_aconfig_library_foo",
11015 aconfig_declarations: "my_aconfig_declarations_foo",
11016 // TODO: remove //apex_available:platform
11017 apex_available: [
11018 "//apex_available:platform",
11019 "myapex",
11020 ],
11021 }
11022
11023 aconfig_declarations {
11024 name: "my_aconfig_declarations_bar",
11025 package: "com.example.package",
11026 container: "myapex",
11027 srcs: ["bar.aconfig"],
11028 }
11029
11030 cc_aconfig_library {
11031 name: "my_cc_aconfig_library_bar",
11032 aconfig_declarations: "my_aconfig_declarations_bar",
11033 // TODO: remove //apex_available:platform
11034 apex_available: [
11035 "//apex_available:platform",
11036 "myapex",
11037 ],
11038 }
11039
11040 aconfig_declarations {
11041 name: "my_aconfig_declarations_baz",
11042 package: "com.example.package",
11043 container: "myapex",
11044 srcs: ["baz.aconfig"],
11045 }
11046
11047 cc_aconfig_library {
11048 name: "my_cc_aconfig_library_baz",
11049 aconfig_declarations: "my_aconfig_declarations_baz",
11050 // TODO: remove //apex_available:platform
11051 apex_available: [
11052 "//apex_available:platform",
11053 "myapex",
11054 ],
11055 }
11056
11057 cc_library {
11058 name: "server_configurable_flags",
11059 srcs: ["server_configurable_flags.cc"],
11060 }
11061 `)
11062
11063 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11064 s := mod.Rule("apexRule").Args["copy_commands"]
11065 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
11066 if len(copyCmds) != 9 {
11067 t.Fatalf("Expected 9 commands, got %d in:\n%s", len(copyCmds), s)
11068 }
11069
11070 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex$")
11071
11072 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11073 s = " " + combineAconfigRule.Args["cache_files"]
11074 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11075 if len(aconfigArgs) != 3 {
11076 t.Fatalf("Expected 3 commands, got %d in:\n%s", len(aconfigArgs), s)
11077 }
11078 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11079 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_bar/intermediate.pb")
11080 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_baz/intermediate.pb")
11081
11082 buildParams := combineAconfigRule.BuildParams
11083 if len(buildParams.Inputs) != 3 {
11084 t.Fatalf("Expected 3 input, got %d", len(buildParams.Inputs))
11085 }
11086 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11087 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_bar/intermediate.pb")
11088 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_baz/intermediate.pb")
11089 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11090}
11091
11092func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11093 ctx := testApex(t, apex_default_bp+`
11094 apex {
11095 name: "myapex",
11096 manifest: ":myapex.manifest",
11097 androidManifest: ":myapex.androidmanifest",
11098 key: "myapex.key",
11099 java_libs: [
11100 "my_java_library_foo",
11101 "other_java_library_bar",
11102 ],
11103 updatable: false,
11104 }
11105
11106 java_library {
11107 name: "my_java_library_foo",
11108 srcs: ["foo/bar/MyClass.java"],
11109 sdk_version: "none",
11110 system_modules: "none",
11111 static_libs: ["my_java_aconfig_library_foo"],
11112 // TODO: remove //apex_available:platform
11113 apex_available: [
11114 "//apex_available:platform",
11115 "myapex",
11116 ],
11117 }
11118
11119 java_library {
11120 name: "other_java_library_bar",
11121 srcs: ["foo/bar/MyClass.java"],
11122 sdk_version: "none",
11123 system_modules: "none",
11124 static_libs: ["other_java_aconfig_library_bar"],
11125 // TODO: remove //apex_available:platform
11126 apex_available: [
11127 "//apex_available:platform",
11128 "myapex",
11129 ],
11130 }
11131
11132 aconfig_declarations {
11133 name: "my_aconfig_declarations_foo",
11134 package: "com.example.package",
11135 container: "myapex",
11136 srcs: ["foo.aconfig"],
11137 }
11138
11139 java_aconfig_library {
11140 name: "my_java_aconfig_library_foo",
11141 aconfig_declarations: "my_aconfig_declarations_foo",
11142 // TODO: remove //apex_available:platform
11143 apex_available: [
11144 "//apex_available:platform",
11145 "myapex",
11146 ],
11147 }
11148
11149 aconfig_declarations {
11150 name: "other_aconfig_declarations_bar",
11151 package: "com.example.package",
11152 container: "otherapex",
11153 srcs: ["bar.aconfig"],
11154 }
11155
11156 java_aconfig_library {
11157 name: "other_java_aconfig_library_bar",
11158 aconfig_declarations: "other_aconfig_declarations_bar",
11159 // TODO: remove //apex_available:platform
11160 apex_available: [
11161 "//apex_available:platform",
11162 "myapex",
11163 ],
11164 }
11165 `)
11166
11167 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11168 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11169 s := " " + combineAconfigRule.Args["cache_files"]
11170 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11171 if len(aconfigArgs) != 1 {
11172 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11173 }
11174 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11175
11176 buildParams := combineAconfigRule.BuildParams
11177 if len(buildParams.Inputs) != 1 {
11178 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11179 }
11180 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11181 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11182}
11183
11184func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11185 ctx := testApex(t, apex_default_bp+`
11186 apex {
11187 name: "myapex",
11188 manifest: ":myapex.manifest",
11189 androidManifest: ":myapex.androidmanifest",
11190 key: "myapex.key",
11191 java_libs: [
11192 "my_java_library_foo",
11193 "my_java_library_bar",
11194 ],
11195 updatable: false,
11196 }
11197
11198 java_library {
11199 name: "my_java_library_foo",
11200 srcs: ["foo/bar/MyClass.java"],
11201 sdk_version: "none",
11202 system_modules: "none",
11203 static_libs: ["my_java_aconfig_library_foo"],
11204 // TODO: remove //apex_available:platform
11205 apex_available: [
11206 "//apex_available:platform",
11207 "myapex",
11208 ],
11209 }
11210
11211 java_library {
11212 name: "my_java_library_bar",
11213 srcs: ["foo/bar/MyClass.java"],
11214 sdk_version: "none",
11215 system_modules: "none",
11216 static_libs: ["my_java_aconfig_library_bar"],
11217 // TODO: remove //apex_available:platform
11218 apex_available: [
11219 "//apex_available:platform",
11220 "myapex",
11221 ],
11222 }
11223
11224 aconfig_declarations {
11225 name: "my_aconfig_declarations_foo",
11226 package: "com.example.package",
11227 container: "myapex",
11228 srcs: ["foo.aconfig"],
11229 }
11230
11231 java_aconfig_library {
11232 name: "my_java_aconfig_library_foo",
11233 aconfig_declarations: "my_aconfig_declarations_foo",
11234 // TODO: remove //apex_available:platform
11235 apex_available: [
11236 "//apex_available:platform",
11237 "myapex",
11238 ],
11239 }
11240
11241 java_aconfig_library {
11242 name: "my_java_aconfig_library_bar",
11243 aconfig_declarations: "my_aconfig_declarations_foo",
11244 // TODO: remove //apex_available:platform
11245 apex_available: [
11246 "//apex_available:platform",
11247 "myapex",
11248 ],
11249 }
11250 `)
11251
11252 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11253 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11254 s := " " + combineAconfigRule.Args["cache_files"]
11255 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11256 if len(aconfigArgs) != 1 {
11257 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11258 }
11259 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11260
11261 buildParams := combineAconfigRule.BuildParams
11262 if len(buildParams.Inputs) != 1 {
11263 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11264 }
11265 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11266 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11267}