blob: f36467ef4bd312931d468df972189d2126dfeab9 [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"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
86 return android.FixtureModifyConfig(func(config android.Config) {
Jooyung Han344d5432019-08-23 11:17:39 +090087 for k, v := range targets {
88 config.Targets[k] = v
89 }
Paul Duffin810f33d2021-03-09 14:12:32 +000090 })
Jooyung Han344d5432019-08-23 11:17:39 +090091}
92
Jooyung Han35155c42020-02-06 17:33:20 +090093// withNativeBridgeTargets sets configuration with targets including:
94// - X86_64 (primary)
95// - X86 (secondary)
96// - Arm64 on X86_64 (native bridge)
97// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000098var withNativeBridgeEnabled = android.FixtureModifyConfig(
99 func(config android.Config) {
100 config.Targets[android.Android] = []android.Target{
101 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
102 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
103 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
104 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
105 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
106 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
107 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
108 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
109 }
110 },
111)
112
113func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
114 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
115 variables.ManifestPackageNameOverrides = specs
116 })
Jooyung Han35155c42020-02-06 17:33:20 +0900117}
118
Albert Martineefabcf2022-03-21 20:11:16 +0000119func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
120 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
121 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
122 })
123}
124
Paul Duffin810f33d2021-03-09 14:12:32 +0000125var withBinder32bit = android.FixtureModifyProductVariables(
126 func(variables android.FixtureProductVariables) {
127 variables.Binder32bit = proptools.BoolPtr(true)
128 },
129)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900130
Paul Duffin810f33d2021-03-09 14:12:32 +0000131var withUnbundledBuild = android.FixtureModifyProductVariables(
132 func(variables android.FixtureProductVariables) {
133 variables.Unbundled_build = proptools.BoolPtr(true)
134 },
135)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900136
Paul Duffin284165a2021-03-29 01:50:31 +0100137// Legacy preparer used for running tests within the apex package.
138//
139// This includes everything that was needed to run any test in the apex package prior to the
140// introduction of the test fixtures. Tests that are being converted to use fixtures directly
141// rather than through the testApex...() methods should avoid using this and instead use the
142// various preparers directly, using android.GroupFixturePreparers(...) to group them when
143// necessary.
144//
145// deprecated
146var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000147 // General preparers in alphabetical order as test infrastructure will enforce correct
148 // registration order.
149 android.PrepareForTestWithAndroidBuildComponents,
150 bpf.PrepareForTestWithBpf,
151 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100152 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000153 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
154 rust.PrepareForTestWithRustDefaultModules,
155 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800156 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000157
158 PrepareForTestWithApexBuildComponents,
159
160 // Additional apex test specific preparers.
161 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
162 filegroup {
163 name: "myapex-file_contexts",
164 srcs: [
165 "apex/myapex-file_contexts",
166 ],
167 }
168 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000169 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000170 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000171 "a.java": nil,
172 "PrebuiltAppFoo.apk": nil,
173 "PrebuiltAppFooPriv.apk": nil,
174 "apex_manifest.json": nil,
175 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000176 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
177 "system/sepolicy/apex/myapex2-file_contexts": nil,
178 "system/sepolicy/apex/otherapex-file_contexts": nil,
179 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
180 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700181 "mylib.cpp": nil,
182 "mytest.cpp": nil,
183 "mytest1.cpp": nil,
184 "mytest2.cpp": nil,
185 "mytest3.cpp": nil,
186 "myprebuilt": nil,
187 "my_include": nil,
188 "foo/bar/MyClass.java": nil,
189 "prebuilt.jar": nil,
190 "prebuilt.so": nil,
191 "vendor/foo/devkeys/test.x509.pem": nil,
192 "vendor/foo/devkeys/test.pk8": nil,
193 "testkey.x509.pem": nil,
194 "testkey.pk8": nil,
195 "testkey.override.x509.pem": nil,
196 "testkey.override.pk8": nil,
197 "vendor/foo/devkeys/testkey.avbpubkey": nil,
198 "vendor/foo/devkeys/testkey.pem": nil,
199 "NOTICE": nil,
200 "custom_notice": nil,
201 "custom_notice_for_static_lib": nil,
202 "testkey2.avbpubkey": nil,
203 "testkey2.pem": nil,
204 "myapex-arm64.apex": nil,
205 "myapex-arm.apex": nil,
206 "myapex.apks": nil,
207 "frameworks/base/api/current.txt": nil,
208 "framework/aidl/a.aidl": nil,
209 "dummy.txt": nil,
210 "baz": nil,
211 "bar/baz": nil,
212 "testdata/baz": nil,
213 "AppSet.apks": nil,
214 "foo.rs": nil,
215 "libfoo.jar": nil,
216 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000217 },
218 ),
219
220 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000221 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"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000228 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000229 }),
230)
231
Paul Duffin52bfaa42021-03-23 23:40:12 +0000232var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
233 "system/sepolicy/apex/myapex-file_contexts": nil,
234})
235
Jooyung Han643adc42020-02-27 13:50:06 +0900236// ensure that 'result' equals 'expected'
237func ensureEquals(t *testing.T, result string, expected string) {
238 t.Helper()
239 if result != expected {
240 t.Errorf("%q != %q", expected, result)
241 }
242}
243
Jiyong Park25fc6a92018-11-18 18:02:45 +0900244// ensure that 'result' contains 'expected'
245func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900246 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900247 if !strings.Contains(result, expected) {
248 t.Errorf("%q is not found in %q", expected, result)
249 }
250}
251
Liz Kammer5bd365f2020-05-27 15:15:11 -0700252// ensure that 'result' contains 'expected' exactly one time
253func ensureContainsOnce(t *testing.T, result string, expected string) {
254 t.Helper()
255 count := strings.Count(result, expected)
256 if count != 1 {
257 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
258 }
259}
260
Jiyong Park25fc6a92018-11-18 18:02:45 +0900261// ensures that 'result' does not contain 'notExpected'
262func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900263 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900264 if strings.Contains(result, notExpected) {
265 t.Errorf("%q is found in %q", notExpected, result)
266 }
267}
268
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700269func ensureMatches(t *testing.T, result string, expectedRex string) {
270 ok, err := regexp.MatchString(expectedRex, result)
271 if err != nil {
272 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
273 return
274 }
275 if !ok {
276 t.Errorf("%s does not match regular expession %s", result, expectedRex)
277 }
278}
279
Jiyong Park25fc6a92018-11-18 18:02:45 +0900280func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900281 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900282 if !android.InList(expected, result) {
283 t.Errorf("%q is not found in %v", expected, result)
284 }
285}
286
287func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900288 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900289 if android.InList(notExpected, result) {
290 t.Errorf("%q is found in %v", notExpected, result)
291 }
292}
293
Jooyung Hane1633032019-08-01 17:41:43 +0900294func ensureListEmpty(t *testing.T, result []string) {
295 t.Helper()
296 if len(result) > 0 {
297 t.Errorf("%q is expected to be empty", result)
298 }
299}
300
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000301func ensureListNotEmpty(t *testing.T, result []string) {
302 t.Helper()
303 if len(result) == 0 {
304 t.Errorf("%q is expected to be not empty", result)
305 }
306}
307
Jiyong Park25fc6a92018-11-18 18:02:45 +0900308// Minimal test
309func TestBasicApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800310 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900311 apex_defaults {
312 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900313 manifest: ":myapex.manifest",
314 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900315 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900316 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900317 native_shared_libs: [
318 "mylib",
319 "libfoo.ffi",
320 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900321 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800322 multilib: {
323 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900324 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800325 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900326 },
Jiyong Park77acec62020-06-01 21:39:15 +0900327 java_libs: [
328 "myjar",
329 "myjar_dex",
330 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000331 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900332 }
333
Jiyong Park30ca9372019-02-07 16:27:23 +0900334 apex {
335 name: "myapex",
336 defaults: ["myapex-defaults"],
337 }
338
Jiyong Park25fc6a92018-11-18 18:02:45 +0900339 apex_key {
340 name: "myapex.key",
341 public_key: "testkey.avbpubkey",
342 private_key: "testkey.pem",
343 }
344
Jiyong Park809bb722019-02-13 21:33:49 +0900345 filegroup {
346 name: "myapex.manifest",
347 srcs: ["apex_manifest.json"],
348 }
349
350 filegroup {
351 name: "myapex.androidmanifest",
352 srcs: ["AndroidManifest.xml"],
353 }
354
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 cc_library {
356 name: "mylib",
357 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900358 shared_libs: [
359 "mylib2",
360 "libbar.ffi",
361 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900362 system_shared_libs: [],
363 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000364 // TODO: remove //apex_available:platform
365 apex_available: [
366 "//apex_available:platform",
367 "myapex",
368 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900369 }
370
Alex Light3d673592019-01-18 14:37:31 -0800371 cc_binary {
372 name: "foo",
373 srcs: ["mylib.cpp"],
374 compile_multilib: "both",
375 multilib: {
376 lib32: {
377 suffix: "32",
378 },
379 lib64: {
380 suffix: "64",
381 },
382 },
383 symlinks: ["foo_link_"],
384 symlink_preferred_arch: true,
385 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800386 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900387 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700388 }
389
Jiyong Park99644e92020-11-17 22:21:02 +0900390 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000391 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900392 srcs: ["foo.rs"],
393 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400394 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900395 apex_available: ["myapex"],
396 }
397
398 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000399 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900400 srcs: ["foo.rs"],
401 crate_name: "foo",
402 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900403 shared_libs: ["libfoo.shared_from_rust"],
404 }
405
406 cc_library_shared {
407 name: "libfoo.shared_from_rust",
408 srcs: ["mylib.cpp"],
409 system_shared_libs: [],
410 stl: "none",
411 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900412 }
413
414 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000415 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900421 rust_ffi_shared {
422 name: "libfoo.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "foo",
425 apex_available: ["myapex"],
426 }
427
428 rust_ffi_shared {
429 name: "libbar.ffi",
430 srcs: ["foo.rs"],
431 crate_name: "bar",
432 apex_available: ["myapex"],
433 }
434
Paul Duffindddd5462020-04-07 15:25:44 +0100435 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900436 name: "mylib2",
437 srcs: ["mylib.cpp"],
438 system_shared_libs: [],
439 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900440 static_libs: ["libstatic"],
441 // TODO: remove //apex_available:platform
442 apex_available: [
443 "//apex_available:platform",
444 "myapex",
445 ],
446 }
447
Paul Duffindddd5462020-04-07 15:25:44 +0100448 cc_prebuilt_library_shared {
449 name: "mylib2",
450 srcs: ["prebuilt.so"],
451 // TODO: remove //apex_available:platform
452 apex_available: [
453 "//apex_available:platform",
454 "myapex",
455 ],
456 }
457
Jiyong Park9918e1a2020-03-17 19:16:40 +0900458 cc_library_static {
459 name: "libstatic",
460 srcs: ["mylib.cpp"],
461 system_shared_libs: [],
462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000463 // TODO: remove //apex_available:platform
464 apex_available: [
465 "//apex_available:platform",
466 "myapex",
467 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900468 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469
470 java_library {
471 name: "myjar",
472 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900473 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900474 sdk_version: "none",
475 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900477 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000478 // TODO: remove //apex_available:platform
479 apex_available: [
480 "//apex_available:platform",
481 "myapex",
482 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 }
484
Jiyong Park77acec62020-06-01 21:39:15 +0900485 dex_import {
486 name: "myjar_dex",
487 jars: ["prebuilt.jar"],
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
492 }
493
Jiyong Park7f7766d2019-07-25 22:02:35 +0900494 java_library {
495 name: "myotherjar",
496 srcs: ["foo/bar/MyClass.java"],
497 sdk_version: "none",
498 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900499 // TODO: remove //apex_available:platform
500 apex_available: [
501 "//apex_available:platform",
502 "myapex",
503 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900504 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900505
506 java_library {
507 name: "mysharedjar",
508 srcs: ["foo/bar/MyClass.java"],
509 sdk_version: "none",
510 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900511 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900512 `)
513
Jooyung Hana0503a52023-08-23 13:12:50 +0900514 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900515
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900516 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900517 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700518 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900519 var builder strings.Builder
520 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
521
522 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000523 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900524 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
525
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526 optFlags := apexRule.Args["opt_flags"]
527 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700528 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900529 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900530
Jiyong Park25fc6a92018-11-18 18:02:45 +0900531 copyCmds := apexRule.Args["copy_commands"]
532
533 // Ensure that main rule creates an output
534 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
535
536 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700537 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
538 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900540 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900541 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900542
543 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
545 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900550
551 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800552 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
553 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900554 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900555 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900556 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
558 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900560 // .. but not for java libs
561 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900562 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800563
Colin Cross7113d202019-11-20 16:39:12 -0800564 // Ensure that the platform variant ends with _shared or _common
565 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
566 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
568 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900569 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
570
571 // Ensure that dynamic dependency to java libs are not included
572 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800573
574 // Ensure that all symlinks are present.
575 found_foo_link_64 := false
576 found_foo := false
577 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900578 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800579 if strings.HasSuffix(cmd, "bin/foo") {
580 found_foo = true
581 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
582 found_foo_link_64 = true
583 }
584 }
585 }
586 good := found_foo && found_foo_link_64
587 if !good {
588 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
589 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900590
Colin Crossf61d03d2023-11-02 16:56:39 -0700591 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
592 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100593 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100594 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
595 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
596 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100597
Colin Crossf61d03d2023-11-02 16:56:39 -0700598 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
599 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100600 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100601 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
602 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
603 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800604}
605
Jooyung Hanf21c7972019-12-16 22:32:06 +0900606func TestDefaults(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800607 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608 apex_defaults {
609 name: "myapex-defaults",
610 key: "myapex.key",
611 prebuilts: ["myetc"],
612 native_shared_libs: ["mylib"],
613 java_libs: ["myjar"],
614 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900615 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800616 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000617 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900618 }
619
620 prebuilt_etc {
621 name: "myetc",
622 src: "myprebuilt",
623 }
624
625 apex {
626 name: "myapex",
627 defaults: ["myapex-defaults"],
628 }
629
630 apex_key {
631 name: "myapex.key",
632 public_key: "testkey.avbpubkey",
633 private_key: "testkey.pem",
634 }
635
636 cc_library {
637 name: "mylib",
638 system_shared_libs: [],
639 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000640 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900641 }
642
643 java_library {
644 name: "myjar",
645 srcs: ["foo/bar/MyClass.java"],
646 sdk_version: "none",
647 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000648 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800689 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900690 apex {
691 name: "myapex",
692 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000693 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 }
695
696 apex_key {
697 name: "myapex.key",
698 public_key: "testkey.avbpubkey",
699 private_key: "testkey.pem",
700 }
701 `)
702
Jooyung Hana0503a52023-08-23 13:12:50 +0900703 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900704 args := module.Rule("apexRule").Args
705 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
706 t.Error("manifest should be apex_manifest.pb, but " + manifest)
707 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900708}
709
Liz Kammer4854a7d2021-05-27 14:28:27 -0400710func TestApexManifestMinSdkVersion(t *testing.T) {
711 ctx := testApex(t, `
712 apex_defaults {
713 name: "my_defaults",
714 key: "myapex.key",
715 product_specific: true,
716 file_contexts: ":my-file-contexts",
717 updatable: false,
718 }
719 apex {
720 name: "myapex_30",
721 min_sdk_version: "30",
722 defaults: ["my_defaults"],
723 }
724
725 apex {
726 name: "myapex_current",
727 min_sdk_version: "current",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_none",
733 defaults: ["my_defaults"],
734 }
735
736 apex_key {
737 name: "myapex.key",
738 public_key: "testkey.avbpubkey",
739 private_key: "testkey.pem",
740 }
741
742 filegroup {
743 name: "my-file-contexts",
744 srcs: ["product_specific_file_contexts"],
745 }
746 `, withFiles(map[string][]byte{
747 "product_specific_file_contexts": nil,
748 }), android.FixtureModifyProductVariables(
749 func(variables android.FixtureProductVariables) {
750 variables.Unbundled_build = proptools.BoolPtr(true)
751 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
752 }), android.FixtureMergeEnv(map[string]string{
753 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
754 }))
755
756 testCases := []struct {
757 module string
758 minSdkVersion string
759 }{
760 {
761 module: "myapex_30",
762 minSdkVersion: "30",
763 },
764 {
765 module: "myapex_current",
766 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
767 },
768 {
769 module: "myapex_none",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 }
773 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900774 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400775 args := module.Rule("apexRule").Args
776 optFlags := args["opt_flags"]
777 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
778 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
779 }
780 }
781}
782
Jihoon Kang842b9992024-02-08 01:41:51 +0000783func TestApexWithDessertSha(t *testing.T) {
784 ctx := testApex(t, `
785 apex_defaults {
786 name: "my_defaults",
787 key: "myapex.key",
788 product_specific: true,
789 file_contexts: ":my-file-contexts",
790 updatable: false,
791 }
792 apex {
793 name: "myapex_30",
794 min_sdk_version: "30",
795 defaults: ["my_defaults"],
796 }
797
798 apex {
799 name: "myapex_current",
800 min_sdk_version: "current",
801 defaults: ["my_defaults"],
802 }
803
804 apex {
805 name: "myapex_none",
806 defaults: ["my_defaults"],
807 }
808
809 apex_key {
810 name: "myapex.key",
811 public_key: "testkey.avbpubkey",
812 private_key: "testkey.pem",
813 }
814
815 filegroup {
816 name: "my-file-contexts",
817 srcs: ["product_specific_file_contexts"],
818 }
819 `, withFiles(map[string][]byte{
820 "product_specific_file_contexts": nil,
821 }), android.FixtureModifyProductVariables(
822 func(variables android.FixtureProductVariables) {
823 variables.Unbundled_build = proptools.BoolPtr(true)
824 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
825 }), android.FixtureMergeEnv(map[string]string{
826 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
827 }))
828
829 testCases := []struct {
830 module string
831 minSdkVersion string
832 }{
833 {
834 module: "myapex_30",
835 minSdkVersion: "30",
836 },
837 {
838 module: "myapex_current",
839 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
840 },
841 {
842 module: "myapex_none",
843 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
844 },
845 }
846 for _, tc := range testCases {
847 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
848 args := module.Rule("apexRule").Args
849 optFlags := args["opt_flags"]
850 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
851 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
852 }
853 }
854}
855
Jooyung Hanaf730952023-02-28 14:13:38 +0900856func TestFileContexts(t *testing.T) {
Jooyung Hanbe953902023-05-31 16:42:16 +0900857 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900858 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900859 if vendor {
860 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900861 }
862 ctx := testApex(t, `
863 apex {
864 name: "myapex",
865 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900866 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900867 `+prop+`
868 }
869
870 apex_key {
871 name: "myapex.key",
872 public_key: "testkey.avbpubkey",
873 private_key: "testkey.pem",
874 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900875 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900876
Jooyung Hana0503a52023-08-23 13:12:50 +0900877 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900878 if vendor {
879 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
880 rule.RuleParams.Command,
881 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900883 android.AssertStringDoesContain(t, "should force-label as system_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 }
887 }
888}
889
Jiyong Park25fc6a92018-11-18 18:02:45 +0900890func TestApexWithStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -0800891 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892 apex {
893 name: "myapex",
894 key: "myapex.key",
895 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900896 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000897 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900898 }
899
900 apex_key {
901 name: "myapex.key",
902 public_key: "testkey.avbpubkey",
903 private_key: "testkey.pem",
904 }
905
906 cc_library {
907 name: "mylib",
908 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000909 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900910 system_shared_libs: [],
911 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000912 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900913 }
914
915 cc_library {
916 name: "mylib2",
917 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900918 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900919 system_shared_libs: [],
920 stl: "none",
921 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000922 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900923 versions: ["1", "2", "3"],
924 },
925 }
926
927 cc_library {
928 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900929 srcs: ["mylib.cpp"],
930 shared_libs: ["mylib4"],
931 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900932 stl: "none",
933 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000934 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 versions: ["10", "11", "12"],
936 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000937 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900938 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900939
940 cc_library {
941 name: "mylib4",
942 srcs: ["mylib.cpp"],
943 system_shared_libs: [],
944 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000945 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900946 }
Jiyong Park105dc322021-06-11 17:22:09 +0900947
Spandan Das357ffcc2024-07-24 18:07:48 +0000948 cc_prebuilt_library_shared {
949 name: "my_prebuilt_platform_lib",
950 stubs: {
951 symbol_file: "my_prebuilt_platform_lib.map.txt",
952 versions: ["1", "2", "3"],
953 },
954 srcs: ["foo.so"],
955 }
956
957 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
958 cc_prebuilt_library_shared {
959 name: "my_prebuilt_platform_stub_only_lib",
960 stubs: {
961 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
962 versions: ["1", "2", "3"],
963 }
964 }
965
Jiyong Park105dc322021-06-11 17:22:09 +0900966 rust_binary {
967 name: "foo.rust",
968 srcs: ["foo.rs"],
969 shared_libs: ["libfoo.shared_from_rust"],
970 prefer_rlib: true,
971 apex_available: ["myapex"],
972 }
973
974 cc_library_shared {
975 name: "libfoo.shared_from_rust",
976 srcs: ["mylib.cpp"],
977 system_shared_libs: [],
978 stl: "none",
979 stubs: {
980 versions: ["10", "11", "12"],
981 },
982 }
983
Jiyong Park25fc6a92018-11-18 18:02:45 +0900984 `)
985
Jooyung Hana0503a52023-08-23 13:12:50 +0900986 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900987 copyCmds := apexRule.Args["copy_commands"]
988
989 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800990 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900991
992 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800993 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900994
995 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -0800996 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900997
Colin Crossaede88c2020-08-11 12:17:01 -0700998 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001001 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001003 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // 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 -07001006 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001008 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001009
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001010 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1011 // is replaced by sharing of "cFlags" in cc/builder.go.
1012 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1013 // module variable representing "cflags". So it was not detected by ensureNotContains.
1014 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1015 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1016 // including the original cflags's "-include mylib.h".
1017 //
Jiyong Park64379952018-12-13 18:37:29 +09001018 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001019 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1020 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001021
Jiyong Park85cc35a2022-07-17 11:30:47 +09001022 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1023 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1024 // Ensure that genstub for apex-provided lib is invoked with --apex
1025 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001026
Jooyung Hana0503a52023-08-23 13:12:50 +09001027 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001028 "lib64/mylib.so",
1029 "lib64/mylib3.so",
1030 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001031 "bin/foo.rust",
1032 "lib64/libc++.so", // by the implicit dependency from foo.rust
1033 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001034 })
Jiyong Park105dc322021-06-11 17:22:09 +09001035
1036 // Ensure that stub dependency from a rust module is not included
1037 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1038 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001039 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001040 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1041 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001042
Jooyung Hana0503a52023-08-23 13:12:50 +09001043 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001044 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001045
1046 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1047 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1048 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1049 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1050 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1051 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1052
1053 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1054 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1055 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1056 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1057 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1058 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001059}
1060
Jooyung Han20348752023-12-05 15:23:56 +09001061func TestApexShouldNotEmbedStubVariant(t *testing.T) {
1062 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1063 apex {
1064 name: "myapex",
1065 key: "myapex.key",
1066 vendor: true,
1067 updatable: false,
1068 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1069 }
1070
1071 apex_key {
1072 name: "myapex.key",
1073 public_key: "testkey.avbpubkey",
1074 private_key: "testkey.pem",
1075 }
1076
1077 cc_library {
1078 name: "libbar",
1079 srcs: ["mylib.cpp"],
1080 llndk: {
1081 symbol_file: "libbar.map.txt",
1082 }
1083 }
1084 `)
1085}
1086
Jiyong Park1bc84122021-06-22 20:23:05 +09001087func TestApexCanUsePrivateApis(t *testing.T) {
1088 ctx := testApex(t, `
1089 apex {
1090 name: "myapex",
1091 key: "myapex.key",
1092 native_shared_libs: ["mylib"],
1093 binaries: ["foo.rust"],
1094 updatable: false,
1095 platform_apis: true,
1096 }
1097
1098 apex_key {
1099 name: "myapex.key",
1100 public_key: "testkey.avbpubkey",
1101 private_key: "testkey.pem",
1102 }
1103
1104 cc_library {
1105 name: "mylib",
1106 srcs: ["mylib.cpp"],
1107 shared_libs: ["mylib2"],
1108 system_shared_libs: [],
1109 stl: "none",
1110 apex_available: [ "myapex" ],
1111 }
1112
1113 cc_library {
1114 name: "mylib2",
1115 srcs: ["mylib.cpp"],
1116 cflags: ["-include mylib.h"],
1117 system_shared_libs: [],
1118 stl: "none",
1119 stubs: {
1120 versions: ["1", "2", "3"],
1121 },
1122 }
1123
1124 rust_binary {
1125 name: "foo.rust",
1126 srcs: ["foo.rs"],
1127 shared_libs: ["libfoo.shared_from_rust"],
1128 prefer_rlib: true,
1129 apex_available: ["myapex"],
1130 }
1131
1132 cc_library_shared {
1133 name: "libfoo.shared_from_rust",
1134 srcs: ["mylib.cpp"],
1135 system_shared_libs: [],
1136 stl: "none",
1137 stubs: {
1138 versions: ["10", "11", "12"],
1139 },
1140 }
1141 `)
1142
Jooyung Hana0503a52023-08-23 13:12:50 +09001143 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001144 copyCmds := apexRule.Args["copy_commands"]
1145
1146 // Ensure that indirect stubs dep is not included
1147 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1148 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1149
1150 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1151 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001152 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001153 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1154 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001155 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001156 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1157 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1158}
1159
Colin Cross7812fd32020-09-25 12:35:10 -07001160func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1161 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001162 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001163 apex {
1164 name: "myapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["mylib", "mylib3"],
1167 min_sdk_version: "29",
1168 }
1169
1170 apex_key {
1171 name: "myapex.key",
1172 public_key: "testkey.avbpubkey",
1173 private_key: "testkey.pem",
1174 }
1175
1176 cc_library {
1177 name: "mylib",
1178 srcs: ["mylib.cpp"],
1179 shared_libs: ["mylib2", "mylib3"],
1180 system_shared_libs: [],
1181 stl: "none",
1182 apex_available: [ "myapex" ],
1183 min_sdk_version: "28",
1184 }
1185
1186 cc_library {
1187 name: "mylib2",
1188 srcs: ["mylib.cpp"],
1189 cflags: ["-include mylib.h"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001193 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001194 versions: ["28", "29", "30", "current"],
1195 },
1196 min_sdk_version: "28",
1197 }
1198
1199 cc_library {
1200 name: "mylib3",
1201 srcs: ["mylib.cpp"],
1202 shared_libs: ["mylib4"],
1203 system_shared_libs: [],
1204 stl: "none",
1205 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001206 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001207 versions: ["28", "29", "30", "current"],
1208 },
1209 apex_available: [ "myapex" ],
1210 min_sdk_version: "28",
1211 }
1212
1213 cc_library {
1214 name: "mylib4",
1215 srcs: ["mylib.cpp"],
1216 system_shared_libs: [],
1217 stl: "none",
1218 apex_available: [ "myapex" ],
1219 min_sdk_version: "28",
1220 }
1221 `)
1222
Jooyung Hana0503a52023-08-23 13:12:50 +09001223 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001224 copyCmds := apexRule.Args["copy_commands"]
1225
1226 // Ensure that direct non-stubs dep is always included
1227 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1228
1229 // Ensure that indirect stubs dep is not included
1230 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1231
1232 // Ensure that direct stubs dep is included
1233 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1234
1235 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1236
Jiyong Park55549df2021-02-26 23:57:23 +09001237 // Ensure that mylib is linking with the latest version of stub for mylib2
1238 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001239 // ... and not linking to the non-stub (impl) variant of mylib2
1240 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1241
1242 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1243 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1244 // .. and not linking to the stubs variant of mylib3
1245 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1246
1247 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001248 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001249 ensureNotContains(t, mylib2Cflags, "-include ")
1250
Jiyong Park85cc35a2022-07-17 11:30:47 +09001251 // Ensure that genstub is invoked with --systemapi
1252 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001253
Jooyung Hana0503a52023-08-23 13:12:50 +09001254 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001255 "lib64/mylib.so",
1256 "lib64/mylib3.so",
1257 "lib64/mylib4.so",
1258 })
1259}
1260
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001261func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1262 t.Parallel()
1263 // myapex (Z)
1264 // mylib -----------------.
1265 // |
1266 // otherapex (29) |
1267 // libstub's versions: 29 Z current
1268 // |
1269 // <platform> |
1270 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001271 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001272 apex {
1273 name: "myapex",
1274 key: "myapex.key",
1275 native_shared_libs: ["mylib"],
1276 min_sdk_version: "Z", // non-final
1277 }
1278
1279 cc_library {
1280 name: "mylib",
1281 srcs: ["mylib.cpp"],
1282 shared_libs: ["libstub"],
1283 apex_available: ["myapex"],
1284 min_sdk_version: "Z",
1285 }
1286
1287 apex_key {
1288 name: "myapex.key",
1289 public_key: "testkey.avbpubkey",
1290 private_key: "testkey.pem",
1291 }
1292
1293 apex {
1294 name: "otherapex",
1295 key: "myapex.key",
1296 native_shared_libs: ["libstub"],
1297 min_sdk_version: "29",
1298 }
1299
1300 cc_library {
1301 name: "libstub",
1302 srcs: ["mylib.cpp"],
1303 stubs: {
1304 versions: ["29", "Z", "current"],
1305 },
1306 apex_available: ["otherapex"],
1307 min_sdk_version: "29",
1308 }
1309
1310 // platform module depending on libstub from otherapex should use the latest stub("current")
1311 cc_library {
1312 name: "libplatform",
1313 srcs: ["mylib.cpp"],
1314 shared_libs: ["libstub"],
1315 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001316 `,
1317 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1318 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1319 variables.Platform_sdk_final = proptools.BoolPtr(false)
1320 variables.Platform_version_active_codenames = []string{"Z"}
1321 }),
1322 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001323
Jiyong Park55549df2021-02-26 23:57:23 +09001324 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001325 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001326 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001327 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001328 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001329
1330 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1331 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1332 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1333 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1334 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1335}
1336
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001337func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001338 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001339 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001340 name: "myapex2",
1341 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001342 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001343 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344 }
1345
1346 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001347 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001348 public_key: "testkey.avbpubkey",
1349 private_key: "testkey.pem",
1350 }
1351
1352 cc_library {
1353 name: "mylib",
1354 srcs: ["mylib.cpp"],
1355 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001356 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001357 system_shared_libs: [],
1358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001359 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001360 }
1361
1362 cc_library {
1363 name: "libfoo",
1364 srcs: ["mylib.cpp"],
1365 shared_libs: ["libbar"],
1366 system_shared_libs: [],
1367 stl: "none",
1368 stubs: {
1369 versions: ["10", "20", "30"],
1370 },
1371 }
1372
1373 cc_library {
1374 name: "libbar",
1375 srcs: ["mylib.cpp"],
1376 system_shared_libs: [],
1377 stl: "none",
1378 }
1379
Jiyong Park678c8812020-02-07 17:25:49 +09001380 cc_library_static {
1381 name: "libbaz",
1382 srcs: ["mylib.cpp"],
1383 system_shared_libs: [],
1384 stl: "none",
1385 apex_available: [ "myapex2" ],
1386 }
1387
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001388 `)
1389
Jooyung Hana0503a52023-08-23 13:12:50 +09001390 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001391 copyCmds := apexRule.Args["copy_commands"]
1392
1393 // Ensure that direct non-stubs dep is always included
1394 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1395
1396 // Ensure that indirect stubs dep is not included
1397 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1398
1399 // Ensure that dependency of stubs is not included
1400 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1401
Colin Crossaede88c2020-08-11 12:17:01 -07001402 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001403
1404 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001405 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001406 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001407 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001408
Jiyong Park3ff16992019-12-27 14:11:47 +09001409 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001410
1411 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1412 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001413
Colin Crossf61d03d2023-11-02 16:56:39 -07001414 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1415 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001416 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001417
Colin Crossf61d03d2023-11-02 16:56:39 -07001418 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1419 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001420 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001421}
1422
Jooyung Hand3639552019-08-09 12:57:43 +09001423func TestApexWithRuntimeLibsDependency(t *testing.T) {
1424 /*
1425 myapex
1426 |
1427 v (runtime_libs)
1428 mylib ------+------> libfoo [provides stub]
1429 |
1430 `------> libbar
1431 */
Colin Cross1c460562021-02-16 17:55:47 -08001432 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001433 apex {
1434 name: "myapex",
1435 key: "myapex.key",
1436 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001437 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001438 }
1439
1440 apex_key {
1441 name: "myapex.key",
1442 public_key: "testkey.avbpubkey",
1443 private_key: "testkey.pem",
1444 }
1445
1446 cc_library {
1447 name: "mylib",
1448 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001449 static_libs: ["libstatic"],
1450 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001451 runtime_libs: ["libfoo", "libbar"],
1452 system_shared_libs: [],
1453 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001454 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001455 }
1456
1457 cc_library {
1458 name: "libfoo",
1459 srcs: ["mylib.cpp"],
1460 system_shared_libs: [],
1461 stl: "none",
1462 stubs: {
1463 versions: ["10", "20", "30"],
1464 },
1465 }
1466
1467 cc_library {
1468 name: "libbar",
1469 srcs: ["mylib.cpp"],
1470 system_shared_libs: [],
1471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001472 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001473 }
1474
Liz Kammer5f108fa2023-05-11 14:33:17 -04001475 cc_library {
1476 name: "libstatic",
1477 srcs: ["mylib.cpp"],
1478 system_shared_libs: [],
1479 stl: "none",
1480 apex_available: [ "myapex" ],
1481 runtime_libs: ["libstatic_to_runtime"],
1482 }
1483
1484 cc_library {
1485 name: "libshared",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libshared_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libstatic_to_runtime",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 }
1500
1501 cc_library {
1502 name: "libshared_to_runtime",
1503 srcs: ["mylib.cpp"],
1504 system_shared_libs: [],
1505 stl: "none",
1506 apex_available: [ "myapex" ],
1507 }
Jooyung Hand3639552019-08-09 12:57:43 +09001508 `)
1509
Jooyung Hana0503a52023-08-23 13:12:50 +09001510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001511 copyCmds := apexRule.Args["copy_commands"]
1512
1513 // Ensure that direct non-stubs dep is always included
1514 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1515
1516 // Ensure that indirect stubs dep is not included
1517 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1518
1519 // Ensure that runtime_libs dep in included
1520 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001521 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1522 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1523
1524 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001525
Jooyung Hana0503a52023-08-23 13:12:50 +09001526 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001527 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1528 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001529}
1530
Paul Duffina02cae32021-03-09 01:44:06 +00001531var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1532 cc.PrepareForTestWithCcBuildComponents,
1533 PrepareForTestWithApexBuildComponents,
1534 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001535 apex {
1536 name: "com.android.runtime",
1537 key: "com.android.runtime.key",
1538 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001539 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001540 }
1541
1542 apex_key {
1543 name: "com.android.runtime.key",
1544 public_key: "testkey.avbpubkey",
1545 private_key: "testkey.pem",
1546 }
Paul Duffina02cae32021-03-09 01:44:06 +00001547 `),
1548 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1549)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001550
Paul Duffina02cae32021-03-09 01:44:06 +00001551func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001552 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001553 cc_library {
1554 name: "libc",
1555 no_libcrt: true,
1556 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001557 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001558 stl: "none",
1559 system_shared_libs: [],
1560 stubs: { versions: ["1"] },
1561 apex_available: ["com.android.runtime"],
1562
1563 sanitize: {
1564 hwaddress: true,
1565 }
1566 }
1567
1568 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001569 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001570 no_libcrt: true,
1571 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001572 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001573 stl: "none",
1574 system_shared_libs: [],
1575 srcs: [""],
1576 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001577 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001578
1579 sanitize: {
1580 never: true,
1581 },
Spandan Das4de7b492023-05-05 21:13:01 +00001582 apex_available: [
1583 "//apex_available:anyapex",
1584 "//apex_available:platform",
1585 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001586 } `)
1587 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
Jooyung Hana0503a52023-08-23 13:12:50 +09001589 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001590 "lib64/bionic/libc.so",
1591 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1592 })
1593
Colin Cross4c4c1be2022-02-10 11:41:18 -08001594 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001595
1596 installed := hwasan.Description("install libclang_rt.hwasan")
1597 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1598
1599 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1600 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1601 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1602}
1603
1604func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Paul Duffin70d3bee2021-03-21 11:26:05 +00001605 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001606 prepareForTestOfRuntimeApexWithHwasan,
1607 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1608 variables.SanitizeDevice = []string{"hwaddress"}
1609 }),
1610 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001611 cc_library {
1612 name: "libc",
1613 no_libcrt: true,
1614 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001615 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001616 stl: "none",
1617 system_shared_libs: [],
1618 stubs: { versions: ["1"] },
1619 apex_available: ["com.android.runtime"],
1620 }
1621
1622 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001623 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 srcs: [""],
1630 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001631 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001632
1633 sanitize: {
1634 never: true,
1635 },
Spandan Das4de7b492023-05-05 21:13:01 +00001636 apex_available: [
1637 "//apex_available:anyapex",
1638 "//apex_available:platform",
1639 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001640 }
Paul Duffina02cae32021-03-09 01:44:06 +00001641 `)
1642 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
Jooyung Hana0503a52023-08-23 13:12:50 +09001644 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001645 "lib64/bionic/libc.so",
1646 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1647 })
1648
Colin Cross4c4c1be2022-02-10 11:41:18 -08001649 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001650
1651 installed := hwasan.Description("install libclang_rt.hwasan")
1652 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1653
1654 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1655 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1656 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1657}
1658
Jooyung Han61b66e92020-03-21 14:21:46 +00001659func TestApexDependsOnLLNDKTransitively(t *testing.T) {
1660 testcases := []struct {
1661 name string
1662 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001663 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001664 shouldLink string
1665 shouldNotLink []string
1666 }{
1667 {
Jiyong Park55549df2021-02-26 23:57:23 +09001668 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001669 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001670 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001671 shouldLink: "current",
1672 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001673 },
1674 {
Jiyong Park55549df2021-02-26 23:57:23 +09001675 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001676 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001677 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001678 shouldLink: "current",
1679 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001680 },
1681 }
1682 for _, tc := range testcases {
1683 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001684 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 apex {
1686 name: "myapex",
1687 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001689 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001690 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001691 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001692
Jooyung Han61b66e92020-03-21 14:21:46 +00001693 apex_key {
1694 name: "myapex.key",
1695 public_key: "testkey.avbpubkey",
1696 private_key: "testkey.pem",
1697 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001698
Jooyung Han61b66e92020-03-21 14:21:46 +00001699 cc_library {
1700 name: "mylib",
1701 srcs: ["mylib.cpp"],
1702 vendor_available: true,
1703 shared_libs: ["libbar"],
1704 system_shared_libs: [],
1705 stl: "none",
1706 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001707 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001708 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001709
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 cc_library {
1711 name: "libbar",
1712 srcs: ["mylib.cpp"],
1713 system_shared_libs: [],
1714 stl: "none",
1715 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001716 llndk: {
1717 symbol_file: "libbar.map.txt",
1718 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001719 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001720 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001721 withUnbundledBuild,
1722 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001723
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001725 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 "lib64/mylib.so",
1727 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001728
Jooyung Han61b66e92020-03-21 14:21:46 +00001729 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001730 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001731 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1732 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001733
Steven Moreland2c4000c2021-04-27 02:08:49 +00001734 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1735 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001736 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001737 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001738 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001739
Steven Moreland2c4000c2021-04-27 02:08:49 +00001740 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001741 ver := tc.shouldLink
1742 if tc.shouldLink == "current" {
1743 ver = strconv.Itoa(android.FutureApiLevelInt)
1744 }
1745 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001746 })
1747 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001748}
1749
Jiyong Park25fc6a92018-11-18 18:02:45 +09001750func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001751 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001752 apex {
1753 name: "myapex",
1754 key: "myapex.key",
1755 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001756 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001757 }
1758
1759 apex_key {
1760 name: "myapex.key",
1761 public_key: "testkey.avbpubkey",
1762 private_key: "testkey.pem",
1763 }
1764
1765 cc_library {
1766 name: "mylib",
1767 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001768 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001769 shared_libs: ["libdl#27"],
1770 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001771 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001772 }
1773
1774 cc_library_shared {
1775 name: "mylib_shared",
1776 srcs: ["mylib.cpp"],
1777 shared_libs: ["libdl#27"],
1778 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001779 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001780 }
1781
1782 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001783 name: "libBootstrap",
1784 srcs: ["mylib.cpp"],
1785 stl: "none",
1786 bootstrap: true,
1787 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001788 `)
1789
Jooyung Hana0503a52023-08-23 13:12:50 +09001790 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001791 copyCmds := apexRule.Args["copy_commands"]
1792
1793 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001794 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001795 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1796 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001797
1798 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001799 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001800
Colin Crossaede88c2020-08-11 12:17:01 -07001801 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1802 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1803 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001804
1805 // For dependency to libc
1806 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001807 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001808 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001809 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001810 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001811 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1812 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001813
1814 // For dependency to libm
1815 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001816 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001818 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001819 // ... and is not compiling with the stub
1820 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1821 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1822
1823 // For dependency to libdl
1824 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001825 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001827 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1828 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001829 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... Cflags from stub is correctly exported to mylib
1832 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1833 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001834
1835 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001836 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1837 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1838 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1839 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001841
Jooyung Han749dc692020-04-15 11:03:39 +09001842func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Jiyong Park55549df2021-02-26 23:57:23 +09001843 // there are three links between liba --> libz.
1844 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001845 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001846 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001847 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001848 apex {
1849 name: "myapex",
1850 key: "myapex.key",
1851 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001852 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001853 }
1854
1855 apex {
1856 name: "otherapex",
1857 key: "myapex.key",
1858 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001859 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001860 }
1861
1862 apex_key {
1863 name: "myapex.key",
1864 public_key: "testkey.avbpubkey",
1865 private_key: "testkey.pem",
1866 }
1867
1868 cc_library {
1869 name: "libx",
1870 shared_libs: ["liba"],
1871 system_shared_libs: [],
1872 stl: "none",
1873 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 cc_library {
1878 name: "liby",
1879 shared_libs: ["liba"],
1880 system_shared_libs: [],
1881 stl: "none",
1882 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001883 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001884 }
1885
1886 cc_library {
1887 name: "liba",
1888 shared_libs: ["libz"],
1889 system_shared_libs: [],
1890 stl: "none",
1891 apex_available: [
1892 "//apex_available:anyapex",
1893 "//apex_available:platform",
1894 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001895 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001896 }
1897
1898 cc_library {
1899 name: "libz",
1900 system_shared_libs: [],
1901 stl: "none",
1902 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001903 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001904 },
1905 }
Jooyung Han749dc692020-04-15 11:03:39 +09001906 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001907
1908 expectLink := func(from, from_variant, to, to_variant string) {
1909 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1910 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1911 }
1912 expectNoLink := func(from, from_variant, to, to_variant string) {
1913 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1914 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1915 }
1916 // platform liba is linked to non-stub version
1917 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001918 // liba in myapex is linked to current
1919 expectLink("liba", "shared_apex29", "libz", "shared_current")
1920 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001921 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001922 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001923 // liba in otherapex is linked to current
1924 expectLink("liba", "shared_apex30", "libz", "shared_current")
1925 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001926 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1927 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001928}
1929
Jooyung Hanaed150d2020-04-02 01:41:41 +09001930func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08001931 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001932 apex {
1933 name: "myapex",
1934 key: "myapex.key",
1935 native_shared_libs: ["libx"],
1936 min_sdk_version: "R",
1937 }
1938
1939 apex_key {
1940 name: "myapex.key",
1941 public_key: "testkey.avbpubkey",
1942 private_key: "testkey.pem",
1943 }
1944
1945 cc_library {
1946 name: "libx",
1947 shared_libs: ["libz"],
1948 system_shared_libs: [],
1949 stl: "none",
1950 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001951 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001952 }
1953
1954 cc_library {
1955 name: "libz",
1956 system_shared_libs: [],
1957 stl: "none",
1958 stubs: {
1959 versions: ["29", "R"],
1960 },
1961 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001962 `,
1963 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1964 variables.Platform_version_active_codenames = []string{"R"}
1965 }),
1966 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001967
1968 expectLink := func(from, from_variant, to, to_variant string) {
1969 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1970 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1971 }
1972 expectNoLink := func(from, from_variant, to, to_variant string) {
1973 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1974 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1975 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001976 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1977 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001978 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1979 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001980}
1981
Jooyung Han4c4da062021-06-23 10:23:16 +09001982func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
1983 testApex(t, `
1984 apex {
1985 name: "myapex",
1986 key: "myapex.key",
1987 java_libs: ["libx"],
1988 min_sdk_version: "S",
1989 }
1990
1991 apex_key {
1992 name: "myapex.key",
1993 public_key: "testkey.avbpubkey",
1994 private_key: "testkey.pem",
1995 }
1996
1997 java_library {
1998 name: "libx",
1999 srcs: ["a.java"],
2000 apex_available: [ "myapex" ],
2001 sdk_version: "current",
2002 min_sdk_version: "S", // should be okay
2003 }
2004 `,
2005 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2006 variables.Platform_version_active_codenames = []string{"S"}
2007 variables.Platform_sdk_codename = proptools.StringPtr("S")
2008 }),
2009 )
2010}
2011
Jooyung Han749dc692020-04-15 11:03:39 +09002012func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002013 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002014 apex {
2015 name: "myapex",
2016 key: "myapex.key",
2017 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002018 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002019 }
2020
2021 apex_key {
2022 name: "myapex.key",
2023 public_key: "testkey.avbpubkey",
2024 private_key: "testkey.pem",
2025 }
2026
2027 cc_library {
2028 name: "libx",
2029 shared_libs: ["libz"],
2030 system_shared_libs: [],
2031 stl: "none",
2032 apex_available: [ "myapex" ],
2033 }
2034
2035 cc_library {
2036 name: "libz",
2037 system_shared_libs: [],
2038 stl: "none",
2039 stubs: {
2040 versions: ["1", "2"],
2041 },
2042 }
2043 `)
2044
2045 expectLink := func(from, from_variant, to, to_variant string) {
2046 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2047 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2048 }
2049 expectNoLink := func(from, from_variant, to, to_variant string) {
2050 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2051 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2052 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002053 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002054 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002055 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002056 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002057}
2058
Jooyung Handfc864c2023-03-20 18:19:07 +09002059func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Jiyong Park5df7bd32021-08-25 16:18:46 +09002060 ctx := testApex(t, `
2061 apex {
2062 name: "myapex",
2063 key: "myapex.key",
2064 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002065 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002066 vendor: true,
2067 min_sdk_version: "29",
2068 }
2069
2070 apex_key {
2071 name: "myapex.key",
2072 public_key: "testkey.avbpubkey",
2073 private_key: "testkey.pem",
2074 }
2075
2076 cc_library {
2077 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002078 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002079 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002081 shared_libs: ["libbar"],
2082 }
2083
2084 cc_library {
2085 name: "libbar",
2086 stubs: { versions: ["29", "30"] },
2087 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002088 }
2089 `)
2090
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002091 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002092
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002093 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002094
2095 // Ensure that mylib links with "current" LLNDK
2096 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002097 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002098
2099 // Ensure that mylib is targeting 29
2100 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2101 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2102
2103 // Ensure that the correct variant of crtbegin_so is used.
2104 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2105 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002106
2107 // Ensure that the crtbegin_so used by the APEX is targeting 29
2108 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2109 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2110}
2111
Jooyung Han4495f842023-04-25 16:39:59 +09002112func TestTrackAllowedDeps(t *testing.T) {
2113 ctx := testApex(t, `
2114 apex {
2115 name: "myapex",
2116 key: "myapex.key",
2117 updatable: true,
2118 native_shared_libs: [
2119 "mylib",
2120 "yourlib",
2121 ],
2122 min_sdk_version: "29",
2123 }
2124
2125 apex {
2126 name: "myapex2",
2127 key: "myapex.key",
2128 updatable: false,
2129 native_shared_libs: ["yourlib"],
2130 }
2131
2132 apex_key {
2133 name: "myapex.key",
2134 public_key: "testkey.avbpubkey",
2135 private_key: "testkey.pem",
2136 }
2137
2138 cc_library {
2139 name: "mylib",
2140 srcs: ["mylib.cpp"],
2141 shared_libs: ["libbar"],
2142 min_sdk_version: "29",
2143 apex_available: ["myapex"],
2144 }
2145
2146 cc_library {
2147 name: "libbar",
2148 stubs: { versions: ["29", "30"] },
2149 }
2150
2151 cc_library {
2152 name: "yourlib",
2153 srcs: ["mylib.cpp"],
2154 min_sdk_version: "29",
2155 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2156 }
2157 `, withFiles(android.MockFS{
2158 "packages/modules/common/build/allowed_deps.txt": nil,
2159 }))
2160
2161 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2162 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2163 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002164 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002165 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002166 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002167
Jooyung Hana0503a52023-08-23 13:12:50 +09002168 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002169 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2170 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002171 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2172 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2173 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2174 flatlist, "mylib:(minSdkVersion:29)")
2175 android.AssertStringListContains(t, "track platform-available lib",
2176 flatlist, "yourlib(minSdkVersion:29)")
2177}
2178
2179func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
2180 ctx := testApex(t, `
2181 apex {
2182 name: "myapex",
2183 key: "myapex.key",
2184 updatable: true,
2185 min_sdk_version: "29",
2186 }
2187
2188 apex_key {
2189 name: "myapex.key",
2190 public_key: "testkey.avbpubkey",
2191 private_key: "testkey.pem",
2192 }
2193 `)
2194 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2195 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2196 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2197 }
2198}
2199
Jooyung Han03b51852020-02-26 22:45:42 +09002200func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002201 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002202 apex {
2203 name: "myapex",
2204 key: "myapex.key",
2205 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002206 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002207 }
2208
2209 apex_key {
2210 name: "myapex.key",
2211 public_key: "testkey.avbpubkey",
2212 private_key: "testkey.pem",
2213 }
2214
2215 cc_library {
2216 name: "libx",
2217 system_shared_libs: [],
2218 stl: "none",
2219 apex_available: [ "myapex" ],
2220 stubs: {
2221 versions: ["1", "2"],
2222 },
2223 }
2224
2225 cc_library {
2226 name: "libz",
2227 shared_libs: ["libx"],
2228 system_shared_libs: [],
2229 stl: "none",
2230 }
2231 `)
2232
2233 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002234 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002235 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2236 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2237 }
2238 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002239 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002240 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2241 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2242 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002243 expectLink("libz", "shared", "libx", "shared_current")
2244 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002245 expectNoLink("libz", "shared", "libz", "shared_1")
2246 expectNoLink("libz", "shared", "libz", "shared")
2247}
2248
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002249var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.SanitizeDevice = []string{"hwaddress"}
2252 },
2253)
2254
Jooyung Han75568392020-03-20 04:29:24 +09002255func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002256 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002257 apex {
2258 name: "myapex",
2259 key: "myapex.key",
2260 native_shared_libs: ["libx"],
2261 min_sdk_version: "29",
2262 }
2263
2264 apex_key {
2265 name: "myapex.key",
2266 public_key: "testkey.avbpubkey",
2267 private_key: "testkey.pem",
2268 }
2269
2270 cc_library {
2271 name: "libx",
2272 shared_libs: ["libbar"],
2273 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002274 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002275 }
2276
2277 cc_library {
2278 name: "libbar",
2279 stubs: {
2280 versions: ["29", "30"],
2281 },
2282 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002283 `,
2284 prepareForTestWithSantitizeHwaddress,
2285 )
Jooyung Han03b51852020-02-26 22:45:42 +09002286 expectLink := func(from, from_variant, to, to_variant string) {
2287 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2288 libFlags := ld.Args["libFlags"]
2289 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2290 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002291 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002292}
2293
Jooyung Han75568392020-03-20 04:29:24 +09002294func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002295 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002296 apex {
2297 name: "myapex",
2298 key: "myapex.key",
2299 native_shared_libs: ["libx"],
2300 min_sdk_version: "29",
2301 }
2302
2303 apex_key {
2304 name: "myapex.key",
2305 public_key: "testkey.avbpubkey",
2306 private_key: "testkey.pem",
2307 }
2308
2309 cc_library {
2310 name: "libx",
2311 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002312 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002313 }
Jooyung Han75568392020-03-20 04:29:24 +09002314 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002315
2316 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002317 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002318 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002319 // note that platform variant is not.
2320 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002321 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002322}
2323
Jooyung Han749dc692020-04-15 11:03:39 +09002324func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
2325 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002326 apex {
2327 name: "myapex",
2328 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002329 native_shared_libs: ["mylib"],
2330 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002331 }
2332
2333 apex_key {
2334 name: "myapex.key",
2335 public_key: "testkey.avbpubkey",
2336 private_key: "testkey.pem",
2337 }
Jooyung Han749dc692020-04-15 11:03:39 +09002338
2339 cc_library {
2340 name: "mylib",
2341 srcs: ["mylib.cpp"],
2342 system_shared_libs: [],
2343 stl: "none",
2344 apex_available: [
2345 "myapex",
2346 ],
2347 min_sdk_version: "30",
2348 }
2349 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002350
2351 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 native_shared_libs: ["libfoo.ffi"],
2356 min_sdk_version: "29",
2357 }
2358
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
2364
2365 rust_ffi_shared {
2366 name: "libfoo.ffi",
2367 srcs: ["foo.rs"],
2368 crate_name: "foo",
2369 apex_available: [
2370 "myapex",
2371 ],
2372 min_sdk_version: "30",
2373 }
2374 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002375
2376 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2377 apex {
2378 name: "myapex",
2379 key: "myapex.key",
2380 java_libs: ["libfoo"],
2381 min_sdk_version: "29",
2382 }
2383
2384 apex_key {
2385 name: "myapex.key",
2386 public_key: "testkey.avbpubkey",
2387 private_key: "testkey.pem",
2388 }
2389
2390 java_import {
2391 name: "libfoo",
2392 jars: ["libfoo.jar"],
2393 apex_available: [
2394 "myapex",
2395 ],
2396 min_sdk_version: "30",
2397 }
2398 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002399
2400 // Skip check for modules compiling against core API surface
2401 testApex(t, `
2402 apex {
2403 name: "myapex",
2404 key: "myapex.key",
2405 java_libs: ["libfoo"],
2406 min_sdk_version: "29",
2407 }
2408
2409 apex_key {
2410 name: "myapex.key",
2411 public_key: "testkey.avbpubkey",
2412 private_key: "testkey.pem",
2413 }
2414
2415 java_library {
2416 name: "libfoo",
2417 srcs: ["Foo.java"],
2418 apex_available: [
2419 "myapex",
2420 ],
2421 // Compile against core API surface
2422 sdk_version: "core_current",
2423 min_sdk_version: "30",
2424 }
2425 `)
2426
Jooyung Han749dc692020-04-15 11:03:39 +09002427}
2428
2429func TestApexMinSdkVersion_Okay(t *testing.T) {
2430 testApex(t, `
2431 apex {
2432 name: "myapex",
2433 key: "myapex.key",
2434 native_shared_libs: ["libfoo"],
2435 java_libs: ["libbar"],
2436 min_sdk_version: "29",
2437 }
2438
2439 apex_key {
2440 name: "myapex.key",
2441 public_key: "testkey.avbpubkey",
2442 private_key: "testkey.pem",
2443 }
2444
2445 cc_library {
2446 name: "libfoo",
2447 srcs: ["mylib.cpp"],
2448 shared_libs: ["libfoo_dep"],
2449 apex_available: ["myapex"],
2450 min_sdk_version: "29",
2451 }
2452
2453 cc_library {
2454 name: "libfoo_dep",
2455 srcs: ["mylib.cpp"],
2456 apex_available: ["myapex"],
2457 min_sdk_version: "29",
2458 }
2459
2460 java_library {
2461 name: "libbar",
2462 sdk_version: "current",
2463 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002464 static_libs: [
2465 "libbar_dep",
2466 "libbar_import_dep",
2467 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002468 apex_available: ["myapex"],
2469 min_sdk_version: "29",
2470 }
2471
2472 java_library {
2473 name: "libbar_dep",
2474 sdk_version: "current",
2475 srcs: ["a.java"],
2476 apex_available: ["myapex"],
2477 min_sdk_version: "29",
2478 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002479
2480 java_import {
2481 name: "libbar_import_dep",
2482 jars: ["libbar.jar"],
2483 apex_available: ["myapex"],
2484 min_sdk_version: "29",
2485 }
Jooyung Han03b51852020-02-26 22:45:42 +09002486 `)
2487}
2488
Colin Cross8ca61c12022-10-06 21:00:14 -07002489func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
2490 // Tests that an apex dependency with min_sdk_version higher than the
2491 // min_sdk_version of the apex is allowed as long as the dependency's
2492 // min_sdk_version is less than or equal to the api level that the
2493 // architecture was introduced in. In this case, arm64 didn't exist
2494 // until api level 21, so the arm64 code will never need to run on
2495 // an api level 20 device, even if other architectures of the apex
2496 // will.
2497 testApex(t, `
2498 apex {
2499 name: "myapex",
2500 key: "myapex.key",
2501 native_shared_libs: ["libfoo"],
2502 min_sdk_version: "20",
2503 }
2504
2505 apex_key {
2506 name: "myapex.key",
2507 public_key: "testkey.avbpubkey",
2508 private_key: "testkey.pem",
2509 }
2510
2511 cc_library {
2512 name: "libfoo",
2513 srcs: ["mylib.cpp"],
2514 apex_available: ["myapex"],
2515 min_sdk_version: "21",
2516 stl: "none",
2517 }
2518 `)
2519}
2520
Artur Satayev8cf899a2020-04-15 17:29:42 +01002521func TestJavaStableSdkVersion(t *testing.T) {
2522 testCases := []struct {
2523 name string
2524 expectedError string
2525 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002526 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002527 }{
2528 {
2529 name: "Non-updatable apex with non-stable dep",
2530 bp: `
2531 apex {
2532 name: "myapex",
2533 java_libs: ["myjar"],
2534 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002535 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002536 }
2537 apex_key {
2538 name: "myapex.key",
2539 public_key: "testkey.avbpubkey",
2540 private_key: "testkey.pem",
2541 }
2542 java_library {
2543 name: "myjar",
2544 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002545 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002546 apex_available: ["myapex"],
2547 }
2548 `,
2549 },
2550 {
2551 name: "Updatable apex with stable dep",
2552 bp: `
2553 apex {
2554 name: "myapex",
2555 java_libs: ["myjar"],
2556 key: "myapex.key",
2557 updatable: true,
2558 min_sdk_version: "29",
2559 }
2560 apex_key {
2561 name: "myapex.key",
2562 public_key: "testkey.avbpubkey",
2563 private_key: "testkey.pem",
2564 }
2565 java_library {
2566 name: "myjar",
2567 srcs: ["foo/bar/MyClass.java"],
2568 sdk_version: "current",
2569 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002570 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002571 }
2572 `,
2573 },
2574 {
2575 name: "Updatable apex with non-stable dep",
2576 expectedError: "cannot depend on \"myjar\"",
2577 bp: `
2578 apex {
2579 name: "myapex",
2580 java_libs: ["myjar"],
2581 key: "myapex.key",
2582 updatable: true,
2583 }
2584 apex_key {
2585 name: "myapex.key",
2586 public_key: "testkey.avbpubkey",
2587 private_key: "testkey.pem",
2588 }
2589 java_library {
2590 name: "myjar",
2591 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002592 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002593 apex_available: ["myapex"],
2594 }
2595 `,
2596 },
2597 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002598 name: "Updatable apex with non-stable legacy core platform dep",
2599 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2600 bp: `
2601 apex {
2602 name: "myapex",
2603 java_libs: ["myjar-uses-legacy"],
2604 key: "myapex.key",
2605 updatable: true,
2606 }
2607 apex_key {
2608 name: "myapex.key",
2609 public_key: "testkey.avbpubkey",
2610 private_key: "testkey.pem",
2611 }
2612 java_library {
2613 name: "myjar-uses-legacy",
2614 srcs: ["foo/bar/MyClass.java"],
2615 sdk_version: "core_platform",
2616 apex_available: ["myapex"],
2617 }
2618 `,
2619 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2620 },
2621 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002622 name: "Updatable apex with non-stable transitive dep",
2623 // This is not actually detecting that the transitive dependency is unstable, rather it is
2624 // detecting that the transitive dependency is building against a wider API surface than the
2625 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002626 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002627 bp: `
2628 apex {
2629 name: "myapex",
2630 java_libs: ["myjar"],
2631 key: "myapex.key",
2632 updatable: true,
2633 }
2634 apex_key {
2635 name: "myapex.key",
2636 public_key: "testkey.avbpubkey",
2637 private_key: "testkey.pem",
2638 }
2639 java_library {
2640 name: "myjar",
2641 srcs: ["foo/bar/MyClass.java"],
2642 sdk_version: "current",
2643 apex_available: ["myapex"],
2644 static_libs: ["transitive-jar"],
2645 }
2646 java_library {
2647 name: "transitive-jar",
2648 srcs: ["foo/bar/MyClass.java"],
2649 sdk_version: "core_platform",
2650 apex_available: ["myapex"],
2651 }
2652 `,
2653 },
2654 }
2655
2656 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002657 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2658 continue
2659 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002660 t.Run(test.name, func(t *testing.T) {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002661 errorHandler := android.FixtureExpectsNoErrors
2662 if test.expectedError != "" {
2663 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002664 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002665 android.GroupFixturePreparers(
2666 java.PrepareForTestWithJavaDefaultModules,
2667 PrepareForTestWithApexBuildComponents,
2668 prepareForTestWithMyapex,
2669 android.OptionalFixturePreparer(test.preparer),
2670 ).
2671 ExtendWithErrorHandler(errorHandler).
2672 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002673 })
2674 }
2675}
2676
Jooyung Han749dc692020-04-15 11:03:39 +09002677func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2678 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2679 apex {
2680 name: "myapex",
2681 key: "myapex.key",
2682 native_shared_libs: ["mylib"],
2683 min_sdk_version: "29",
2684 }
2685
2686 apex_key {
2687 name: "myapex.key",
2688 public_key: "testkey.avbpubkey",
2689 private_key: "testkey.pem",
2690 }
2691
2692 cc_library {
2693 name: "mylib",
2694 srcs: ["mylib.cpp"],
2695 shared_libs: ["mylib2"],
2696 system_shared_libs: [],
2697 stl: "none",
2698 apex_available: [
2699 "myapex",
2700 ],
2701 min_sdk_version: "29",
2702 }
2703
2704 // indirect part of the apex
2705 cc_library {
2706 name: "mylib2",
2707 srcs: ["mylib.cpp"],
2708 system_shared_libs: [],
2709 stl: "none",
2710 apex_available: [
2711 "myapex",
2712 ],
2713 min_sdk_version: "30",
2714 }
2715 `)
2716}
2717
2718func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
2719 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2720 apex {
2721 name: "myapex",
2722 key: "myapex.key",
2723 apps: ["AppFoo"],
2724 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002725 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002726 }
2727
2728 apex_key {
2729 name: "myapex.key",
2730 public_key: "testkey.avbpubkey",
2731 private_key: "testkey.pem",
2732 }
2733
2734 android_app {
2735 name: "AppFoo",
2736 srcs: ["foo/bar/MyClass.java"],
2737 sdk_version: "current",
2738 min_sdk_version: "29",
2739 system_modules: "none",
2740 stl: "none",
2741 static_libs: ["bar"],
2742 apex_available: [ "myapex" ],
2743 }
2744
2745 java_library {
2746 name: "bar",
2747 sdk_version: "current",
2748 srcs: ["a.java"],
2749 apex_available: [ "myapex" ],
2750 }
2751 `)
2752}
2753
2754func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002755 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002756 apex {
2757 name: "myapex",
2758 key: "myapex.key",
2759 native_shared_libs: ["mylib"],
2760 min_sdk_version: "29",
2761 }
2762
2763 apex_key {
2764 name: "myapex.key",
2765 public_key: "testkey.avbpubkey",
2766 private_key: "testkey.pem",
2767 }
2768
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002769 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002770 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2771 cc_library {
2772 name: "mylib",
2773 srcs: ["mylib.cpp"],
2774 shared_libs: ["mylib2"],
2775 system_shared_libs: [],
2776 stl: "none",
2777 apex_available: ["myapex", "otherapex"],
2778 min_sdk_version: "29",
2779 }
2780
2781 cc_library {
2782 name: "mylib2",
2783 srcs: ["mylib.cpp"],
2784 system_shared_libs: [],
2785 stl: "none",
2786 apex_available: ["otherapex"],
2787 stubs: { versions: ["29", "30"] },
2788 min_sdk_version: "30",
2789 }
2790
2791 apex {
2792 name: "otherapex",
2793 key: "myapex.key",
2794 native_shared_libs: ["mylib", "mylib2"],
2795 min_sdk_version: "30",
2796 }
2797 `)
2798 expectLink := func(from, from_variant, to, to_variant string) {
2799 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2800 libFlags := ld.Args["libFlags"]
2801 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2802 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002803 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002804 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002805}
2806
Jooyung Haned124c32021-01-26 11:43:46 +09002807func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002808 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2809 func(variables android.FixtureProductVariables) {
2810 variables.Platform_sdk_codename = proptools.StringPtr("S")
2811 variables.Platform_version_active_codenames = []string{"S"}
2812 },
2813 )
Jooyung Haned124c32021-01-26 11:43:46 +09002814 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2815 apex {
2816 name: "myapex",
2817 key: "myapex.key",
2818 native_shared_libs: ["libfoo"],
2819 min_sdk_version: "S",
2820 }
2821 apex_key {
2822 name: "myapex.key",
2823 public_key: "testkey.avbpubkey",
2824 private_key: "testkey.pem",
2825 }
2826 cc_library {
2827 name: "libfoo",
2828 shared_libs: ["libbar"],
2829 apex_available: ["myapex"],
2830 min_sdk_version: "29",
2831 }
2832 cc_library {
2833 name: "libbar",
2834 apex_available: ["myapex"],
2835 }
2836 `, withSAsActiveCodeNames)
2837}
2838
2839func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002840 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2841 variables.Platform_sdk_codename = proptools.StringPtr("S")
2842 variables.Platform_version_active_codenames = []string{"S", "T"}
2843 })
Colin Cross1c460562021-02-16 17:55:47 -08002844 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 native_shared_libs: ["libfoo"],
2849 min_sdk_version: "S",
2850 }
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856 cc_library {
2857 name: "libfoo",
2858 shared_libs: ["libbar"],
2859 apex_available: ["myapex"],
2860 min_sdk_version: "S",
2861 }
2862 cc_library {
2863 name: "libbar",
2864 stubs: {
2865 symbol_file: "libbar.map.txt",
2866 versions: ["30", "S", "T"],
2867 },
2868 }
2869 `, withSAsActiveCodeNames)
2870
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002871 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002872 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2873 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002874 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002875}
2876
Jiyong Park7c2ee712018-12-07 00:42:25 +09002877func TestFilesInSubDir(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002878 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002879 apex {
2880 name: "myapex",
2881 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002882 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002883 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002884 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002885 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002886 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002887 }
2888
2889 apex_key {
2890 name: "myapex.key",
2891 public_key: "testkey.avbpubkey",
2892 private_key: "testkey.pem",
2893 }
2894
2895 prebuilt_etc {
2896 name: "myetc",
2897 src: "myprebuilt",
2898 sub_dir: "foo/bar",
2899 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002900
2901 cc_library {
2902 name: "mylib",
2903 srcs: ["mylib.cpp"],
2904 relative_install_path: "foo/bar",
2905 system_shared_libs: [],
2906 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002907 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002908 }
2909
2910 cc_binary {
2911 name: "mybin",
2912 srcs: ["mylib.cpp"],
2913 relative_install_path: "foo/bar",
2914 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002915 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002916 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002917 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002918
2919 rust_binary {
2920 name: "mybin.rust",
2921 srcs: ["foo.rs"],
2922 relative_install_path: "rust_subdir",
2923 apex_available: [ "myapex" ],
2924 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002925 `)
2926
Jooyung Hana0503a52023-08-23 13:12:50 +09002927 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002928 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002929
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002930 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002931 ensureContains(t, cmd, "/etc ")
2932 ensureContains(t, cmd, "/etc/foo ")
2933 ensureContains(t, cmd, "/etc/foo/bar ")
2934 ensureContains(t, cmd, "/lib64 ")
2935 ensureContains(t, cmd, "/lib64/foo ")
2936 ensureContains(t, cmd, "/lib64/foo/bar ")
2937 ensureContains(t, cmd, "/lib ")
2938 ensureContains(t, cmd, "/lib/foo ")
2939 ensureContains(t, cmd, "/lib/foo/bar ")
2940 ensureContains(t, cmd, "/bin ")
2941 ensureContains(t, cmd, "/bin/foo ")
2942 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002943 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002944}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002945
Jooyung Han35155c42020-02-06 17:33:20 +09002946func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08002947 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002948 apex {
2949 name: "myapex",
2950 key: "myapex.key",
2951 multilib: {
2952 both: {
2953 native_shared_libs: ["mylib"],
2954 binaries: ["mybin"],
2955 },
2956 },
2957 compile_multilib: "both",
2958 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002959 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09002960 }
2961
2962 apex_key {
2963 name: "myapex.key",
2964 public_key: "testkey.avbpubkey",
2965 private_key: "testkey.pem",
2966 }
2967
2968 cc_library {
2969 name: "mylib",
2970 relative_install_path: "foo/bar",
2971 system_shared_libs: [],
2972 stl: "none",
2973 apex_available: [ "myapex" ],
2974 native_bridge_supported: true,
2975 }
2976
2977 cc_binary {
2978 name: "mybin",
2979 relative_install_path: "foo/bar",
2980 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09002981 stl: "none",
2982 apex_available: [ "myapex" ],
2983 native_bridge_supported: true,
2984 compile_multilib: "both", // default is "first" for binary
2985 multilib: {
2986 lib64: {
2987 suffix: "64",
2988 },
2989 },
2990 }
2991 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09002992 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09002993 "bin/foo/bar/mybin",
2994 "bin/foo/bar/mybin64",
2995 "bin/arm/foo/bar/mybin",
2996 "bin/arm64/foo/bar/mybin64",
2997 "lib/foo/bar/mylib.so",
2998 "lib/arm/foo/bar/mylib.so",
2999 "lib64/foo/bar/mylib.so",
3000 "lib64/arm64/foo/bar/mylib.so",
3001 })
3002}
3003
Jooyung Han85d61762020-06-24 23:50:26 +09003004func TestVendorApex(t *testing.T) {
Colin Crossc68db4b2021-11-11 18:59:15 -08003005 result := android.GroupFixturePreparers(
3006 prepareForApexTest,
3007 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3008 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003009 apex {
3010 name: "myapex",
3011 key: "myapex.key",
3012 binaries: ["mybin"],
3013 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003014 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003015 }
3016 apex_key {
3017 name: "myapex.key",
3018 public_key: "testkey.avbpubkey",
3019 private_key: "testkey.pem",
3020 }
3021 cc_binary {
3022 name: "mybin",
3023 vendor: true,
3024 shared_libs: ["libfoo"],
3025 }
3026 cc_library {
3027 name: "libfoo",
3028 proprietary: true,
3029 }
3030 `)
3031
Jooyung Hana0503a52023-08-23 13:12:50 +09003032 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003033 "bin/mybin",
3034 "lib64/libfoo.so",
3035 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3036 "lib64/libc++.so",
3037 })
3038
Jooyung Hana0503a52023-08-23 13:12:50 +09003039 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003040 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003041 name := apexBundle.BaseModuleName()
3042 prefix := "TARGET_"
3043 var builder strings.Builder
3044 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003045 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003046 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003047 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003048
Jooyung Hana0503a52023-08-23 13:12:50 +09003049 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003050 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3051 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003052}
3053
Justin Yun13decfb2021-03-08 19:25:55 +09003054func TestProductVariant(t *testing.T) {
3055 ctx := testApex(t, `
3056 apex {
3057 name: "myapex",
3058 key: "myapex.key",
3059 updatable: false,
3060 product_specific: true,
3061 binaries: ["foo"],
3062 }
3063
3064 apex_key {
3065 name: "myapex.key",
3066 public_key: "testkey.avbpubkey",
3067 private_key: "testkey.pem",
3068 }
3069
3070 cc_binary {
3071 name: "foo",
3072 product_available: true,
3073 apex_available: ["myapex"],
3074 srcs: ["foo.cpp"],
3075 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003076 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003077
3078 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003079 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003080 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3081 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3082 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3083 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3084}
3085
Jooyung Han8e5685d2020-09-21 11:02:57 +09003086func TestApex_withPrebuiltFirmware(t *testing.T) {
3087 testCases := []struct {
3088 name string
3089 additionalProp string
3090 }{
3091 {"system apex with prebuilt_firmware", ""},
3092 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3093 }
3094 for _, tc := range testCases {
3095 t.Run(tc.name, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003096 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003097 apex {
3098 name: "myapex",
3099 key: "myapex.key",
3100 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003101 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003102 `+tc.additionalProp+`
3103 }
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }
3109 prebuilt_firmware {
3110 name: "myfirmware",
3111 src: "myfirmware.bin",
3112 filename_from_src: true,
3113 `+tc.additionalProp+`
3114 }
3115 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003117 "etc/firmware/myfirmware.bin",
3118 })
3119 })
3120 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003121}
3122
Jooyung Hanefb184e2020-06-25 17:14:25 +09003123func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003124 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003125 apex {
3126 name: "myapex",
3127 key: "myapex.key",
3128 vendor: true,
3129 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003130 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003131 }
3132
3133 apex_key {
3134 name: "myapex.key",
3135 public_key: "testkey.avbpubkey",
3136 private_key: "testkey.pem",
3137 }
3138
3139 cc_library {
3140 name: "mylib",
3141 vendor_available: true,
3142 }
3143 `)
3144
Jooyung Hana0503a52023-08-23 13:12:50 +09003145 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003146 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003147 name := apexBundle.BaseModuleName()
3148 prefix := "TARGET_"
3149 var builder strings.Builder
3150 data.Custom(&builder, name, prefix, "", data)
3151 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003152 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 +09003153}
3154
Jooyung Han2ed99d02020-06-24 23:26:26 +09003155func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003156 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003157 apex {
3158 name: "myapex",
3159 key: "myapex.key",
3160 vintf_fragments: ["fragment.xml"],
3161 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003162 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003163 }
3164 apex_key {
3165 name: "myapex.key",
3166 public_key: "testkey.avbpubkey",
3167 private_key: "testkey.pem",
3168 }
3169 cc_binary {
3170 name: "mybin",
3171 }
3172 `)
3173
Jooyung Hana0503a52023-08-23 13:12:50 +09003174 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003175 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003176 name := apexBundle.BaseModuleName()
3177 prefix := "TARGET_"
3178 var builder strings.Builder
3179 data.Custom(&builder, name, prefix, "", data)
3180 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003181 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003182 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003183}
3184
Jiyong Park16e91a02018-12-20 18:18:08 +09003185func TestStaticLinking(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003186 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003187 apex {
3188 name: "myapex",
3189 key: "myapex.key",
3190 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003191 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003192 }
3193
3194 apex_key {
3195 name: "myapex.key",
3196 public_key: "testkey.avbpubkey",
3197 private_key: "testkey.pem",
3198 }
3199
3200 cc_library {
3201 name: "mylib",
3202 srcs: ["mylib.cpp"],
3203 system_shared_libs: [],
3204 stl: "none",
3205 stubs: {
3206 versions: ["1", "2", "3"],
3207 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003208 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003209 }
3210
3211 cc_binary {
3212 name: "not_in_apex",
3213 srcs: ["mylib.cpp"],
3214 static_libs: ["mylib"],
3215 static_executable: true,
3216 system_shared_libs: [],
3217 stl: "none",
3218 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003219 `)
3220
Colin Cross7113d202019-11-20 16:39:12 -08003221 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003222
3223 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003224 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003225}
Jiyong Park9335a262018-12-24 11:31:58 +09003226
3227func TestKeys(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003228 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003229 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003230 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003231 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003232 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003233 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003234 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003235 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003236 }
3237
3238 cc_library {
3239 name: "mylib",
3240 srcs: ["mylib.cpp"],
3241 system_shared_libs: [],
3242 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003243 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003244 }
3245
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003252 android_app_certificate {
3253 name: "myapex.certificate",
3254 certificate: "testkey",
3255 }
3256
3257 android_app_certificate {
3258 name: "myapex.certificate.override",
3259 certificate: "testkey.override",
3260 }
3261
Jiyong Park9335a262018-12-24 11:31:58 +09003262 `)
3263
3264 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003265 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003266
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003267 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3268 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003269 "vendor/foo/devkeys/testkey.avbpubkey")
3270 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003271 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3272 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003273 "vendor/foo/devkeys/testkey.pem")
3274 }
3275
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003276 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003277 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003278 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003279 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003280 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003281 }
3282}
Jiyong Park58e364a2019-01-19 19:24:06 +09003283
Jooyung Hanf121a652019-12-17 14:30:11 +09003284func TestCertificate(t *testing.T) {
3285 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003286 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003287 apex {
3288 name: "myapex",
3289 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003290 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003291 }
3292 apex_key {
3293 name: "myapex.key",
3294 public_key: "testkey.avbpubkey",
3295 private_key: "testkey.pem",
3296 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003297 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003298 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3299 if actual := rule.Args["certificates"]; actual != expected {
3300 t.Errorf("certificates should be %q, not %q", expected, actual)
3301 }
3302 })
3303 t.Run("override when unspecified", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003304 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003305 apex {
3306 name: "myapex_keytest",
3307 key: "myapex.key",
3308 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003309 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003310 }
3311 apex_key {
3312 name: "myapex.key",
3313 public_key: "testkey.avbpubkey",
3314 private_key: "testkey.pem",
3315 }
3316 android_app_certificate {
3317 name: "myapex.certificate.override",
3318 certificate: "testkey.override",
3319 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003320 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003321 expected := "testkey.override.x509.pem testkey.override.pk8"
3322 if actual := rule.Args["certificates"]; actual != expected {
3323 t.Errorf("certificates should be %q, not %q", expected, actual)
3324 }
3325 })
3326 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003327 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003328 apex {
3329 name: "myapex",
3330 key: "myapex.key",
3331 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003332 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003333 }
3334 apex_key {
3335 name: "myapex.key",
3336 public_key: "testkey.avbpubkey",
3337 private_key: "testkey.pem",
3338 }
3339 android_app_certificate {
3340 name: "myapex.certificate",
3341 certificate: "testkey",
3342 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003343 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003344 expected := "testkey.x509.pem testkey.pk8"
3345 if actual := rule.Args["certificates"]; actual != expected {
3346 t.Errorf("certificates should be %q, not %q", expected, actual)
3347 }
3348 })
3349 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003350 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003351 apex {
3352 name: "myapex_keytest",
3353 key: "myapex.key",
3354 file_contexts: ":myapex-file_contexts",
3355 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003356 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003357 }
3358 apex_key {
3359 name: "myapex.key",
3360 public_key: "testkey.avbpubkey",
3361 private_key: "testkey.pem",
3362 }
3363 android_app_certificate {
3364 name: "myapex.certificate.override",
3365 certificate: "testkey.override",
3366 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003367 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003368 expected := "testkey.override.x509.pem testkey.override.pk8"
3369 if actual := rule.Args["certificates"]; actual != expected {
3370 t.Errorf("certificates should be %q, not %q", expected, actual)
3371 }
3372 })
3373 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003374 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003375 apex {
3376 name: "myapex",
3377 key: "myapex.key",
3378 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003379 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003380 }
3381 apex_key {
3382 name: "myapex.key",
3383 public_key: "testkey.avbpubkey",
3384 private_key: "testkey.pem",
3385 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003386 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003387 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3388 if actual := rule.Args["certificates"]; actual != expected {
3389 t.Errorf("certificates should be %q, not %q", expected, actual)
3390 }
3391 })
3392 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003393 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003394 apex {
3395 name: "myapex_keytest",
3396 key: "myapex.key",
3397 file_contexts: ":myapex-file_contexts",
3398 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003399 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003400 }
3401 apex_key {
3402 name: "myapex.key",
3403 public_key: "testkey.avbpubkey",
3404 private_key: "testkey.pem",
3405 }
3406 android_app_certificate {
3407 name: "myapex.certificate.override",
3408 certificate: "testkey.override",
3409 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003410 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003411 expected := "testkey.override.x509.pem testkey.override.pk8"
3412 if actual := rule.Args["certificates"]; actual != expected {
3413 t.Errorf("certificates should be %q, not %q", expected, actual)
3414 }
3415 })
3416}
3417
Jiyong Park58e364a2019-01-19 19:24:06 +09003418func TestMacro(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003419 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003420 apex {
3421 name: "myapex",
3422 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003423 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003424 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003425 }
3426
3427 apex {
3428 name: "otherapex",
3429 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003430 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003431 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003432 }
3433
3434 apex_key {
3435 name: "myapex.key",
3436 public_key: "testkey.avbpubkey",
3437 private_key: "testkey.pem",
3438 }
3439
3440 cc_library {
3441 name: "mylib",
3442 srcs: ["mylib.cpp"],
3443 system_shared_libs: [],
3444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003445 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003446 "myapex",
3447 "otherapex",
3448 ],
Jooyung Han24282772020-03-21 23:20:55 +09003449 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003450 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003451 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003452 cc_library {
3453 name: "mylib2",
3454 srcs: ["mylib.cpp"],
3455 system_shared_libs: [],
3456 stl: "none",
3457 apex_available: [
3458 "myapex",
3459 "otherapex",
3460 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003461 static_libs: ["mylib3"],
3462 recovery_available: true,
3463 min_sdk_version: "29",
3464 }
3465 cc_library {
3466 name: "mylib3",
3467 srcs: ["mylib.cpp"],
3468 system_shared_libs: [],
3469 stl: "none",
3470 apex_available: [
3471 "myapex",
3472 "otherapex",
3473 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003474 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003475 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003476 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003477 `)
3478
Jooyung Hanc87a0592020-03-02 17:44:33 +09003479 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003480 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003481 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003482
Vinh Tranf9754732023-01-19 22:41:46 -05003483 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003484 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003485 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003486
Vinh Tranf9754732023-01-19 22:41:46 -05003487 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003488 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003489 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003490
Colin Crossaede88c2020-08-11 12:17:01 -07003491 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3492 // each variant defines additional macros to distinguish which apex variant it is built for
3493
3494 // non-APEX variant does not have __ANDROID_APEX__ defined
3495 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3496 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3497
Vinh Tranf9754732023-01-19 22:41:46 -05003498 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003499 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3500 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003501
Jooyung Hanc87a0592020-03-02 17:44:33 +09003502 // non-APEX variant does not have __ANDROID_APEX__ defined
3503 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3504 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3505
Vinh Tranf9754732023-01-19 22:41:46 -05003506 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003507 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003508 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003509}
Jiyong Park7e636d02019-01-28 16:16:54 +09003510
3511func TestHeaderLibsDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003512 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003513 apex {
3514 name: "myapex",
3515 key: "myapex.key",
3516 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003517 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003518 }
3519
3520 apex_key {
3521 name: "myapex.key",
3522 public_key: "testkey.avbpubkey",
3523 private_key: "testkey.pem",
3524 }
3525
3526 cc_library_headers {
3527 name: "mylib_headers",
3528 export_include_dirs: ["my_include"],
3529 system_shared_libs: [],
3530 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003531 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003532 }
3533
3534 cc_library {
3535 name: "mylib",
3536 srcs: ["mylib.cpp"],
3537 system_shared_libs: [],
3538 stl: "none",
3539 header_libs: ["mylib_headers"],
3540 export_header_lib_headers: ["mylib_headers"],
3541 stubs: {
3542 versions: ["1", "2", "3"],
3543 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003544 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003545 }
3546
3547 cc_library {
3548 name: "otherlib",
3549 srcs: ["mylib.cpp"],
3550 system_shared_libs: [],
3551 stl: "none",
3552 shared_libs: ["mylib"],
3553 }
3554 `)
3555
Colin Cross7113d202019-11-20 16:39:12 -08003556 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003557
3558 // Ensure that the include path of the header lib is exported to 'otherlib'
3559 ensureContains(t, cFlags, "-Imy_include")
3560}
Alex Light9670d332019-01-29 18:07:33 -08003561
Jiyong Park7cd10e32020-01-14 09:22:18 +09003562type fileInApex struct {
3563 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003564 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003565 isLink bool
3566}
3567
Jooyung Han1724d582022-12-21 10:17:44 +09003568func (f fileInApex) String() string {
3569 return f.src + ":" + f.path
3570}
3571
3572func (f fileInApex) match(expectation string) bool {
3573 parts := strings.Split(expectation, ":")
3574 if len(parts) == 1 {
3575 match, _ := path.Match(parts[0], f.path)
3576 return match
3577 }
3578 if len(parts) == 2 {
3579 matchSrc, _ := path.Match(parts[0], f.src)
3580 matchDst, _ := path.Match(parts[1], f.path)
3581 return matchSrc && matchDst
3582 }
3583 panic("invalid expected file specification: " + expectation)
3584}
3585
Jooyung Hana57af4a2020-01-23 05:36:59 +00003586func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003587 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003588 module := ctx.ModuleForTests(moduleName, variant)
3589 apexRule := module.MaybeRule("apexRule")
3590 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003591 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003592 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003593 for _, cmd := range strings.Split(copyCmds, "&&") {
3594 cmd = strings.TrimSpace(cmd)
3595 if cmd == "" {
3596 continue
3597 }
3598 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003599 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003600 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003601 switch terms[0] {
3602 case "mkdir":
3603 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003604 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003605 t.Fatal("copyCmds contains invalid cp command", cmd)
3606 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003607 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003608 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003609 isLink = false
3610 case "ln":
3611 if len(terms) != 3 && len(terms) != 4 {
3612 // ln LINK TARGET or ln -s LINK TARGET
3613 t.Fatal("copyCmds contains invalid ln command", cmd)
3614 }
3615 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003616 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003617 isLink = true
3618 default:
3619 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3620 }
3621 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003622 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003623 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003624 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003625 }
Jooyung Han1724d582022-12-21 10:17:44 +09003626 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003627 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003628 }
3629 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003630 return ret
3631}
3632
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003633func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003634 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003635 var failed bool
3636 var surplus []string
3637 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003638 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003639 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003640 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003641 if file.match(expected) {
3642 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003643 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003644 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003645 }
3646 }
Jooyung Han1724d582022-12-21 10:17:44 +09003647 if !matchFound {
3648 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003649 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003650 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003651
Jooyung Han31c470b2019-10-18 16:26:59 +09003652 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003653 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 t.Log("surplus files", surplus)
3655 failed = true
3656 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003657
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003658 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003659 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003660 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003661 if !filesMatched[expected] {
3662 missing = append(missing, expected)
3663 }
3664 }
3665 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003666 t.Log("missing files", missing)
3667 failed = true
3668 }
3669 if failed {
3670 t.Fail()
3671 }
3672}
3673
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003674func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3675 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3676}
3677
3678func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das2069c3f2023-12-06 19:40:24 +00003679 deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003680 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3681 if deapexer.Output != nil {
3682 outputs = append(outputs, deapexer.Output.String())
3683 }
3684 for _, output := range deapexer.ImplicitOutputs {
3685 outputs = append(outputs, output.String())
3686 }
3687 actualFiles := make([]fileInApex, 0, len(outputs))
3688 for _, output := range outputs {
3689 dir := "/deapexer/"
3690 pos := strings.LastIndex(output, dir)
3691 if pos == -1 {
3692 t.Fatal("Unknown deapexer output ", output)
3693 }
3694 path := output[pos+len(dir):]
3695 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3696 }
3697 assertFileListEquals(t, files, actualFiles)
3698}
3699
Jooyung Han39edb6c2019-11-06 16:53:07 +09003700func vndkLibrariesTxtFiles(vers ...string) (result string) {
3701 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003702 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003703 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003704 prebuilt_etc {
3705 name: "` + txt + `.libraries.` + v + `.txt",
3706 src: "dummy.txt",
3707 }
3708 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003709 }
3710 }
3711 return
3712}
3713
Jooyung Han344d5432019-08-23 11:17:39 +09003714func TestVndkApexVersion(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003715 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003716 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003717 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003718 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003719 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003720 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003721 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003722 }
3723
3724 apex_key {
3725 name: "myapex.key",
3726 public_key: "testkey.avbpubkey",
3727 private_key: "testkey.pem",
3728 }
3729
Jooyung Han31c470b2019-10-18 16:26:59 +09003730 vndk_prebuilt_shared {
3731 name: "libvndk27",
3732 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003733 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003734 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003735 vndk: {
3736 enabled: true,
3737 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003738 target_arch: "arm64",
3739 arch: {
3740 arm: {
3741 srcs: ["libvndk27_arm.so"],
3742 },
3743 arm64: {
3744 srcs: ["libvndk27_arm64.so"],
3745 },
3746 },
Colin Cross2807f002021-03-02 10:15:29 -08003747 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003748 }
3749
3750 vndk_prebuilt_shared {
3751 name: "libvndk27",
3752 version: "27",
3753 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003754 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003755 vndk: {
3756 enabled: true,
3757 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003758 target_arch: "x86_64",
3759 arch: {
3760 x86: {
3761 srcs: ["libvndk27_x86.so"],
3762 },
3763 x86_64: {
3764 srcs: ["libvndk27_x86_64.so"],
3765 },
3766 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003767 }
3768 `+vndkLibrariesTxtFiles("27"),
3769 withFiles(map[string][]byte{
3770 "libvndk27_arm.so": nil,
3771 "libvndk27_arm64.so": nil,
3772 "libvndk27_x86.so": nil,
3773 "libvndk27_x86_64.so": nil,
3774 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003775
Jooyung Hana0503a52023-08-23 13:12:50 +09003776 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003777 "lib/libvndk27_arm.so",
3778 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003779 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003780 })
Jooyung Han344d5432019-08-23 11:17:39 +09003781}
3782
Jooyung Han90eee022019-10-01 20:02:42 +09003783func TestVndkApexNameRule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003784 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003785 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003786 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003787 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003788 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003789 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003790 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003791 }
3792 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003793 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003794 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003795 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003796 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003797 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003798 }
3799 apex_key {
3800 name: "myapex.key",
3801 public_key: "testkey.avbpubkey",
3802 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003803 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003804
3805 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003806 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003807 apexManifestRule := module.Rule("apexManifestRule")
3808 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003809 }
3810
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003811 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003812 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003813}
3814
Jooyung Han344d5432019-08-23 11:17:39 +09003815func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003816 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003817 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003818 name: "com.android.vndk.v30",
3819 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003820 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003821 native_bridge_supported: true,
3822 }
3823
3824 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003825 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003826 public_key: "testkey.avbpubkey",
3827 private_key: "testkey.pem",
3828 }
3829
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003830 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003831 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003832 version: "30",
3833 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003834 srcs: ["mylib.cpp"],
3835 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003836 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003837 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003838 vndk: {
3839 enabled: true,
3840 },
Jooyung Han344d5432019-08-23 11:17:39 +09003841 }
3842 `)
3843}
3844
Jooyung Han31c470b2019-10-18 16:26:59 +09003845func TestVndkApexWithBinder32(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003846 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003847 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003848 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003849 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003850 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003851 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003852 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 }
3854
3855 apex_key {
3856 name: "myapex.key",
3857 public_key: "testkey.avbpubkey",
3858 private_key: "testkey.pem",
3859 }
3860
3861 vndk_prebuilt_shared {
3862 name: "libvndk27",
3863 version: "27",
3864 target_arch: "arm",
3865 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003866 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 vndk: {
3868 enabled: true,
3869 },
3870 arch: {
3871 arm: {
3872 srcs: ["libvndk27.so"],
3873 }
3874 },
3875 }
3876
3877 vndk_prebuilt_shared {
3878 name: "libvndk27",
3879 version: "27",
3880 target_arch: "arm",
3881 binder32bit: true,
3882 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003883 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003884 vndk: {
3885 enabled: true,
3886 },
3887 arch: {
3888 arm: {
3889 srcs: ["libvndk27binder32.so"],
3890 }
3891 },
Colin Cross2807f002021-03-02 10:15:29 -08003892 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003893 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003894 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003895 withFiles(map[string][]byte{
3896 "libvndk27.so": nil,
3897 "libvndk27binder32.so": nil,
3898 }),
3899 withBinder32bit,
3900 withTargets(map[android.OsType][]android.Target{
Wei Li340ee8e2022-03-18 17:33:24 -07003901 android.Android: {
Jooyung Han35155c42020-02-06 17:33:20 +09003902 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
3903 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
Jooyung Han31c470b2019-10-18 16:26:59 +09003904 },
3905 }),
3906 )
3907
Jooyung Hana0503a52023-08-23 13:12:50 +09003908 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003909 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003911 })
3912}
3913
Jooyung Hane1633032019-08-01 17:41:43 +09003914func TestDependenciesInApexManifest(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003915 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003916 apex {
3917 name: "myapex_nodep",
3918 key: "myapex.key",
3919 native_shared_libs: ["lib_nodep"],
3920 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003921 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003922 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003923 }
3924
3925 apex {
3926 name: "myapex_dep",
3927 key: "myapex.key",
3928 native_shared_libs: ["lib_dep"],
3929 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003931 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003932 }
3933
3934 apex {
3935 name: "myapex_provider",
3936 key: "myapex.key",
3937 native_shared_libs: ["libfoo"],
3938 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003939 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003940 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003941 }
3942
3943 apex {
3944 name: "myapex_selfcontained",
3945 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00003946 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09003947 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003948 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003949 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09003950 }
3951
3952 apex_key {
3953 name: "myapex.key",
3954 public_key: "testkey.avbpubkey",
3955 private_key: "testkey.pem",
3956 }
3957
3958 cc_library {
3959 name: "lib_nodep",
3960 srcs: ["mylib.cpp"],
3961 system_shared_libs: [],
3962 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003963 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09003964 }
3965
3966 cc_library {
3967 name: "lib_dep",
3968 srcs: ["mylib.cpp"],
3969 shared_libs: ["libfoo"],
3970 system_shared_libs: [],
3971 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003972 apex_available: [
3973 "myapex_dep",
3974 "myapex_provider",
3975 "myapex_selfcontained",
3976 ],
Jooyung Hane1633032019-08-01 17:41:43 +09003977 }
3978
3979 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00003980 name: "lib_dep_on_bar",
3981 srcs: ["mylib.cpp"],
3982 shared_libs: ["libbar"],
3983 system_shared_libs: [],
3984 stl: "none",
3985 apex_available: [
3986 "myapex_selfcontained",
3987 ],
3988 }
3989
3990
3991 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09003992 name: "libfoo",
3993 srcs: ["mytest.cpp"],
3994 stubs: {
3995 versions: ["1"],
3996 },
3997 system_shared_libs: [],
3998 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003999 apex_available: [
4000 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004001 ],
4002 }
4003
4004 cc_library {
4005 name: "libbar",
4006 srcs: ["mytest.cpp"],
4007 stubs: {
4008 versions: ["1"],
4009 },
4010 system_shared_libs: [],
4011 stl: "none",
4012 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004013 "myapex_selfcontained",
4014 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004015 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004016
Jooyung Hane1633032019-08-01 17:41:43 +09004017 `)
4018
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004019 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004020 var provideNativeLibs, requireNativeLibs []string
4021
Jooyung Hana0503a52023-08-23 13:12:50 +09004022 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004023 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4024 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004025 ensureListEmpty(t, provideNativeLibs)
4026 ensureListEmpty(t, requireNativeLibs)
4027
Jooyung Hana0503a52023-08-23 13:12:50 +09004028 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004029 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4030 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004031 ensureListEmpty(t, provideNativeLibs)
4032 ensureListContains(t, requireNativeLibs, "libfoo.so")
4033
Jooyung Hana0503a52023-08-23 13:12:50 +09004034 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004035 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4036 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004037 ensureListContains(t, provideNativeLibs, "libfoo.so")
4038 ensureListEmpty(t, requireNativeLibs)
4039
Jooyung Hana0503a52023-08-23 13:12:50 +09004040 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004041 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4042 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004043 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004044 ensureListEmpty(t, requireNativeLibs)
4045}
4046
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004047func TestOverrideApexManifestDefaultVersion(t *testing.T) {
4048 ctx := testApex(t, `
4049 apex {
4050 name: "myapex",
4051 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004052 native_shared_libs: ["mylib"],
4053 updatable: false,
4054 }
4055
4056 apex_key {
4057 name: "myapex.key",
4058 public_key: "testkey.avbpubkey",
4059 private_key: "testkey.pem",
4060 }
4061
4062 cc_library {
4063 name: "mylib",
4064 srcs: ["mylib.cpp"],
4065 system_shared_libs: [],
4066 stl: "none",
4067 apex_available: [
4068 "//apex_available:platform",
4069 "myapex",
4070 ],
4071 }
4072 `, android.FixtureMergeEnv(map[string]string{
4073 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4074 }))
4075
Jooyung Hana0503a52023-08-23 13:12:50 +09004076 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004077 apexManifestRule := module.Rule("apexManifestRule")
4078 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4079}
4080
Vinh Tran8f5310f2022-10-07 18:16:47 -04004081func TestCompileMultilibProp(t *testing.T) {
4082 testCases := []struct {
4083 compileMultiLibProp string
4084 containedLibs []string
4085 notContainedLibs []string
4086 }{
4087 {
4088 containedLibs: []string{
4089 "image.apex/lib64/mylib.so",
4090 "image.apex/lib/mylib.so",
4091 },
4092 compileMultiLibProp: `compile_multilib: "both",`,
4093 },
4094 {
4095 containedLibs: []string{"image.apex/lib64/mylib.so"},
4096 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4097 compileMultiLibProp: `compile_multilib: "first",`,
4098 },
4099 {
4100 containedLibs: []string{"image.apex/lib64/mylib.so"},
4101 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4102 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4103 },
4104 {
4105 containedLibs: []string{"image.apex/lib64/mylib.so"},
4106 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4107 compileMultiLibProp: `compile_multilib: "64",`,
4108 },
4109 {
4110 containedLibs: []string{"image.apex/lib/mylib.so"},
4111 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4112 compileMultiLibProp: `compile_multilib: "32",`,
4113 },
4114 }
4115 for _, testCase := range testCases {
4116 ctx := testApex(t, fmt.Sprintf(`
4117 apex {
4118 name: "myapex",
4119 key: "myapex.key",
4120 %s
4121 native_shared_libs: ["mylib"],
4122 updatable: false,
4123 }
4124 apex_key {
4125 name: "myapex.key",
4126 public_key: "testkey.avbpubkey",
4127 private_key: "testkey.pem",
4128 }
4129 cc_library {
4130 name: "mylib",
4131 srcs: ["mylib.cpp"],
4132 apex_available: [
4133 "//apex_available:platform",
4134 "myapex",
4135 ],
4136 }
4137 `, testCase.compileMultiLibProp),
4138 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004139 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004140 apexRule := module.Rule("apexRule")
4141 copyCmds := apexRule.Args["copy_commands"]
4142 for _, containedLib := range testCase.containedLibs {
4143 ensureContains(t, copyCmds, containedLib)
4144 }
4145 for _, notContainedLib := range testCase.notContainedLibs {
4146 ensureNotContains(t, copyCmds, notContainedLib)
4147 }
4148 }
4149}
4150
Alex Light0851b882019-02-07 13:20:53 -08004151func TestNonTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004152 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004153 apex {
4154 name: "myapex",
4155 key: "myapex.key",
4156 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004157 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004158 }
4159
4160 apex_key {
4161 name: "myapex.key",
4162 public_key: "testkey.avbpubkey",
4163 private_key: "testkey.pem",
4164 }
4165
4166 cc_library {
4167 name: "mylib_common",
4168 srcs: ["mylib.cpp"],
4169 system_shared_libs: [],
4170 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004171 apex_available: [
4172 "//apex_available:platform",
4173 "myapex",
4174 ],
Alex Light0851b882019-02-07 13:20:53 -08004175 }
4176 `)
4177
Jooyung Hana0503a52023-08-23 13:12:50 +09004178 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004179 apexRule := module.Rule("apexRule")
4180 copyCmds := apexRule.Args["copy_commands"]
4181
4182 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4183 t.Log("Apex was a test apex!")
4184 t.Fail()
4185 }
4186 // Ensure that main rule creates an output
4187 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4188
4189 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004190 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004191
4192 // Ensure that both direct and indirect deps are copied into apex
4193 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4194
Colin Cross7113d202019-11-20 16:39:12 -08004195 // Ensure that the platform variant ends with _shared
4196 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004197
Colin Cross56a83212020-09-15 18:30:11 -07004198 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004199 t.Log("Found mylib_common not in any apex!")
4200 t.Fail()
4201 }
4202}
4203
4204func TestTestApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004205 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004206 apex_test {
4207 name: "myapex",
4208 key: "myapex.key",
4209 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004210 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004211 }
4212
4213 apex_key {
4214 name: "myapex.key",
4215 public_key: "testkey.avbpubkey",
4216 private_key: "testkey.pem",
4217 }
4218
4219 cc_library {
4220 name: "mylib_common_test",
4221 srcs: ["mylib.cpp"],
4222 system_shared_libs: [],
4223 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004224 // TODO: remove //apex_available:platform
4225 apex_available: [
4226 "//apex_available:platform",
4227 "myapex",
4228 ],
Alex Light0851b882019-02-07 13:20:53 -08004229 }
4230 `)
4231
Jooyung Hana0503a52023-08-23 13:12:50 +09004232 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004233 apexRule := module.Rule("apexRule")
4234 copyCmds := apexRule.Args["copy_commands"]
4235
4236 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4237 t.Log("Apex was not a test apex!")
4238 t.Fail()
4239 }
4240 // Ensure that main rule creates an output
4241 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4242
4243 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004244 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004245
4246 // Ensure that both direct and indirect deps are copied into apex
4247 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4248
Colin Cross7113d202019-11-20 16:39:12 -08004249 // Ensure that the platform variant ends with _shared
4250 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004251}
4252
Jooyung Han85707de2023-12-01 14:21:13 +09004253func TestLibzVendorIsntStable(t *testing.T) {
4254 ctx := testApex(t, `
4255 apex {
4256 name: "myapex",
4257 key: "myapex.key",
4258 updatable: false,
4259 binaries: ["mybin"],
4260 }
4261 apex {
4262 name: "myvendorapex",
4263 key: "myapex.key",
4264 file_contexts: "myvendorapex_file_contexts",
4265 vendor: true,
4266 updatable: false,
4267 binaries: ["mybin"],
4268 }
4269 apex_key {
4270 name: "myapex.key",
4271 public_key: "testkey.avbpubkey",
4272 private_key: "testkey.pem",
4273 }
4274 cc_binary {
4275 name: "mybin",
4276 vendor_available: true,
4277 system_shared_libs: [],
4278 stl: "none",
4279 shared_libs: ["libz"],
4280 apex_available: ["//apex_available:anyapex"],
4281 }
4282 cc_library {
4283 name: "libz",
4284 vendor_available: true,
4285 system_shared_libs: [],
4286 stl: "none",
4287 stubs: {
4288 versions: ["28", "30"],
4289 },
4290 target: {
4291 vendor: {
4292 no_stubs: true,
4293 },
4294 },
4295 }
4296 `, withFiles(map[string][]byte{
4297 "myvendorapex_file_contexts": nil,
4298 }))
4299
4300 // libz provides stubs for core variant.
4301 {
4302 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4303 "bin/mybin",
4304 })
4305 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4306 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4307 }
4308 // libz doesn't provide stubs for vendor variant.
4309 {
4310 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4311 "bin/mybin",
4312 "lib64/libz.so",
4313 })
4314 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4315 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4316 }
4317}
4318
Alex Light9670d332019-01-29 18:07:33 -08004319func TestApexWithTarget(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004320 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004321 apex {
4322 name: "myapex",
4323 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004324 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004325 multilib: {
4326 first: {
4327 native_shared_libs: ["mylib_common"],
4328 }
4329 },
4330 target: {
4331 android: {
4332 multilib: {
4333 first: {
4334 native_shared_libs: ["mylib"],
4335 }
4336 }
4337 },
4338 host: {
4339 multilib: {
4340 first: {
4341 native_shared_libs: ["mylib2"],
4342 }
4343 }
4344 }
4345 }
4346 }
4347
4348 apex_key {
4349 name: "myapex.key",
4350 public_key: "testkey.avbpubkey",
4351 private_key: "testkey.pem",
4352 }
4353
4354 cc_library {
4355 name: "mylib",
4356 srcs: ["mylib.cpp"],
4357 system_shared_libs: [],
4358 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004359 // TODO: remove //apex_available:platform
4360 apex_available: [
4361 "//apex_available:platform",
4362 "myapex",
4363 ],
Alex Light9670d332019-01-29 18:07:33 -08004364 }
4365
4366 cc_library {
4367 name: "mylib_common",
4368 srcs: ["mylib.cpp"],
4369 system_shared_libs: [],
4370 stl: "none",
4371 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004372 // TODO: remove //apex_available:platform
4373 apex_available: [
4374 "//apex_available:platform",
4375 "myapex",
4376 ],
Alex Light9670d332019-01-29 18:07:33 -08004377 }
4378
4379 cc_library {
4380 name: "mylib2",
4381 srcs: ["mylib.cpp"],
4382 system_shared_libs: [],
4383 stl: "none",
4384 compile_multilib: "first",
4385 }
4386 `)
4387
Jooyung Hana0503a52023-08-23 13:12:50 +09004388 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004389 copyCmds := apexRule.Args["copy_commands"]
4390
4391 // Ensure that main rule creates an output
4392 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4393
4394 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004395 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4396 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4397 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004398
4399 // Ensure that both direct and indirect deps are copied into apex
4400 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4401 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4402 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4403
Colin Cross7113d202019-11-20 16:39:12 -08004404 // Ensure that the platform variant ends with _shared
4405 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4406 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4407 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004408}
Jiyong Park04480cf2019-02-06 00:16:29 +09004409
Jiyong Park59140302020-12-14 18:44:04 +09004410func TestApexWithArch(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004411 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004412 apex {
4413 name: "myapex",
4414 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004415 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004416 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004417 arch: {
4418 arm64: {
4419 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004420 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004421 },
4422 x86_64: {
4423 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004424 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004425 },
4426 }
4427 }
4428
4429 apex_key {
4430 name: "myapex.key",
4431 public_key: "testkey.avbpubkey",
4432 private_key: "testkey.pem",
4433 }
4434
4435 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004436 name: "mylib.generic",
4437 srcs: ["mylib.cpp"],
4438 system_shared_libs: [],
4439 stl: "none",
4440 // TODO: remove //apex_available:platform
4441 apex_available: [
4442 "//apex_available:platform",
4443 "myapex",
4444 ],
4445 }
4446
4447 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004448 name: "mylib.arm64",
4449 srcs: ["mylib.cpp"],
4450 system_shared_libs: [],
4451 stl: "none",
4452 // TODO: remove //apex_available:platform
4453 apex_available: [
4454 "//apex_available:platform",
4455 "myapex",
4456 ],
4457 }
4458
4459 cc_library {
4460 name: "mylib.x64",
4461 srcs: ["mylib.cpp"],
4462 system_shared_libs: [],
4463 stl: "none",
4464 // TODO: remove //apex_available:platform
4465 apex_available: [
4466 "//apex_available:platform",
4467 "myapex",
4468 ],
4469 }
4470 `)
4471
Jooyung Hana0503a52023-08-23 13:12:50 +09004472 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004473 copyCmds := apexRule.Args["copy_commands"]
4474
4475 // Ensure that apex variant is created for the direct dep
4476 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004477 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004478 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4479
4480 // Ensure that both direct and indirect deps are copied into apex
4481 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4482 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4483}
4484
Jiyong Park04480cf2019-02-06 00:16:29 +09004485func TestApexWithShBinary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004486 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004487 apex {
4488 name: "myapex",
4489 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004490 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004491 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004492 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004493 }
4494
4495 apex_key {
4496 name: "myapex.key",
4497 public_key: "testkey.avbpubkey",
4498 private_key: "testkey.pem",
4499 }
4500
4501 sh_binary {
4502 name: "myscript",
4503 src: "mylib.cpp",
4504 filename: "myscript.sh",
4505 sub_dir: "script",
4506 }
4507 `)
4508
Jooyung Hana0503a52023-08-23 13:12:50 +09004509 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004510 copyCmds := apexRule.Args["copy_commands"]
4511
4512 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4513}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004514
Jooyung Han91df2082019-11-20 01:49:42 +09004515func TestApexInVariousPartition(t *testing.T) {
4516 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004517 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004518 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004519 {"", "system"},
4520 {"product_specific: true", "product"},
4521 {"soc_specific: true", "vendor"},
4522 {"proprietary: true", "vendor"},
4523 {"vendor: true", "vendor"},
4524 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004525 }
4526 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004527 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004528 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004529 apex {
4530 name: "myapex",
4531 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004532 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004533 `+tc.propName+`
4534 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004535
Jooyung Han91df2082019-11-20 01:49:42 +09004536 apex_key {
4537 name: "myapex.key",
4538 public_key: "testkey.avbpubkey",
4539 private_key: "testkey.pem",
4540 }
4541 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004542
Jooyung Hana0503a52023-08-23 13:12:50 +09004543 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004544 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004545 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004546 if actual != expected {
4547 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4548 }
Jooyung Han91df2082019-11-20 01:49:42 +09004549 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004550 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004551}
Jiyong Park67882562019-03-21 01:11:21 +09004552
Jooyung Han580eb4f2020-06-24 19:33:06 +09004553func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004554 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004555 apex {
4556 name: "myapex",
4557 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004558 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004559 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004560
Jooyung Han580eb4f2020-06-24 19:33:06 +09004561 apex_key {
4562 name: "myapex.key",
4563 public_key: "testkey.avbpubkey",
4564 private_key: "testkey.pem",
4565 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004566 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004567 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004568 rule := module.Output("file_contexts")
4569 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4570}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004571
Jooyung Han580eb4f2020-06-24 19:33:06 +09004572func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004573 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004574 apex {
4575 name: "myapex",
4576 key: "myapex.key",
4577 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004578 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004579 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004580
Jooyung Han580eb4f2020-06-24 19:33:06 +09004581 apex_key {
4582 name: "myapex.key",
4583 public_key: "testkey.avbpubkey",
4584 private_key: "testkey.pem",
4585 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004586 `, withFiles(map[string][]byte{
4587 "my_own_file_contexts": nil,
4588 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004589}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004590
Jooyung Han580eb4f2020-06-24 19:33:06 +09004591func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Jooyung Han54aca7b2019-11-20 02:26:02 +09004592 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004593 apex {
4594 name: "myapex",
4595 key: "myapex.key",
4596 product_specific: true,
4597 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004598 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004599 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004600
Jooyung Han580eb4f2020-06-24 19:33:06 +09004601 apex_key {
4602 name: "myapex.key",
4603 public_key: "testkey.avbpubkey",
4604 private_key: "testkey.pem",
4605 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004606 `)
4607
Colin Cross1c460562021-02-16 17:55:47 -08004608 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004609 apex {
4610 name: "myapex",
4611 key: "myapex.key",
4612 product_specific: true,
4613 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004614 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004615 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004616
Jooyung Han580eb4f2020-06-24 19:33:06 +09004617 apex_key {
4618 name: "myapex.key",
4619 public_key: "testkey.avbpubkey",
4620 private_key: "testkey.pem",
4621 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004622 `, withFiles(map[string][]byte{
4623 "product_specific_file_contexts": nil,
4624 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004625 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004626 rule := module.Output("file_contexts")
4627 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4628}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004629
Jooyung Han580eb4f2020-06-24 19:33:06 +09004630func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004631 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004632 apex {
4633 name: "myapex",
4634 key: "myapex.key",
4635 product_specific: true,
4636 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004637 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004638 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004639
Jooyung Han580eb4f2020-06-24 19:33:06 +09004640 apex_key {
4641 name: "myapex.key",
4642 public_key: "testkey.avbpubkey",
4643 private_key: "testkey.pem",
4644 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004645
Jooyung Han580eb4f2020-06-24 19:33:06 +09004646 filegroup {
4647 name: "my-file-contexts",
4648 srcs: ["product_specific_file_contexts"],
4649 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004650 `, withFiles(map[string][]byte{
4651 "product_specific_file_contexts": nil,
4652 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004653 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004654 rule := module.Output("file_contexts")
4655 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004656}
4657
Jiyong Park67882562019-03-21 01:11:21 +09004658func TestApexKeyFromOtherModule(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004659 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004660 apex_key {
4661 name: "myapex.key",
4662 public_key: ":my.avbpubkey",
4663 private_key: ":my.pem",
4664 product_specific: true,
4665 }
4666
4667 filegroup {
4668 name: "my.avbpubkey",
4669 srcs: ["testkey2.avbpubkey"],
4670 }
4671
4672 filegroup {
4673 name: "my.pem",
4674 srcs: ["testkey2.pem"],
4675 }
4676 `)
4677
4678 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4679 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004680 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004681 if actual_pubkey != expected_pubkey {
4682 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4683 }
4684 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004685 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004686 if actual_privkey != expected_privkey {
4687 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4688 }
4689}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004690
4691func TestPrebuilt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004692 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004693 prebuilt_apex {
4694 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004695 arch: {
4696 arm64: {
4697 src: "myapex-arm64.apex",
4698 },
4699 arm: {
4700 src: "myapex-arm.apex",
4701 },
4702 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004703 }
4704 `)
4705
Wei Li340ee8e2022-03-18 17:33:24 -07004706 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4707 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004708
Jiyong Parkc95714e2019-03-29 14:23:10 +09004709 expectedInput := "myapex-arm64.apex"
4710 if prebuilt.inputApex.String() != expectedInput {
4711 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4712 }
Wei Li340ee8e2022-03-18 17:33:24 -07004713 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4714 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4715 rule := testingModule.Rule("genProvenanceMetaData")
4716 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4717 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4718 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4719 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004720
4721 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4722 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004723}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004724
Paul Duffinc0609c62021-03-01 17:27:16 +00004725func TestPrebuiltMissingSrc(t *testing.T) {
Paul Duffin6717d882021-06-15 19:09:41 +01004726 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004727 prebuilt_apex {
4728 name: "myapex",
4729 }
4730 `)
4731}
4732
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004733func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004734 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004735 prebuilt_apex {
4736 name: "myapex",
4737 src: "myapex-arm.apex",
4738 filename: "notmyapex.apex",
4739 }
4740 `)
4741
Wei Li340ee8e2022-03-18 17:33:24 -07004742 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4743 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004744
4745 expected := "notmyapex.apex"
4746 if p.installFilename != expected {
4747 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4748 }
Wei Li340ee8e2022-03-18 17:33:24 -07004749 rule := testingModule.Rule("genProvenanceMetaData")
4750 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4751 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4752 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4753 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004754}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004755
Samiul Islam7c02e262021-09-08 17:48:28 +01004756func TestApexSetFilenameOverride(t *testing.T) {
4757 testApex(t, `
4758 apex_set {
4759 name: "com.company.android.myapex",
4760 apex_name: "com.android.myapex",
4761 set: "company-myapex.apks",
4762 filename: "com.company.android.myapex.apex"
4763 }
4764 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4765
4766 testApex(t, `
4767 apex_set {
4768 name: "com.company.android.myapex",
4769 apex_name: "com.android.myapex",
4770 set: "company-myapex.apks",
4771 filename: "com.company.android.myapex.capex"
4772 }
4773 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4774
4775 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4776 apex_set {
4777 name: "com.company.android.myapex",
4778 apex_name: "com.android.myapex",
4779 set: "company-myapex.apks",
4780 filename: "some-random-suffix"
4781 }
4782 `)
4783}
4784
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004785func TestPrebuiltOverrides(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08004786 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004787 prebuilt_apex {
4788 name: "myapex.prebuilt",
4789 src: "myapex-arm.apex",
4790 overrides: [
4791 "myapex",
4792 ],
4793 }
4794 `)
4795
Wei Li340ee8e2022-03-18 17:33:24 -07004796 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4797 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004798
4799 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004800 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004801 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004802 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004803 }
Wei Li340ee8e2022-03-18 17:33:24 -07004804 rule := testingModule.Rule("genProvenanceMetaData")
4805 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4806 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4807 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4808 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004809}
4810
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004811func TestPrebuiltApexName(t *testing.T) {
4812 testApex(t, `
4813 prebuilt_apex {
4814 name: "com.company.android.myapex",
4815 apex_name: "com.android.myapex",
4816 src: "company-myapex-arm.apex",
4817 }
4818 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4819
4820 testApex(t, `
4821 apex_set {
4822 name: "com.company.android.myapex",
4823 apex_name: "com.android.myapex",
4824 set: "company-myapex.apks",
4825 }
4826 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4827}
4828
4829func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
4830 _ = android.GroupFixturePreparers(
4831 java.PrepareForTestWithJavaDefaultModules,
4832 PrepareForTestWithApexBuildComponents,
4833 android.FixtureWithRootAndroidBp(`
4834 platform_bootclasspath {
4835 name: "platform-bootclasspath",
4836 fragments: [
4837 {
4838 apex: "com.android.art",
4839 module: "art-bootclasspath-fragment",
4840 },
4841 ],
4842 }
4843
4844 prebuilt_apex {
4845 name: "com.company.android.art",
4846 apex_name: "com.android.art",
4847 src: "com.company.android.art-arm.apex",
4848 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4849 }
4850
4851 prebuilt_bootclasspath_fragment {
4852 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004853 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004854 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004855 hidden_api: {
4856 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4857 metadata: "my-bootclasspath-fragment/metadata.csv",
4858 index: "my-bootclasspath-fragment/index.csv",
4859 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4860 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4861 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004862 }
4863
4864 java_import {
4865 name: "core-oj",
4866 jars: ["prebuilt.jar"],
4867 }
4868 `),
4869 ).RunTest(t)
4870}
4871
Spandan Das59a4a2b2024-01-09 21:35:56 +00004872// A minimal context object for use with DexJarBuildPath
4873type moduleErrorfTestCtx struct {
4874}
4875
4876func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4877}
4878
Paul Duffin092153d2021-01-26 11:42:39 +00004879// These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
4880// propagation of paths to dex implementation jars from the former to the latter.
Paul Duffin064b70c2020-11-02 17:32:38 +00004881func TestPrebuiltExportDexImplementationJars(t *testing.T) {
Paul Duffin60264a02021-04-12 20:02:36 +01004882 transform := android.NullFixturePreparer
Paul Duffin064b70c2020-11-02 17:32:38 +00004883
Paul Duffin89886cb2021-02-05 16:44:03 +00004884 checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004885 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004886 // Make sure the import has been given the correct path to the dex jar.
Colin Crossdcf71b22021-02-01 13:59:03 -08004887 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
Spandan Das59a4a2b2024-01-09 21:35:56 +00004888 dexJarBuildPath := p.DexJarBuildPath(moduleErrorfTestCtx{}).PathOrNil()
Paul Duffin39853512021-02-26 11:09:39 +00004889 stem := android.RemoveOptionalPrebuiltPrefix(name)
Jeongik Chad5fe8782021-07-08 01:13:11 +09004890 android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
Spandan Das3576e762024-01-03 18:57:03 +00004891 ".intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
Jeongik Chad5fe8782021-07-08 01:13:11 +09004892 android.NormalizePathForTesting(dexJarBuildPath))
4893 }
4894
4895 checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004896 t.Helper()
Jeongik Chad5fe8782021-07-08 01:13:11 +09004897 // Make sure the import has been given the correct path to the dex jar.
4898 p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
4899 dexJarBuildPath := p.DexJarInstallPath()
4900 stem := android.RemoveOptionalPrebuiltPrefix(name)
4901 android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
4902 "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
4903 android.NormalizePathForTesting(dexJarBuildPath))
Paul Duffin064b70c2020-11-02 17:32:38 +00004904 }
4905
Paul Duffin39853512021-02-26 11:09:39 +00004906 ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
Martin Stjernholm8be1e6d2021-09-15 03:34:04 +01004907 t.Helper()
Paul Duffin064b70c2020-11-02 17:32:38 +00004908 // Make sure that an apex variant is not created for the source module.
Jeongik Chad5fe8782021-07-08 01:13:11 +09004909 android.AssertArrayString(t, "Check if there is no source variant",
4910 []string{"android_common"},
4911 ctx.ModuleVariantsForTests(name))
Paul Duffin064b70c2020-11-02 17:32:38 +00004912 }
4913
4914 t.Run("prebuilt only", func(t *testing.T) {
4915 bp := `
4916 prebuilt_apex {
4917 name: "myapex",
4918 arch: {
4919 arm64: {
4920 src: "myapex-arm64.apex",
4921 },
4922 arm: {
4923 src: "myapex-arm.apex",
4924 },
4925 },
Paul Duffin39853512021-02-26 11:09:39 +00004926 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004927 }
4928
4929 java_import {
4930 name: "libfoo",
4931 jars: ["libfoo.jar"],
4932 }
Paul Duffin39853512021-02-26 11:09:39 +00004933
4934 java_sdk_library_import {
4935 name: "libbar",
4936 public: {
4937 jars: ["libbar.jar"],
4938 },
4939 }
Paul Duffin064b70c2020-11-02 17:32:38 +00004940 `
4941
4942 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
4943 ctx := testDexpreoptWithApexes(t, bp, "", transform)
4944
Spandan Das3576e762024-01-03 18:57:03 +00004945 deapexerName := deapexerModuleName("prebuilt_myapex")
4946 android.AssertStringEquals(t, "APEX module name from deapexer name", "prebuilt_myapex", apexModuleName(deapexerName))
Martin Stjernholm44825602021-09-17 01:44:12 +01004947
Paul Duffinf6932af2021-02-26 18:21:56 +00004948 // Make sure that the deapexer has the correct input APEX.
Martin Stjernholm44825602021-09-17 01:44:12 +01004949 deapexer := ctx.ModuleForTests(deapexerName, "android_common")
Paul Duffinf6932af2021-02-26 18:21:56 +00004950 rule := deapexer.Rule("deapexer")
4951 if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
4952 t.Errorf("expected: %q, found: %q", expected, actual)
4953 }
4954
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004955 // Make sure that the prebuilt_apex has the correct input APEX.
Paul Duffin6717d882021-06-15 19:09:41 +01004956 prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin0d10c3c2021-03-01 17:09:32 +00004957 rule = prebuiltApex.Rule("android/soong/android.Cp")
4958 if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
4959 t.Errorf("expected: %q, found: %q", expected, actual)
4960 }
4961
Paul Duffin89886cb2021-02-05 16:44:03 +00004962 checkDexJarBuildPath(t, ctx, "libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004963 checkDexJarInstallPath(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00004964
4965 checkDexJarBuildPath(t, ctx, "libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09004966 checkDexJarInstallPath(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00004967 })
4968
4969 t.Run("prebuilt with source preferred", func(t *testing.T) {
4970
4971 bp := `
4972 prebuilt_apex {
4973 name: "myapex",
4974 arch: {
4975 arm64: {
4976 src: "myapex-arm64.apex",
4977 },
4978 arm: {
4979 src: "myapex-arm.apex",
4980 },
4981 },
Paul Duffin39853512021-02-26 11:09:39 +00004982 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00004983 }
4984
4985 java_import {
4986 name: "libfoo",
4987 jars: ["libfoo.jar"],
4988 }
4989
4990 java_library {
4991 name: "libfoo",
4992 }
Paul Duffin39853512021-02-26 11:09:39 +00004993
4994 java_sdk_library_import {
4995 name: "libbar",
4996 public: {
4997 jars: ["libbar.jar"],
4998 },
4999 }
5000
5001 java_sdk_library {
5002 name: "libbar",
5003 srcs: ["foo/bar/MyClass.java"],
5004 unsafe_ignore_missing_latest_api: true,
5005 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005006 `
5007
5008 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5009 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5010
Paul Duffin89886cb2021-02-05 16:44:03 +00005011 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005012 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Priyanka Advani (xWF)33b3a632024-08-28 23:10:29 +00005013 ensureNoSourceVariant(t, ctx, "libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005014
5015 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005016 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Priyanka Advani (xWF)33b3a632024-08-28 23:10:29 +00005017 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005018 })
5019
5020 t.Run("prebuilt preferred with source", func(t *testing.T) {
5021 bp := `
5022 prebuilt_apex {
5023 name: "myapex",
Paul Duffin064b70c2020-11-02 17:32:38 +00005024 arch: {
5025 arm64: {
5026 src: "myapex-arm64.apex",
5027 },
5028 arm: {
5029 src: "myapex-arm.apex",
5030 },
5031 },
Paul Duffin39853512021-02-26 11:09:39 +00005032 exported_java_libs: ["libfoo", "libbar"],
Paul Duffin064b70c2020-11-02 17:32:38 +00005033 }
5034
5035 java_import {
5036 name: "libfoo",
Paul Duffin092153d2021-01-26 11:42:39 +00005037 prefer: true,
Paul Duffin064b70c2020-11-02 17:32:38 +00005038 jars: ["libfoo.jar"],
5039 }
5040
5041 java_library {
5042 name: "libfoo",
5043 }
Paul Duffin39853512021-02-26 11:09:39 +00005044
5045 java_sdk_library_import {
5046 name: "libbar",
5047 prefer: true,
5048 public: {
5049 jars: ["libbar.jar"],
5050 },
5051 }
5052
5053 java_sdk_library {
5054 name: "libbar",
5055 srcs: ["foo/bar/MyClass.java"],
5056 unsafe_ignore_missing_latest_api: true,
5057 }
Paul Duffin064b70c2020-11-02 17:32:38 +00005058 `
5059
5060 // Make sure that dexpreopt can access dex implementation files from the prebuilt.
5061 ctx := testDexpreoptWithApexes(t, bp, "", transform)
5062
Paul Duffin89886cb2021-02-05 16:44:03 +00005063 checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005064 checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
Paul Duffin39853512021-02-26 11:09:39 +00005065 ensureNoSourceVariant(t, ctx, "libfoo")
5066
5067 checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
Jeongik Chad5fe8782021-07-08 01:13:11 +09005068 checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
Paul Duffin39853512021-02-26 11:09:39 +00005069 ensureNoSourceVariant(t, ctx, "libbar")
Paul Duffin064b70c2020-11-02 17:32:38 +00005070 })
5071}
5072
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Paul Duffinb6f53c02021-05-14 07:52:42 +01005074 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005075 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005076 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5077 // is disabled.
5078 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005079
5080 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5081 // file creation.
5082 java.FixtureConfigureBootJars("platform:foo"),
5083 android.FixtureModifyMockFS(func(fs android.MockFS) {
5084 fs["platform/Android.bp"] = []byte(`
5085 java_library {
5086 name: "foo",
5087 srcs: ["Test.java"],
5088 compile_dex: true,
5089 }
5090 `)
5091 fs["platform/Test.java"] = nil
5092 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005093 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005094
Paul Duffin37856732021-02-26 14:24:15 +00005095 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
5096 t.Helper()
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005097 s := ctx.ModuleForTests("dex_bootjars", "android_common")
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005098 foundLibfooJar := false
Paul Duffin37856732021-02-26 14:24:15 +00005099 base := stem + ".jar"
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005100 for _, output := range s.AllOutputs() {
Paul Duffin37856732021-02-26 14:24:15 +00005101 if filepath.Base(output) == base {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005102 foundLibfooJar = true
5103 buildRule := s.Output(output)
Paul Duffin55607122021-03-30 23:32:51 +01005104 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005105 }
5106 }
5107 if !foundLibfooJar {
Lukacs T. Berki9f6c24a2021-08-26 15:07:24 +02005108 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 +00005109 }
5110 }
5111
Paul Duffin40a3f652021-07-19 13:11:24 +01005112 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005113 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005114 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005115 var rule android.TestingBuildParams
5116
5117 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5118 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005119 }
5120
Paul Duffin40a3f652021-07-19 13:11:24 +01005121 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5122 t.Helper()
5123 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5124 var rule android.TestingBuildParams
5125
5126 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5127 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5128 }
5129
Paul Duffin89f570a2021-06-16 01:42:33 +01005130 fragment := java.ApexVariantReference{
5131 Apex: proptools.StringPtr("myapex"),
5132 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5133 }
5134
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005135 t.Run("prebuilt only", func(t *testing.T) {
5136 bp := `
5137 prebuilt_apex {
5138 name: "myapex",
5139 arch: {
5140 arm64: {
5141 src: "myapex-arm64.apex",
5142 },
5143 arm: {
5144 src: "myapex-arm.apex",
5145 },
5146 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005147 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5148 }
5149
5150 prebuilt_bootclasspath_fragment {
5151 name: "my-bootclasspath-fragment",
5152 contents: ["libfoo", "libbar"],
5153 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005154 hidden_api: {
5155 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5156 metadata: "my-bootclasspath-fragment/metadata.csv",
5157 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005158 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5159 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5160 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005161 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005162 }
5163
5164 java_import {
5165 name: "libfoo",
5166 jars: ["libfoo.jar"],
5167 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005168 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 }
Paul Duffin37856732021-02-26 14:24:15 +00005170
5171 java_sdk_library_import {
5172 name: "libbar",
5173 public: {
5174 jars: ["libbar.jar"],
5175 },
5176 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005177 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005178 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005179 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005180 `
5181
Paul Duffin89f570a2021-06-16 01:42:33 +01005182 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005183 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5184 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005185
Paul Duffin537ea3d2021-05-14 10:38:00 +01005186 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005187 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005188 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005189 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005190 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005191 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 +01005192 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005193 })
5194
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005195 t.Run("apex_set only", func(t *testing.T) {
5196 bp := `
5197 apex_set {
5198 name: "myapex",
5199 set: "myapex.apks",
Liz Kammer2dc72442023-04-20 10:10:48 -04005200 exported_java_libs: ["myjavalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005201 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005202 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5203 }
5204
5205 java_import {
5206 name: "myjavalib",
5207 jars: ["myjavalib.jar"],
5208 apex_available: ["myapex"],
5209 permitted_packages: ["javalib"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005210 }
5211
5212 prebuilt_bootclasspath_fragment {
5213 name: "my-bootclasspath-fragment",
5214 contents: ["libfoo", "libbar"],
5215 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005216 hidden_api: {
5217 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5218 metadata: "my-bootclasspath-fragment/metadata.csv",
5219 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005220 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5221 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5222 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005223 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005224 }
5225
Liz Kammer2dc72442023-04-20 10:10:48 -04005226 prebuilt_systemserverclasspath_fragment {
5227 name: "my-systemserverclasspath-fragment",
5228 contents: ["libbaz"],
5229 apex_available: ["myapex"],
5230 }
5231
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005232 java_import {
5233 name: "libfoo",
5234 jars: ["libfoo.jar"],
5235 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005236 permitted_packages: ["foo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005237 }
5238
5239 java_sdk_library_import {
5240 name: "libbar",
5241 public: {
5242 jars: ["libbar.jar"],
5243 },
5244 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005245 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005246 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005247 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005248
5249 java_sdk_library_import {
5250 name: "libbaz",
5251 public: {
5252 jars: ["libbaz.jar"],
5253 },
5254 apex_available: ["myapex"],
5255 shared_library: false,
5256 permitted_packages: ["baz"],
5257 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005258 `
5259
Paul Duffin89f570a2021-06-16 01:42:33 +01005260 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005261 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5262 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005263
Paul Duffin537ea3d2021-05-14 10:38:00 +01005264 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005265 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005266 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005267 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005268 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005269 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 +01005270 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005271
5272 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5273
5274 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005275 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005276 "myjavalib.myapex",
5277 "libfoo.myapex",
5278 "libbar.myapex",
5279 "libbaz.myapex",
5280 }
5281 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5282 for i, e := range mkEntries {
5283 g := e.OverrideName
5284 if w := overrideNames[i]; w != g {
5285 t.Errorf("Expected override name %q, got %q", w, g)
5286 }
5287 }
5288
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005289 })
5290
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005291 t.Run("prebuilt with source library preferred", func(t *testing.T) {
5292 bp := `
5293 prebuilt_apex {
5294 name: "myapex",
5295 arch: {
5296 arm64: {
5297 src: "myapex-arm64.apex",
5298 },
5299 arm: {
5300 src: "myapex-arm.apex",
5301 },
5302 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005303 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5304 }
5305
5306 prebuilt_bootclasspath_fragment {
5307 name: "my-bootclasspath-fragment",
5308 contents: ["libfoo", "libbar"],
5309 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005310 hidden_api: {
5311 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5312 metadata: "my-bootclasspath-fragment/metadata.csv",
5313 index: "my-bootclasspath-fragment/index.csv",
5314 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5315 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5316 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 }
5318
5319 java_import {
5320 name: "libfoo",
5321 jars: ["libfoo.jar"],
5322 apex_available: ["myapex"],
5323 }
5324
5325 java_library {
5326 name: "libfoo",
5327 srcs: ["foo/bar/MyClass.java"],
5328 apex_available: ["myapex"],
5329 }
Paul Duffin37856732021-02-26 14:24:15 +00005330
5331 java_sdk_library_import {
5332 name: "libbar",
5333 public: {
5334 jars: ["libbar.jar"],
5335 },
5336 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005337 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005338 }
5339
5340 java_sdk_library {
5341 name: "libbar",
5342 srcs: ["foo/bar/MyClass.java"],
5343 unsafe_ignore_missing_latest_api: true,
5344 apex_available: ["myapex"],
5345 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005346 `
5347
5348 // In this test the source (java_library) libfoo is active since the
5349 // prebuilt (java_import) defaults to prefer:false. However the
5350 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5351 // find the dex boot jar in it. We either need to disable the source libfoo
5352 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005353 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005354 // dexbootjar check is skipped if AllowMissingDependencies is true
5355 preparerAllowMissingDeps := android.GroupFixturePreparers(
5356 preparer,
5357 android.PrepareForTestWithAllowMissingDependencies,
5358 )
5359 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005360 })
5361
5362 t.Run("prebuilt library preferred with source", func(t *testing.T) {
5363 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005364 apex {
5365 name: "myapex",
5366 key: "myapex.key",
5367 updatable: false,
5368 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5369 }
5370
5371 apex_key {
5372 name: "myapex.key",
5373 public_key: "testkey.avbpubkey",
5374 private_key: "testkey.pem",
5375 }
5376
5377 bootclasspath_fragment {
5378 name: "my-bootclasspath-fragment",
5379 contents: ["libfoo", "libbar"],
5380 apex_available: ["myapex"],
5381 hidden_api: {
5382 split_packages: ["*"],
5383 },
5384 }
5385
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005386 prebuilt_apex {
5387 name: "myapex",
5388 arch: {
5389 arm64: {
5390 src: "myapex-arm64.apex",
5391 },
5392 arm: {
5393 src: "myapex-arm.apex",
5394 },
5395 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005396 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5397 }
5398
5399 prebuilt_bootclasspath_fragment {
5400 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005401 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 contents: ["libfoo", "libbar"],
5403 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005404 hidden_api: {
5405 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5406 metadata: "my-bootclasspath-fragment/metadata.csv",
5407 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005408 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5409 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5410 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005411 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005412 }
5413
5414 java_import {
5415 name: "libfoo",
5416 prefer: true,
5417 jars: ["libfoo.jar"],
5418 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005419 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 }
5421
5422 java_library {
5423 name: "libfoo",
5424 srcs: ["foo/bar/MyClass.java"],
5425 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005426 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005427 }
Paul Duffin37856732021-02-26 14:24:15 +00005428
5429 java_sdk_library_import {
5430 name: "libbar",
5431 prefer: true,
5432 public: {
5433 jars: ["libbar.jar"],
5434 },
5435 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005436 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005437 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005438 }
5439
5440 java_sdk_library {
5441 name: "libbar",
5442 srcs: ["foo/bar/MyClass.java"],
5443 unsafe_ignore_missing_latest_api: true,
5444 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005445 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005446 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005447 `
5448
Paul Duffin89f570a2021-06-16 01:42:33 +01005449 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005450 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5451 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005452
Paul Duffin537ea3d2021-05-14 10:38:00 +01005453 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005454 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005455 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005456 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005457 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005458 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 +01005459 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 })
5461
5462 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
5463 bp := `
5464 apex {
5465 name: "myapex",
5466 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005467 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005468 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 }
5470
5471 apex_key {
5472 name: "myapex.key",
5473 public_key: "testkey.avbpubkey",
5474 private_key: "testkey.pem",
5475 }
5476
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005477 bootclasspath_fragment {
5478 name: "my-bootclasspath-fragment",
5479 contents: ["libfoo", "libbar"],
5480 apex_available: ["myapex"],
5481 hidden_api: {
5482 split_packages: ["*"],
5483 },
5484 }
5485
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005486 prebuilt_apex {
5487 name: "myapex",
5488 arch: {
5489 arm64: {
5490 src: "myapex-arm64.apex",
5491 },
5492 arm: {
5493 src: "myapex-arm.apex",
5494 },
5495 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005496 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5497 }
5498
5499 prebuilt_bootclasspath_fragment {
5500 name: "my-bootclasspath-fragment",
5501 contents: ["libfoo", "libbar"],
5502 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005503 hidden_api: {
5504 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5505 metadata: "my-bootclasspath-fragment/metadata.csv",
5506 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005507 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5508 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5509 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005510 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 }
5512
5513 java_import {
5514 name: "libfoo",
5515 jars: ["libfoo.jar"],
5516 apex_available: ["myapex"],
5517 }
5518
5519 java_library {
5520 name: "libfoo",
5521 srcs: ["foo/bar/MyClass.java"],
5522 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005523 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005524 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005525 }
Paul Duffin37856732021-02-26 14:24:15 +00005526
5527 java_sdk_library_import {
5528 name: "libbar",
5529 public: {
5530 jars: ["libbar.jar"],
5531 },
5532 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005533 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005534 }
5535
5536 java_sdk_library {
5537 name: "libbar",
5538 srcs: ["foo/bar/MyClass.java"],
5539 unsafe_ignore_missing_latest_api: true,
5540 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005541 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005542 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005543 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005544 `
5545
Paul Duffin89f570a2021-06-16 01:42:33 +01005546 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Jiakai Zhangc6879f32023-11-06 16:31:19 +00005547 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/hiddenapi-modular/encoded/libfoo.jar")
5548 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 +00005549
Paul Duffin537ea3d2021-05-14 10:38:00 +01005550 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005551 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005552 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5553 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005554 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5555 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 +01005556 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005557 })
5558
5559 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
5560 bp := `
5561 apex {
5562 name: "myapex",
5563 enabled: false,
5564 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005565 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005566 }
5567
5568 apex_key {
5569 name: "myapex.key",
5570 public_key: "testkey.avbpubkey",
5571 private_key: "testkey.pem",
5572 }
5573
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005574 bootclasspath_fragment {
5575 name: "my-bootclasspath-fragment",
5576 enabled: false,
5577 contents: ["libfoo", "libbar"],
5578 apex_available: ["myapex"],
5579 hidden_api: {
5580 split_packages: ["*"],
5581 },
5582 }
5583
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005584 prebuilt_apex {
5585 name: "myapex",
5586 arch: {
5587 arm64: {
5588 src: "myapex-arm64.apex",
5589 },
5590 arm: {
5591 src: "myapex-arm.apex",
5592 },
5593 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005594 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5595 }
5596
5597 prebuilt_bootclasspath_fragment {
5598 name: "my-bootclasspath-fragment",
5599 contents: ["libfoo", "libbar"],
5600 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005601 hidden_api: {
5602 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5603 metadata: "my-bootclasspath-fragment/metadata.csv",
5604 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005605 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5606 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5607 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005608 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005609 }
5610
5611 java_import {
5612 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005613 jars: ["libfoo.jar"],
5614 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005615 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005616 }
5617
5618 java_library {
5619 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005620 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005621 srcs: ["foo/bar/MyClass.java"],
5622 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005624 }
Paul Duffin37856732021-02-26 14:24:15 +00005625
5626 java_sdk_library_import {
5627 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005628 public: {
5629 jars: ["libbar.jar"],
5630 },
5631 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005632 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005633 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005634 }
5635
5636 java_sdk_library {
5637 name: "libbar",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005638 enabled: false,
Paul Duffin37856732021-02-26 14:24:15 +00005639 srcs: ["foo/bar/MyClass.java"],
5640 unsafe_ignore_missing_latest_api: true,
5641 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005642 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005643 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005644 `
Cole Fausta963b942024-04-11 17:43:00 -07005645 // This test disables libbar, which causes the ComponentDepsMutator to add
5646 // deps on libbar.stubs and other sub-modules that don't exist. We can
5647 // enable AllowMissingDependencies to work around that, but enabling that
5648 // causes extra checks for missing source files to dex_bootjars, so add those
5649 // to the mock fs as well.
5650 preparer2 := android.GroupFixturePreparers(
5651 preparer,
5652 android.PrepareForTestWithAllowMissingDependencies,
5653 android.FixtureMergeMockFs(map[string][]byte{
5654 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
5655 "frameworks/base/config/boot-profile.txt": nil,
5656 }),
5657 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005658
Cole Fausta963b942024-04-11 17:43:00 -07005659 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Spandan Das3576e762024-01-03 18:57:03 +00005660 checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
5661 checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/prebuilt_myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
Paul Duffin4fd997b2021-02-03 20:06:33 +00005662
Paul Duffin537ea3d2021-05-14 10:38:00 +01005663 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005664 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005665 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005666 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005667 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005668 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 +01005669 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005670 })
Spandan Das3a392012024-01-17 18:26:27 +00005671
Spandan Dasf2c10572024-02-27 04:49:52 +00005672 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Spandan Das3a392012024-01-17 18:26:27 +00005673 bp := `
5674 // Source
5675 apex {
5676 name: "myapex",
5677 enabled: false,
5678 key: "myapex.key",
5679 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5680 }
5681
5682 apex_key {
5683 name: "myapex.key",
5684 public_key: "testkey.avbpubkey",
5685 private_key: "testkey.pem",
5686 }
5687
5688 // Prebuilt
5689 prebuilt_apex {
5690 name: "myapex.v1",
5691 source_apex_name: "myapex",
5692 arch: {
5693 arm64: {
5694 src: "myapex-arm64.apex",
5695 },
5696 arm: {
5697 src: "myapex-arm.apex",
5698 },
5699 },
5700 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5701 prefer: true,
5702 }
5703 prebuilt_apex {
5704 name: "myapex.v2",
5705 source_apex_name: "myapex",
5706 arch: {
5707 arm64: {
5708 src: "myapex-arm64.apex",
5709 },
5710 arm: {
5711 src: "myapex-arm.apex",
5712 },
5713 },
5714 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5715 prefer: true,
5716 }
5717
5718 prebuilt_bootclasspath_fragment {
5719 name: "my-bootclasspath-fragment",
5720 contents: ["libfoo", "libbar"],
5721 apex_available: ["myapex"],
5722 hidden_api: {
5723 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5724 metadata: "my-bootclasspath-fragment/metadata.csv",
5725 index: "my-bootclasspath-fragment/index.csv",
5726 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5727 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5728 },
5729 prefer: true,
5730 }
5731
5732 java_import {
5733 name: "libfoo",
5734 jars: ["libfoo.jar"],
5735 apex_available: ["myapex"],
5736 prefer: true,
5737 }
5738 java_import {
5739 name: "libbar",
5740 jars: ["libbar.jar"],
5741 apex_available: ["myapex"],
5742 prefer: true,
5743 }
5744 `
5745
Spandan Dasf2c10572024-02-27 04:49:52 +00005746 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00005747 })
5748
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005749}
5750
Roland Levillain630846d2019-06-26 12:48:34 +01005751func TestApexWithTests(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005752 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005753 apex_test {
5754 name: "myapex",
5755 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005757 tests: [
5758 "mytest",
5759 ],
5760 }
5761
5762 apex_key {
5763 name: "myapex.key",
5764 public_key: "testkey.avbpubkey",
5765 private_key: "testkey.pem",
5766 }
5767
Liz Kammer1c14a212020-05-12 15:26:55 -07005768 filegroup {
5769 name: "fg",
5770 srcs: [
5771 "baz",
5772 "bar/baz"
5773 ],
5774 }
5775
Roland Levillain630846d2019-06-26 12:48:34 +01005776 cc_test {
5777 name: "mytest",
5778 gtest: false,
5779 srcs: ["mytest.cpp"],
5780 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005781 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005782 system_shared_libs: [],
5783 static_executable: true,
5784 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005785 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005786 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005787
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005788 cc_library {
5789 name: "mylib",
5790 srcs: ["mylib.cpp"],
5791 system_shared_libs: [],
5792 stl: "none",
5793 }
5794
Liz Kammer5bd365f2020-05-27 15:15:11 -07005795 filegroup {
5796 name: "fg2",
5797 srcs: [
5798 "testdata/baz"
5799 ],
5800 }
Roland Levillain630846d2019-06-26 12:48:34 +01005801 `)
5802
Jooyung Hana0503a52023-08-23 13:12:50 +09005803 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005804 copyCmds := apexRule.Args["copy_commands"]
5805
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005806 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005807 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005809
Liz Kammer1c14a212020-05-12 15:26:55 -07005810 //Ensure that test data are copied into apex.
5811 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5812 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5813
Roland Levillainf89cd092019-07-29 16:22:59 +01005814 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005815 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005816 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005817 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005818 prefix := "TARGET_"
5819 var builder strings.Builder
5820 data.Custom(&builder, name, prefix, "", data)
5821 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005822 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005823 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005824}
5825
Jooyung Hand48f3c32019-08-23 11:18:57 +09005826func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
5827 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5828 apex {
5829 name: "myapex",
5830 key: "myapex.key",
5831 native_shared_libs: ["libfoo"],
5832 }
5833
5834 apex_key {
5835 name: "myapex.key",
5836 public_key: "testkey.avbpubkey",
5837 private_key: "testkey.pem",
5838 }
5839
5840 cc_library {
5841 name: "libfoo",
5842 stl: "none",
5843 system_shared_libs: [],
5844 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005845 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005846 }
5847 `)
5848 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5849 apex {
5850 name: "myapex",
5851 key: "myapex.key",
5852 java_libs: ["myjar"],
5853 }
5854
5855 apex_key {
5856 name: "myapex.key",
5857 public_key: "testkey.avbpubkey",
5858 private_key: "testkey.pem",
5859 }
5860
5861 java_library {
5862 name: "myjar",
5863 srcs: ["foo/bar/MyClass.java"],
5864 sdk_version: "none",
5865 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005866 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005867 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005868 }
5869 `)
5870}
5871
Bill Peckhama41a6962021-01-11 10:58:54 -08005872func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005873 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005874 apex {
5875 name: "myapex",
5876 key: "myapex.key",
5877 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005878 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005879 }
5880
5881 apex_key {
5882 name: "myapex.key",
5883 public_key: "testkey.avbpubkey",
5884 private_key: "testkey.pem",
5885 }
5886
5887 java_import {
5888 name: "myjavaimport",
5889 apex_available: ["myapex"],
5890 jars: ["my.jar"],
5891 compile_dex: true,
5892 }
5893 `)
5894
Jooyung Hana0503a52023-08-23 13:12:50 +09005895 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005896 apexRule := module.Rule("apexRule")
5897 copyCmds := apexRule.Args["copy_commands"]
5898 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5899}
5900
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005901func TestApexWithApps(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005902 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005903 apex {
5904 name: "myapex",
5905 key: "myapex.key",
5906 apps: [
5907 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005908 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005909 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005910 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005911 }
5912
5913 apex_key {
5914 name: "myapex.key",
5915 public_key: "testkey.avbpubkey",
5916 private_key: "testkey.pem",
5917 }
5918
5919 android_app {
5920 name: "AppFoo",
5921 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005922 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005923 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005924 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005925 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005926 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005927 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005928 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005929
5930 android_app {
5931 name: "AppFooPriv",
5932 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005933 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005934 system_modules: "none",
5935 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005936 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005937 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005938 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005939 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005940
5941 cc_library_shared {
5942 name: "libjni",
5943 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005944 shared_libs: ["libfoo"],
5945 stl: "none",
5946 system_shared_libs: [],
5947 apex_available: [ "myapex" ],
5948 sdk_version: "current",
5949 }
5950
5951 cc_library_shared {
5952 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005953 stl: "none",
5954 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005955 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005956 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005957 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005958 `)
5959
Jooyung Hana0503a52023-08-23 13:12:50 +09005960 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005961 apexRule := module.Rule("apexRule")
5962 copyCmds := apexRule.Args["copy_commands"]
5963
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005964 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5965 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005966 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005967
Colin Crossaede88c2020-08-11 12:17:01 -07005968 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005969 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005970 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005971 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005972 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005973 // JNI libraries including transitive deps are
5974 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005975 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005976 // ... embedded inside APK (jnilibs.zip)
5977 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5978 // ... and not directly inside the APEX
5979 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5980 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005981
5982 apexBundle := module.Module().(*apexBundle)
5983 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5984 var builder strings.Builder
5985 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5986 androidMk := builder.String()
5987 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5988 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5989 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5990 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5991 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5992 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 +01005993}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005994
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005995func TestApexWithAppImportBuildId(t *testing.T) {
5996 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5997 for _, id := range invalidBuildIds {
5998 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5999 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6000 variables.BuildId = proptools.StringPtr(id)
6001 })
6002 testApexError(t, message, `apex {
6003 name: "myapex",
6004 key: "myapex.key",
6005 apps: ["AppFooPrebuilt"],
6006 updatable: false,
6007 }
6008
6009 apex_key {
6010 name: "myapex.key",
6011 public_key: "testkey.avbpubkey",
6012 private_key: "testkey.pem",
6013 }
6014
6015 android_app_import {
6016 name: "AppFooPrebuilt",
6017 apk: "PrebuiltAppFoo.apk",
6018 presigned: true,
6019 apex_available: ["myapex"],
6020 }
6021 `, fixture)
6022 }
6023}
6024
Dario Frenicde2a032019-10-27 00:29:22 +01006025func TestApexWithAppImports(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006026 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006027 apex {
6028 name: "myapex",
6029 key: "myapex.key",
6030 apps: [
6031 "AppFooPrebuilt",
6032 "AppFooPrivPrebuilt",
6033 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006034 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006035 }
6036
6037 apex_key {
6038 name: "myapex.key",
6039 public_key: "testkey.avbpubkey",
6040 private_key: "testkey.pem",
6041 }
6042
6043 android_app_import {
6044 name: "AppFooPrebuilt",
6045 apk: "PrebuiltAppFoo.apk",
6046 presigned: true,
6047 dex_preopt: {
6048 enabled: false,
6049 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006050 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006051 }
6052
6053 android_app_import {
6054 name: "AppFooPrivPrebuilt",
6055 apk: "PrebuiltAppFooPriv.apk",
6056 privileged: true,
6057 presigned: true,
6058 dex_preopt: {
6059 enabled: false,
6060 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006061 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006062 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006063 }
6064 `)
6065
Jooyung Hana0503a52023-08-23 13:12:50 +09006066 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006067 apexRule := module.Rule("apexRule")
6068 copyCmds := apexRule.Args["copy_commands"]
6069
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006070 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6071 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006072}
6073
6074func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006075 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006076 apex {
6077 name: "myapex",
6078 key: "myapex.key",
6079 apps: [
6080 "AppFoo",
6081 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006082 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006083 }
6084
6085 apex_key {
6086 name: "myapex.key",
6087 public_key: "testkey.avbpubkey",
6088 private_key: "testkey.pem",
6089 }
6090
6091 android_app {
6092 name: "AppFoo",
6093 srcs: ["foo/bar/MyClass.java"],
6094 sdk_version: "none",
6095 system_modules: "none",
6096 apex_available: [ "myapex" ],
6097 }
6098
6099 android_app_import {
6100 name: "AppFoo",
6101 apk: "AppFooPrebuilt.apk",
6102 filename: "AppFooPrebuilt.apk",
6103 presigned: true,
6104 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006105 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006106 }
6107 `, withFiles(map[string][]byte{
6108 "AppFooPrebuilt.apk": nil,
6109 }))
6110
Jooyung Hana0503a52023-08-23 13:12:50 +09006111 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006112 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006113 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006114}
6115
Dario Freni6f3937c2019-12-20 22:58:03 +00006116func TestApexWithTestHelperApp(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006117 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006118 apex {
6119 name: "myapex",
6120 key: "myapex.key",
6121 apps: [
6122 "TesterHelpAppFoo",
6123 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006124 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006125 }
6126
6127 apex_key {
6128 name: "myapex.key",
6129 public_key: "testkey.avbpubkey",
6130 private_key: "testkey.pem",
6131 }
6132
6133 android_test_helper_app {
6134 name: "TesterHelpAppFoo",
6135 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006136 apex_available: [ "myapex" ],
Dario Freni6f3937c2019-12-20 22:58:03 +00006137 }
6138
6139 `)
6140
Jooyung Hana0503a52023-08-23 13:12:50 +09006141 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006142 apexRule := module.Rule("apexRule")
6143 copyCmds := apexRule.Args["copy_commands"]
6144
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006145 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006146}
6147
Jooyung Han18020ea2019-11-13 10:50:48 +09006148func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
6149 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006150 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006151 apex {
6152 name: "myapex",
6153 key: "myapex.key",
6154 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006155 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006156 }
6157
6158 apex_key {
6159 name: "myapex.key",
6160 public_key: "testkey.avbpubkey",
6161 private_key: "testkey.pem",
6162 }
6163
6164 apex {
6165 name: "otherapex",
6166 key: "myapex.key",
6167 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006168 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006169 }
6170
6171 cc_defaults {
6172 name: "libfoo-defaults",
6173 apex_available: ["otherapex"],
6174 }
6175
6176 cc_library {
6177 name: "libfoo",
6178 defaults: ["libfoo-defaults"],
6179 stl: "none",
6180 system_shared_libs: [],
6181 }`)
6182}
6183
Paul Duffine52e66f2020-03-30 17:54:29 +01006184func TestApexAvailable_DirectDep(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006185 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006186 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006187 apex {
6188 name: "myapex",
6189 key: "myapex.key",
6190 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006191 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006192 }
6193
6194 apex_key {
6195 name: "myapex.key",
6196 public_key: "testkey.avbpubkey",
6197 private_key: "testkey.pem",
6198 }
6199
6200 apex {
6201 name: "otherapex",
6202 key: "otherapex.key",
6203 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006204 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006205 }
6206
6207 apex_key {
6208 name: "otherapex.key",
6209 public_key: "testkey.avbpubkey",
6210 private_key: "testkey.pem",
6211 }
6212
6213 cc_library {
6214 name: "libfoo",
6215 stl: "none",
6216 system_shared_libs: [],
6217 apex_available: ["otherapex"],
6218 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006219
6220 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6221 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6222 testApex(t, `
6223 apex {
6224 name: "com.sdv.myapex",
6225 key: "myapex.key",
6226 native_shared_libs: ["libfoo"],
6227 updatable: false,
6228 product_specific: true,
6229 }
6230
6231 apex_key {
6232 name: "myapex.key",
6233 public_key: "testkey.avbpubkey",
6234 private_key: "testkey.pem",
6235 }
6236
6237 apex {
6238 name: "com.any.otherapex",
6239 key: "otherapex.key",
6240 native_shared_libs: ["libfoo"],
6241 updatable: false,
6242 }
6243
6244 apex_key {
6245 name: "otherapex.key",
6246 public_key: "testkey.avbpubkey",
6247 private_key: "testkey.pem",
6248 }
6249
6250 cc_library {
6251 name: "libfoo",
6252 stl: "none",
6253 system_shared_libs: [],
6254 apex_available: ["com.any.otherapex"],
6255 product_specific: true,
6256 }`,
6257 android.FixtureMergeMockFs(android.MockFS{
6258 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6259 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6260 }))
6261
6262 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6263 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6264 apex {
6265 name: "com.sdv.myapex",
6266 key: "myapex.key",
6267 native_shared_libs: ["libfoo"],
6268 updatable: false,
6269 }
6270
6271 apex_key {
6272 name: "myapex.key",
6273 public_key: "testkey.avbpubkey",
6274 private_key: "testkey.pem",
6275 }
6276
6277 apex {
6278 name: "com.any.otherapex",
6279 key: "otherapex.key",
6280 native_shared_libs: ["libfoo"],
6281 updatable: false,
6282 }
6283
6284 apex_key {
6285 name: "otherapex.key",
6286 public_key: "testkey.avbpubkey",
6287 private_key: "testkey.pem",
6288 }
6289
6290 cc_library {
6291 name: "libfoo",
6292 stl: "none",
6293 system_shared_libs: [],
6294 apex_available: ["com.any.otherapex"],
6295 }`,
6296 android.FixtureMergeMockFs(android.MockFS{
6297 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6298 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6299 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006300}
Jiyong Park127b40b2019-09-30 16:04:35 +09006301
Paul Duffine52e66f2020-03-30 17:54:29 +01006302func TestApexAvailable_IndirectDep(t *testing.T) {
Jooyung Han5e9013b2020-03-10 06:23:13 +09006303 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006304 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006305.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006306.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006307.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006308.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006309.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006310.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006311 apex {
6312 name: "myapex",
6313 key: "myapex.key",
6314 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006315 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006316 }
6317
6318 apex_key {
6319 name: "myapex.key",
6320 public_key: "testkey.avbpubkey",
6321 private_key: "testkey.pem",
6322 }
6323
Jiyong Park127b40b2019-09-30 16:04:35 +09006324 cc_library {
6325 name: "libfoo",
6326 stl: "none",
6327 shared_libs: ["libbar"],
6328 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006329 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006330 }
6331
6332 cc_library {
6333 name: "libbar",
6334 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006335 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006336 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006337 apex_available: ["myapex"],
6338 }
6339
6340 cc_library {
6341 name: "libbaz",
6342 stl: "none",
6343 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006344 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006345
6346 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6347 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6348 testApex(t, `
6349 apex {
6350 name: "com.sdv.myapex",
6351 key: "myapex.key",
6352 native_shared_libs: ["libfoo"],
6353 updatable: false,
6354 product_specific: true,
6355 }
6356
6357 apex_key {
6358 name: "myapex.key",
6359 public_key: "testkey.avbpubkey",
6360 private_key: "testkey.pem",
6361 }
6362
6363 cc_library {
6364 name: "libfoo",
6365 stl: "none",
6366 shared_libs: ["libbar"],
6367 system_shared_libs: [],
6368 apex_available: ["com.sdv.myapex"],
6369 product_specific: true,
6370 }
6371
6372 cc_library {
6373 name: "libbar",
6374 stl: "none",
6375 shared_libs: ["libbaz"],
6376 system_shared_libs: [],
6377 apex_available: ["com.sdv.myapex"],
6378 product_specific: true,
6379 }
6380
6381 cc_library {
6382 name: "libbaz",
6383 stl: "none",
6384 system_shared_libs: [],
6385 product_specific: true,
6386 }`,
6387 android.FixtureMergeMockFs(android.MockFS{
6388 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6389 }))
6390
6391 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6392 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6393 apex {
6394 name: "com.sdv.myapex",
6395 key: "myapex.key",
6396 native_shared_libs: ["libfoo"],
6397 updatable: false,
6398 }
6399
6400 apex_key {
6401 name: "myapex.key",
6402 public_key: "testkey.avbpubkey",
6403 private_key: "testkey.pem",
6404 }
6405
6406 cc_library {
6407 name: "libfoo",
6408 stl: "none",
6409 shared_libs: ["libbar"],
6410 system_shared_libs: [],
6411 apex_available: ["com.sdv.myapex"],
6412 }
6413
6414 cc_library {
6415 name: "libbar",
6416 stl: "none",
6417 shared_libs: ["libbaz"],
6418 system_shared_libs: [],
6419 apex_available: ["com.sdv.myapex"],
6420 }
6421
6422 cc_library {
6423 name: "libbaz",
6424 stl: "none",
6425 system_shared_libs: [],
6426 }`,
6427 android.FixtureMergeMockFs(android.MockFS{
6428 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6429 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006430}
Jiyong Park127b40b2019-09-30 16:04:35 +09006431
Liz Kammer5f108fa2023-05-11 14:33:17 -04006432func TestApexAvailable_IndirectStaticDep(t *testing.T) {
6433 testApex(t, `
6434 apex {
6435 name: "myapex",
6436 key: "myapex.key",
6437 native_shared_libs: ["libfoo"],
6438 updatable: false,
6439 }
6440
6441 apex_key {
6442 name: "myapex.key",
6443 public_key: "testkey.avbpubkey",
6444 private_key: "testkey.pem",
6445 }
6446
6447 cc_library {
6448 name: "libfoo",
6449 stl: "none",
6450 static_libs: ["libbar"],
6451 system_shared_libs: [],
6452 apex_available: ["myapex"],
6453 }
6454
6455 cc_library {
6456 name: "libbar",
6457 stl: "none",
6458 shared_libs: ["libbaz"],
6459 system_shared_libs: [],
6460 apex_available: ["myapex"],
6461 }
6462
6463 cc_library {
6464 name: "libbaz",
6465 stl: "none",
6466 system_shared_libs: [],
6467 }`)
6468
6469 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6470 apex {
6471 name: "myapex",
6472 key: "myapex.key",
6473 native_shared_libs: ["libfoo"],
6474 updatable: false,
6475 }
6476
6477 apex_key {
6478 name: "myapex.key",
6479 public_key: "testkey.avbpubkey",
6480 private_key: "testkey.pem",
6481 }
6482
6483 cc_library {
6484 name: "libfoo",
6485 stl: "none",
6486 static_libs: ["libbar"],
6487 system_shared_libs: [],
6488 apex_available: ["myapex"],
6489 }
6490
6491 cc_library {
6492 name: "libbar",
6493 stl: "none",
6494 system_shared_libs: [],
6495 }`)
6496}
6497
Paul Duffine52e66f2020-03-30 17:54:29 +01006498func TestApexAvailable_InvalidApexName(t *testing.T) {
Jiyong Park127b40b2019-09-30 16:04:35 +09006499 testApexError(t, "\"otherapex\" is not a valid module name", `
6500 apex {
6501 name: "myapex",
6502 key: "myapex.key",
6503 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006504 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006505 }
6506
6507 apex_key {
6508 name: "myapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512
6513 cc_library {
6514 name: "libfoo",
6515 stl: "none",
6516 system_shared_libs: [],
6517 apex_available: ["otherapex"],
6518 }`)
6519
Paul Duffine52e66f2020-03-30 17:54:29 +01006520 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006521 apex {
6522 name: "myapex",
6523 key: "myapex.key",
6524 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006525 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006526 }
6527
6528 apex_key {
6529 name: "myapex.key",
6530 public_key: "testkey.avbpubkey",
6531 private_key: "testkey.pem",
6532 }
6533
6534 cc_library {
6535 name: "libfoo",
6536 stl: "none",
6537 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006538 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006539 apex_available: ["myapex"],
6540 }
6541
6542 cc_library {
6543 name: "libbar",
6544 stl: "none",
6545 system_shared_libs: [],
6546 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006547 }
6548
6549 cc_library {
6550 name: "libbaz",
6551 stl: "none",
6552 system_shared_libs: [],
6553 stubs: {
6554 versions: ["10", "20", "30"],
6555 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006557}
Jiyong Park127b40b2019-09-30 16:04:35 +09006558
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006559func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
6560 t.Run("negative variant_version produces error", func(t *testing.T) {
6561 testApexError(t, "expected an integer between 0-9; got -1", `
6562 apex {
6563 name: "myapex",
6564 key: "myapex.key",
6565 apex_available_name: "com.android.foo",
6566 variant_version: "-1",
6567 updatable: false,
6568 }
6569 apex_key {
6570 name: "myapex.key",
6571 public_key: "testkey.avbpubkey",
6572 private_key: "testkey.pem",
6573 }
6574 `)
6575 })
6576
6577 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
6578 testApexError(t, "expected an integer between 0-9; got 10", `
6579 apex {
6580 name: "myapex",
6581 key: "myapex.key",
6582 apex_available_name: "com.android.foo",
6583 variant_version: "10",
6584 updatable: false,
6585 }
6586 apex_key {
6587 name: "myapex.key",
6588 public_key: "testkey.avbpubkey",
6589 private_key: "testkey.pem",
6590 }
6591 `)
6592 })
6593}
6594
6595func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
6596 context := android.GroupFixturePreparers(
6597 android.PrepareForIntegrationTestWithAndroid,
6598 PrepareForTestWithApexBuildComponents,
6599 android.FixtureMergeMockFs(android.MockFS{
6600 "system/sepolicy/apex/foo-file_contexts": nil,
6601 "system/sepolicy/apex/bar-file_contexts": nil,
6602 }),
6603 )
6604 result := context.RunTestWithBp(t, `
6605 apex {
6606 name: "foo",
6607 key: "myapex.key",
6608 apex_available_name: "com.android.foo",
6609 variant_version: "0",
6610 updatable: false,
6611 }
6612 apex {
6613 name: "bar",
6614 key: "myapex.key",
6615 apex_available_name: "com.android.foo",
6616 variant_version: "3",
6617 updatable: false,
6618 }
6619 apex_key {
6620 name: "myapex.key",
6621 public_key: "testkey.avbpubkey",
6622 private_key: "testkey.pem",
6623 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006624 override_apex {
6625 name: "myoverrideapex",
6626 base: "bar",
6627 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006628 `)
6629
Jooyung Hana0503a52023-08-23 13:12:50 +09006630 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006631 fooExpectedDefaultVersion := android.DefaultUpdatableModuleVersion
6632 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6633 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6634 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6635 }
6636
Jooyung Hana0503a52023-08-23 13:12:50 +09006637 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006638 defaultVersionInt, _ := strconv.Atoi(android.DefaultUpdatableModuleVersion)
6639 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6640 barActualDefaultVersion := barManifestRule.Args["default_version"]
6641 if barActualDefaultVersion != barExpectedDefaultVersion {
6642 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6643 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006644
Spandan Das50801e22024-05-13 18:29:45 +00006645 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006646 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6647 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6648 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6649 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006650}
6651
Sam Delmericoca816532023-06-02 14:09:50 -04006652func TestApexAvailable_ApexAvailableName(t *testing.T) {
6653 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
6654 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6655 apex {
6656 name: "myapex_sminus",
6657 key: "myapex.key",
6658 apps: ["AppFoo"],
6659 apex_available_name: "myapex",
6660 updatable: false,
6661 }
6662 apex {
6663 name: "myapex",
6664 key: "myapex.key",
6665 apps: ["AppFoo"],
6666 updatable: false,
6667 }
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673 android_app {
6674 name: "AppFoo",
6675 srcs: ["foo/bar/MyClass.java"],
6676 sdk_version: "none",
6677 system_modules: "none",
6678 apex_available: [ "myapex_sminus" ],
6679 }`,
6680 android.FixtureMergeMockFs(android.MockFS{
6681 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6682 }),
6683 )
6684 })
6685
6686 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
6687 testApex(t, `
6688 apex {
6689 name: "myapex_sminus",
6690 key: "myapex.key",
6691 apps: ["AppFoo"],
6692 apex_available_name: "myapex",
6693 updatable: false,
6694 }
6695 apex {
6696 name: "myapex",
6697 key: "myapex.key",
6698 apps: ["AppFoo"],
6699 updatable: false,
6700 }
6701 apex_key {
6702 name: "myapex.key",
6703 public_key: "testkey.avbpubkey",
6704 private_key: "testkey.pem",
6705 }
6706 android_app {
6707 name: "AppFoo",
6708 srcs: ["foo/bar/MyClass.java"],
6709 sdk_version: "none",
6710 system_modules: "none",
6711 apex_available: [ "myapex" ],
6712 }`,
6713 android.FixtureMergeMockFs(android.MockFS{
6714 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6715 }),
6716 )
6717 })
6718
6719 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
6720 testApex(t, `
6721 override_apex {
6722 name: "myoverrideapex_sminus",
6723 base: "myapex_sminus",
6724 key: "myapex.key",
6725 apps: ["AppFooOverride"],
6726 }
6727 override_apex {
6728 name: "myoverrideapex",
6729 base: "myapex",
6730 key: "myapex.key",
6731 apps: ["AppFooOverride"],
6732 }
6733 apex {
6734 name: "myapex_sminus",
6735 key: "myapex.key",
6736 apps: ["AppFoo"],
6737 apex_available_name: "myapex",
6738 updatable: false,
6739 }
6740 apex {
6741 name: "myapex",
6742 key: "myapex.key",
6743 apps: ["AppFoo"],
6744 updatable: false,
6745 }
6746 apex_key {
6747 name: "myapex.key",
6748 public_key: "testkey.avbpubkey",
6749 private_key: "testkey.pem",
6750 }
6751 android_app {
6752 name: "AppFooOverride",
6753 srcs: ["foo/bar/MyClass.java"],
6754 sdk_version: "none",
6755 system_modules: "none",
6756 apex_available: [ "myapex" ],
6757 }
6758 android_app {
6759 name: "AppFoo",
6760 srcs: ["foo/bar/MyClass.java"],
6761 sdk_version: "none",
6762 system_modules: "none",
6763 apex_available: [ "myapex" ],
6764 }`,
6765 android.FixtureMergeMockFs(android.MockFS{
6766 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6767 }),
6768 )
6769 })
6770}
6771
6772func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
6773 context := android.GroupFixturePreparers(
6774 android.PrepareForIntegrationTestWithAndroid,
6775 PrepareForTestWithApexBuildComponents,
6776 java.PrepareForTestWithDexpreopt,
6777 android.FixtureMergeMockFs(android.MockFS{
6778 "system/sepolicy/apex/myapex-file_contexts": nil,
6779 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6780 }),
6781 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6782 variables.BuildId = proptools.StringPtr("buildid")
6783 }),
6784 )
6785 context.RunTestWithBp(t, `
6786 override_apex {
6787 name: "myoverrideapex_sminus",
6788 base: "myapex_sminus",
6789 }
6790 override_apex {
6791 name: "myoverrideapex",
6792 base: "myapex",
6793 }
6794 apex {
6795 name: "myapex",
6796 key: "myapex.key",
6797 apps: ["AppFoo"],
6798 updatable: false,
6799 }
6800 apex {
6801 name: "myapex_sminus",
6802 apex_available_name: "myapex",
6803 key: "myapex.key",
6804 apps: ["AppFoo_sminus"],
6805 updatable: false,
6806 }
6807 apex_key {
6808 name: "myapex.key",
6809 public_key: "testkey.avbpubkey",
6810 private_key: "testkey.pem",
6811 }
6812 android_app {
6813 name: "AppFoo",
6814 srcs: ["foo/bar/MyClass.java"],
6815 sdk_version: "none",
6816 system_modules: "none",
6817 apex_available: [ "myapex" ],
6818 }
6819 android_app {
6820 name: "AppFoo_sminus",
6821 srcs: ["foo/bar/MyClass.java"],
6822 sdk_version: "none",
6823 min_sdk_version: "29",
6824 system_modules: "none",
6825 apex_available: [ "myapex" ],
6826 }`)
6827}
6828
Jiyong Park89e850a2020-04-07 16:37:39 +09006829func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006830 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006831 apex {
6832 name: "myapex",
6833 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006834 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006835 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006836 }
6837
6838 apex_key {
6839 name: "myapex.key",
6840 public_key: "testkey.avbpubkey",
6841 private_key: "testkey.pem",
6842 }
6843
6844 cc_library {
6845 name: "libfoo",
6846 stl: "none",
6847 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006848 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006849 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006850 }
6851
6852 cc_library {
6853 name: "libfoo2",
6854 stl: "none",
6855 system_shared_libs: [],
6856 shared_libs: ["libbaz"],
6857 apex_available: ["//apex_available:platform"],
6858 }
6859
6860 cc_library {
6861 name: "libbar",
6862 stl: "none",
6863 system_shared_libs: [],
6864 apex_available: ["myapex"],
6865 }
6866
6867 cc_library {
6868 name: "libbaz",
6869 stl: "none",
6870 system_shared_libs: [],
6871 apex_available: ["myapex"],
6872 stubs: {
6873 versions: ["1"],
6874 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006875 }`)
6876
Jiyong Park89e850a2020-04-07 16:37:39 +09006877 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6878 // because it depends on libbar which isn't available to platform
6879 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6880 if libfoo.NotAvailableForPlatform() != true {
6881 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6882 }
6883
6884 // libfoo2 however can be available to platform because it depends on libbaz which provides
6885 // stubs
6886 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6887 if libfoo2.NotAvailableForPlatform() == true {
6888 t.Errorf("%q should be available to platform", libfoo2.String())
6889 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006890}
Jiyong Parka90ca002019-10-07 15:47:24 +09006891
Paul Duffine52e66f2020-03-30 17:54:29 +01006892func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006893 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006894 apex {
6895 name: "myapex",
6896 key: "myapex.key",
6897 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006898 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006899 }
6900
6901 apex_key {
6902 name: "myapex.key",
6903 public_key: "testkey.avbpubkey",
6904 private_key: "testkey.pem",
6905 }
6906
6907 cc_library {
6908 name: "libfoo",
6909 stl: "none",
6910 system_shared_libs: [],
6911 apex_available: ["myapex"],
6912 static: {
6913 apex_available: ["//apex_available:platform"],
6914 },
6915 }`)
6916
Jiyong Park89e850a2020-04-07 16:37:39 +09006917 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6918 if libfooShared.NotAvailableForPlatform() != true {
6919 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6920 }
6921 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6922 if libfooStatic.NotAvailableForPlatform() != false {
6923 t.Errorf("%q should be available to platform", libfooStatic.String())
6924 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006925}
6926
Jooyung Han9a419e22024-08-16 17:14:21 +09006927func TestApexAvailable_PrefixMatch(t *testing.T) {
6928
6929 for _, tc := range []struct {
6930 name string
6931 apexAvailable string
6932 expectedError string
6933 }{
6934 {
6935 name: "prefix matches correctly",
6936 apexAvailable: "com.foo.*",
6937 },
6938 {
6939 name: "prefix doesn't match",
6940 apexAvailable: "com.bar.*",
6941 expectedError: `Consider .* "com.foo\.\*"`,
6942 },
6943 {
6944 name: "short prefix",
6945 apexAvailable: "com.*",
6946 expectedError: "requires two or more components",
6947 },
6948 {
6949 name: "wildcard not in the end",
6950 apexAvailable: "com.*.foo",
6951 expectedError: "should end with .*",
6952 },
6953 {
6954 name: "wildcard in the middle",
6955 apexAvailable: "com.foo*.*",
6956 expectedError: "not allowed in the middle",
6957 },
6958 {
6959 name: "hint with prefix pattern",
6960 apexAvailable: "//apex_available:platform",
6961 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6962 },
6963 } {
6964 t.Run(tc.name, func(t *testing.T) {
6965 errorHandler := android.FixtureExpectsNoErrors
6966 if tc.expectedError != "" {
6967 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6968 }
6969 context := android.GroupFixturePreparers(
6970 prepareForApexTest,
6971 android.FixtureMergeMockFs(android.MockFS{
6972 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6973 }),
6974 ).ExtendWithErrorHandler(errorHandler)
6975
6976 context.RunTestWithBp(t, `
6977 apex {
6978 name: "com.foo.bar",
6979 key: "myapex.key",
6980 native_shared_libs: ["libfoo"],
6981 updatable: false,
6982 }
6983
6984 apex_key {
6985 name: "myapex.key",
6986 public_key: "testkey.avbpubkey",
6987 private_key: "testkey.pem",
6988 }
6989
6990 cc_library {
6991 name: "libfoo",
6992 stl: "none",
6993 system_shared_libs: [],
6994 apex_available: ["`+tc.apexAvailable+`"],
6995 }`)
6996 })
6997 }
6998 testApexError(t, `Consider adding "com.foo" to`, `
6999 apex {
7000 name: "com.foo", // too short for a partner apex
7001 key: "myapex.key",
7002 native_shared_libs: ["libfoo"],
7003 updatable: false,
7004 }
7005
7006 apex_key {
7007 name: "myapex.key",
7008 public_key: "testkey.avbpubkey",
7009 private_key: "testkey.pem",
7010 }
7011
7012 cc_library {
7013 name: "libfoo",
7014 stl: "none",
7015 system_shared_libs: [],
7016 }
7017 `)
7018}
7019
Jiyong Park5d790c32019-11-15 18:40:32 +09007020func TestOverrideApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007021 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007022 apex {
7023 name: "myapex",
7024 key: "myapex.key",
7025 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007026 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007027 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007028 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007029 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007030 }
7031
7032 override_apex {
7033 name: "override_myapex",
7034 base: "myapex",
7035 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007036 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007037 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007038 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007039 compile_multilib: "first",
7040 multilib: {
7041 lib32: {
7042 native_shared_libs: ["mylib32"],
7043 },
7044 lib64: {
7045 native_shared_libs: ["mylib64"],
7046 },
7047 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007048 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007049 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007050 key: "mynewapex.key",
7051 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007052 }
7053
7054 apex_key {
7055 name: "myapex.key",
7056 public_key: "testkey.avbpubkey",
7057 private_key: "testkey.pem",
7058 }
7059
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007060 apex_key {
7061 name: "mynewapex.key",
7062 public_key: "testkey2.avbpubkey",
7063 private_key: "testkey2.pem",
7064 }
7065
7066 android_app_certificate {
7067 name: "myapex.certificate",
7068 certificate: "testkey",
7069 }
7070
Jiyong Park5d790c32019-11-15 18:40:32 +09007071 android_app {
7072 name: "app",
7073 srcs: ["foo/bar/MyClass.java"],
7074 package_name: "foo",
7075 sdk_version: "none",
7076 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007077 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007078 }
7079
7080 override_android_app {
7081 name: "override_app",
7082 base: "app",
7083 package_name: "bar",
7084 }
markchien7c803b82021-08-26 22:10:06 +08007085
7086 bpf {
7087 name: "bpf",
7088 srcs: ["bpf.c"],
7089 }
7090
7091 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007092 name: "overrideBpf",
7093 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007094 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007095
7096 prebuilt_etc {
7097 name: "myetc",
7098 src: "myprebuilt",
7099 }
7100
7101 prebuilt_etc {
7102 name: "override_myetc",
7103 src: "override_myprebuilt",
7104 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007105
7106 cc_library {
7107 name: "mylib32",
7108 apex_available: [ "myapex" ],
7109 }
7110
7111 cc_library {
7112 name: "mylib64",
7113 apex_available: [ "myapex" ],
7114 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007115 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007116
Jooyung Hana0503a52023-08-23 13:12:50 +09007117 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007118 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007119 if originalVariant.GetOverriddenBy() != "" {
7120 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7121 }
7122 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7123 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7124 }
7125
Spandan Das50801e22024-05-13 18:29:45 +00007126 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007127 apexRule := module.Rule("apexRule")
7128 copyCmds := apexRule.Args["copy_commands"]
7129
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007130 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7131 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007132
markchien7c803b82021-08-26 22:10:06 +08007133 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007134 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007135
Daniel Norman5a3ce132021-08-26 15:44:43 -07007136 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7137 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7138
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007139 apexBundle := module.Module().(*apexBundle)
7140 name := apexBundle.Name()
7141 if name != "override_myapex" {
7142 t.Errorf("name should be \"override_myapex\", but was %q", name)
7143 }
7144
Baligh Uddin004d7172020-02-19 21:29:28 -08007145 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7146 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7147 }
7148
Jiyong Park20bacab2020-03-03 11:45:41 +09007149 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007150 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007151 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7152
7153 signApkRule := module.Rule("signapk")
7154 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007155
Colin Crossaa255532020-07-03 13:18:24 -07007156 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007157 var builder strings.Builder
7158 data.Custom(&builder, name, "TARGET_", "", data)
7159 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007160 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7161 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007162 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007163 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007164 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007165 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007166 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007167 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007168}
7169
Albert Martineefabcf2022-03-21 20:11:16 +00007170func TestMinSdkVersionOverride(t *testing.T) {
7171 // Override from 29 to 31
7172 minSdkOverride31 := "31"
7173 ctx := testApex(t, `
7174 apex {
7175 name: "myapex",
7176 key: "myapex.key",
7177 native_shared_libs: ["mylib"],
7178 updatable: true,
7179 min_sdk_version: "29"
7180 }
7181
7182 override_apex {
7183 name: "override_myapex",
7184 base: "myapex",
7185 logging_parent: "com.foo.bar",
7186 package_name: "test.overridden.package"
7187 }
7188
7189 apex_key {
7190 name: "myapex.key",
7191 public_key: "testkey.avbpubkey",
7192 private_key: "testkey.pem",
7193 }
7194
7195 cc_library {
7196 name: "mylib",
7197 srcs: ["mylib.cpp"],
7198 runtime_libs: ["libbar"],
7199 system_shared_libs: [],
7200 stl: "none",
7201 apex_available: [ "myapex" ],
7202 min_sdk_version: "apex_inherit"
7203 }
7204
7205 cc_library {
7206 name: "libbar",
7207 srcs: ["mylib.cpp"],
7208 system_shared_libs: [],
7209 stl: "none",
7210 apex_available: [ "myapex" ],
7211 min_sdk_version: "apex_inherit"
7212 }
7213
7214 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7215
Jooyung Hana0503a52023-08-23 13:12:50 +09007216 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007217 copyCmds := apexRule.Args["copy_commands"]
7218
7219 // Ensure that direct non-stubs dep is always included
7220 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7221
7222 // Ensure that runtime_libs dep in included
7223 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7224
7225 // Ensure libraries target overridden min_sdk_version value
7226 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7227}
7228
7229func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
7230 // Attempt to override from 31 to 29, should be a NOOP
7231 minSdkOverride29 := "29"
7232 ctx := testApex(t, `
7233 apex {
7234 name: "myapex",
7235 key: "myapex.key",
7236 native_shared_libs: ["mylib"],
7237 updatable: true,
7238 min_sdk_version: "31"
7239 }
7240
7241 override_apex {
7242 name: "override_myapex",
7243 base: "myapex",
7244 logging_parent: "com.foo.bar",
7245 package_name: "test.overridden.package"
7246 }
7247
7248 apex_key {
7249 name: "myapex.key",
7250 public_key: "testkey.avbpubkey",
7251 private_key: "testkey.pem",
7252 }
7253
7254 cc_library {
7255 name: "mylib",
7256 srcs: ["mylib.cpp"],
7257 runtime_libs: ["libbar"],
7258 system_shared_libs: [],
7259 stl: "none",
7260 apex_available: [ "myapex" ],
7261 min_sdk_version: "apex_inherit"
7262 }
7263
7264 cc_library {
7265 name: "libbar",
7266 srcs: ["mylib.cpp"],
7267 system_shared_libs: [],
7268 stl: "none",
7269 apex_available: [ "myapex" ],
7270 min_sdk_version: "apex_inherit"
7271 }
7272
7273 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7274
Jooyung Hana0503a52023-08-23 13:12:50 +09007275 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007276 copyCmds := apexRule.Args["copy_commands"]
7277
7278 // Ensure that direct non-stubs dep is always included
7279 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7280
7281 // Ensure that runtime_libs dep in included
7282 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7283
7284 // Ensure libraries target the original min_sdk_version value rather than the overridden
7285 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7286}
7287
Jooyung Han214bf372019-11-12 13:03:50 +09007288func TestLegacyAndroid10Support(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007289 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007290 apex {
7291 name: "myapex",
7292 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007293 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007294 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007295 }
7296
7297 apex_key {
7298 name: "myapex.key",
7299 public_key: "testkey.avbpubkey",
7300 private_key: "testkey.pem",
7301 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007302
7303 cc_library {
7304 name: "mylib",
7305 srcs: ["mylib.cpp"],
7306 stl: "libc++",
7307 system_shared_libs: [],
7308 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007309 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007310 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007311 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007312
Jooyung Hana0503a52023-08-23 13:12:50 +09007313 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007314 args := module.Rule("apexRule").Args
7315 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007316 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007317
7318 // The copies of the libraries in the apex should have one more dependency than
7319 // the ones outside the apex, namely the unwinder. Ideally we should check
7320 // the dependency names directly here but for some reason the names are blank in
7321 // this test.
7322 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007323 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007324 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7325 if len(apexImplicits) != len(nonApexImplicits)+1 {
7326 t.Errorf("%q missing unwinder dep", lib)
7327 }
7328 }
Jooyung Han214bf372019-11-12 13:03:50 +09007329}
7330
Paul Duffine05480a2021-03-08 15:07:14 +00007331var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007332 "api/current.txt": nil,
7333 "api/removed.txt": nil,
7334 "api/system-current.txt": nil,
7335 "api/system-removed.txt": nil,
7336 "api/test-current.txt": nil,
7337 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007338
Anton Hanssondff2c782020-12-21 17:10:01 +00007339 "100/public/api/foo.txt": nil,
7340 "100/public/api/foo-removed.txt": nil,
7341 "100/system/api/foo.txt": nil,
7342 "100/system/api/foo-removed.txt": nil,
7343
Paul Duffineedc5d52020-06-12 17:46:39 +01007344 // For java_sdk_library_import
7345 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007346}
7347
Jooyung Han58f26ab2019-12-18 15:34:32 +09007348func TestJavaSDKLibrary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007349 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007350 apex {
7351 name: "myapex",
7352 key: "myapex.key",
7353 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007354 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007355 }
7356
7357 apex_key {
7358 name: "myapex.key",
7359 public_key: "testkey.avbpubkey",
7360 private_key: "testkey.pem",
7361 }
7362
7363 java_sdk_library {
7364 name: "foo",
7365 srcs: ["a.java"],
7366 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007367 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007368 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007369
7370 prebuilt_apis {
7371 name: "sdk",
7372 api_dirs: ["100"],
7373 }
Paul Duffin9b879592020-05-26 13:21:35 +01007374 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007375
7376 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007377 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007378 "javalib/foo.jar",
7379 "etc/permissions/foo.xml",
7380 })
7381 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007382 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7383 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7384 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007385}
7386
Spandan Das3ee19692024-06-19 04:47:40 +00007387func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
7388 ctx := testApex(t, `
7389 override_apex {
7390 name: "mycompanyapex",
7391 base: "myapex",
7392 }
7393 apex {
7394 name: "myapex",
7395 key: "myapex.key",
7396 java_libs: ["foo"],
7397 updatable: false,
7398 }
7399
7400 apex_key {
7401 name: "myapex.key",
7402 public_key: "testkey.avbpubkey",
7403 private_key: "testkey.pem",
7404 }
7405
7406 java_sdk_library {
7407 name: "foo",
7408 srcs: ["a.java"],
7409 api_packages: ["foo"],
7410 apex_available: [ "myapex" ],
7411 }
7412
7413 prebuilt_apis {
7414 name: "sdk",
7415 api_dirs: ["100"],
7416 }
7417 `, withFiles(filesForSdkLibrary))
7418
7419 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7420 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7421 // (com.android.foo), the filepath should not contain override apex name.
7422 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7423 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7424 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7425}
7426
Paul Duffin9b879592020-05-26 13:21:35 +01007427func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007428 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007429 apex {
7430 name: "myapex",
7431 key: "myapex.key",
7432 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007433 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007434 }
7435
7436 apex_key {
7437 name: "myapex.key",
7438 public_key: "testkey.avbpubkey",
7439 private_key: "testkey.pem",
7440 }
7441
7442 java_sdk_library {
7443 name: "foo",
7444 srcs: ["a.java"],
7445 api_packages: ["foo"],
7446 apex_available: ["myapex"],
7447 sdk_version: "none",
7448 system_modules: "none",
7449 }
7450
7451 java_library {
7452 name: "bar",
7453 srcs: ["a.java"],
7454 libs: ["foo"],
7455 apex_available: ["myapex"],
7456 sdk_version: "none",
7457 system_modules: "none",
7458 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007459
7460 prebuilt_apis {
7461 name: "sdk",
7462 api_dirs: ["100"],
7463 }
Paul Duffin9b879592020-05-26 13:21:35 +01007464 `, withFiles(filesForSdkLibrary))
7465
7466 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007467 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007468 "javalib/bar.jar",
7469 "javalib/foo.jar",
7470 "etc/permissions/foo.xml",
7471 })
7472
7473 // The bar library should depend on the implementation jar.
7474 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007475 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007476 t.Errorf("expected %q, found %#q", expected, actual)
7477 }
7478}
7479
7480func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007481 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007482 apex {
7483 name: "myapex",
7484 key: "myapex.key",
7485 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007486 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007487 }
7488
7489 apex_key {
7490 name: "myapex.key",
7491 public_key: "testkey.avbpubkey",
7492 private_key: "testkey.pem",
7493 }
7494
7495 java_sdk_library {
7496 name: "foo",
7497 srcs: ["a.java"],
7498 api_packages: ["foo"],
7499 apex_available: ["myapex"],
7500 sdk_version: "none",
7501 system_modules: "none",
7502 }
7503
7504 java_library {
7505 name: "bar",
7506 srcs: ["a.java"],
7507 libs: ["foo"],
7508 sdk_version: "none",
7509 system_modules: "none",
7510 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007511
7512 prebuilt_apis {
7513 name: "sdk",
7514 api_dirs: ["100"],
7515 }
Paul Duffin9b879592020-05-26 13:21:35 +01007516 `, withFiles(filesForSdkLibrary))
7517
7518 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007519 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007520 "javalib/foo.jar",
7521 "etc/permissions/foo.xml",
7522 })
7523
7524 // The bar library should depend on the stubs jar.
7525 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007526 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007527 t.Errorf("expected %q, found %#q", expected, actual)
7528 }
7529}
7530
Paul Duffineedc5d52020-06-12 17:46:39 +01007531func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007532 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007533 prebuilt_apis {
7534 name: "sdk",
7535 api_dirs: ["100"],
7536 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007537 withFiles(map[string][]byte{
7538 "apex/a.java": nil,
7539 "apex/apex_manifest.json": nil,
7540 "apex/Android.bp": []byte(`
7541 package {
7542 default_visibility: ["//visibility:private"],
7543 }
7544
7545 apex {
7546 name: "myapex",
7547 key: "myapex.key",
7548 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007549 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007550 }
7551
7552 apex_key {
7553 name: "myapex.key",
7554 public_key: "testkey.avbpubkey",
7555 private_key: "testkey.pem",
7556 }
7557
7558 java_library {
7559 name: "bar",
7560 srcs: ["a.java"],
7561 libs: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 }
7566`),
7567 "source/a.java": nil,
7568 "source/api/current.txt": nil,
7569 "source/api/removed.txt": nil,
7570 "source/Android.bp": []byte(`
7571 package {
7572 default_visibility: ["//visibility:private"],
7573 }
7574
7575 java_sdk_library {
7576 name: "foo",
7577 visibility: ["//apex"],
7578 srcs: ["a.java"],
7579 api_packages: ["foo"],
7580 apex_available: ["myapex"],
7581 sdk_version: "none",
7582 system_modules: "none",
7583 public: {
7584 enabled: true,
7585 },
7586 }
7587`),
7588 "prebuilt/a.jar": nil,
7589 "prebuilt/Android.bp": []byte(`
7590 package {
7591 default_visibility: ["//visibility:private"],
7592 }
7593
7594 java_sdk_library_import {
7595 name: "foo",
7596 visibility: ["//apex", "//source"],
7597 apex_available: ["myapex"],
7598 prefer: true,
7599 public: {
7600 jars: ["a.jar"],
7601 },
7602 }
7603`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007604 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007605 )
7606
7607 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007608 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007609 "javalib/bar.jar",
7610 "javalib/foo.jar",
7611 "etc/permissions/foo.xml",
7612 })
7613
7614 // The bar library should depend on the implementation jar.
7615 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007616 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007617 t.Errorf("expected %q, found %#q", expected, actual)
7618 }
7619}
7620
7621func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
7622 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7623 apex {
7624 name: "myapex",
7625 key: "myapex.key",
7626 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007627 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007628 }
7629
7630 apex_key {
7631 name: "myapex.key",
7632 public_key: "testkey.avbpubkey",
7633 private_key: "testkey.pem",
7634 }
7635
7636 java_sdk_library_import {
7637 name: "foo",
7638 apex_available: ["myapex"],
7639 prefer: true,
7640 public: {
7641 jars: ["a.jar"],
7642 },
7643 }
7644
7645 `, withFiles(filesForSdkLibrary))
7646}
7647
atrost6e126252020-01-27 17:01:16 +00007648func TestCompatConfig(t *testing.T) {
Paul Duffin284165a2021-03-29 01:50:31 +01007649 result := android.GroupFixturePreparers(
7650 prepareForApexTest,
7651 java.PrepareForTestWithPlatformCompatConfig,
7652 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007653 apex {
7654 name: "myapex",
7655 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007656 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007657 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007658 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007659 }
7660
7661 apex_key {
7662 name: "myapex.key",
7663 public_key: "testkey.avbpubkey",
7664 private_key: "testkey.pem",
7665 }
7666
7667 platform_compat_config {
7668 name: "myjar-platform-compat-config",
7669 src: ":myjar",
7670 }
7671
7672 java_library {
7673 name: "myjar",
7674 srcs: ["foo/bar/MyClass.java"],
7675 sdk_version: "none",
7676 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007677 apex_available: [ "myapex" ],
7678 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007679
7680 // Make sure that a preferred prebuilt does not affect the apex contents.
7681 prebuilt_platform_compat_config {
7682 name: "myjar-platform-compat-config",
7683 metadata: "compat-config/metadata.xml",
7684 prefer: true,
7685 }
atrost6e126252020-01-27 17:01:16 +00007686 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007687 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007688 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007689 "etc/compatconfig/myjar-platform-compat-config.xml",
7690 "javalib/myjar.jar",
7691 })
7692}
7693
Jooyung Han862c0d62022-12-21 10:15:37 +09007694func TestNoDupeApexFiles(t *testing.T) {
7695 android.GroupFixturePreparers(
7696 android.PrepareForTestWithAndroidBuildComponents,
7697 PrepareForTestWithApexBuildComponents,
7698 prepareForTestWithMyapex,
7699 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7700 ).
7701 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7702 RunTestWithBp(t, `
7703 apex {
7704 name: "myapex",
7705 key: "myapex.key",
7706 prebuilts: ["foo", "bar"],
7707 updatable: false,
7708 }
7709
7710 apex_key {
7711 name: "myapex.key",
7712 public_key: "testkey.avbpubkey",
7713 private_key: "testkey.pem",
7714 }
7715
7716 prebuilt_etc {
7717 name: "foo",
7718 src: "myprebuilt",
7719 filename_from_src: true,
7720 }
7721
7722 prebuilt_etc {
7723 name: "bar",
7724 src: "myprebuilt",
7725 filename_from_src: true,
7726 }
7727 `)
7728}
7729
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007730func TestApexUnwantedTransitiveDeps(t *testing.T) {
7731 bp := `
7732 apex {
7733 name: "myapex",
7734 key: "myapex.key",
7735 native_shared_libs: ["libfoo"],
7736 updatable: false,
7737 unwanted_transitive_deps: ["libbar"],
7738 }
7739
7740 apex_key {
7741 name: "myapex.key",
7742 public_key: "testkey.avbpubkey",
7743 private_key: "testkey.pem",
7744 }
7745
7746 cc_library {
7747 name: "libfoo",
7748 srcs: ["foo.cpp"],
7749 shared_libs: ["libbar"],
7750 apex_available: ["myapex"],
7751 }
7752
7753 cc_library {
7754 name: "libbar",
7755 srcs: ["bar.cpp"],
7756 apex_available: ["myapex"],
7757 }`
7758 ctx := testApex(t, bp)
7759 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7760 "*/libc++.so",
7761 "*/libfoo.so",
7762 // not libbar.so
7763 })
7764}
7765
Jiyong Park479321d2019-12-16 11:47:12 +09007766func TestRejectNonInstallableJavaLibrary(t *testing.T) {
7767 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7768 apex {
7769 name: "myapex",
7770 key: "myapex.key",
7771 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007772 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007773 }
7774
7775 apex_key {
7776 name: "myapex.key",
7777 public_key: "testkey.avbpubkey",
7778 private_key: "testkey.pem",
7779 }
7780
7781 java_library {
7782 name: "myjar",
7783 srcs: ["foo/bar/MyClass.java"],
7784 sdk_version: "none",
7785 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007786 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007787 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007788 }
7789 `)
7790}
7791
Jiyong Park7afd1072019-12-30 16:56:33 +09007792func TestCarryRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007793 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007794 apex {
7795 name: "myapex",
7796 key: "myapex.key",
7797 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007798 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007799 }
7800
7801 apex_key {
7802 name: "myapex.key",
7803 public_key: "testkey.avbpubkey",
7804 private_key: "testkey.pem",
7805 }
7806
7807 cc_library {
7808 name: "mylib",
7809 srcs: ["mylib.cpp"],
7810 system_shared_libs: [],
7811 stl: "none",
7812 required: ["a", "b"],
7813 host_required: ["c", "d"],
7814 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007815 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007816 }
7817 `)
7818
Jooyung Hana0503a52023-08-23 13:12:50 +09007819 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007820 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007821 name := apexBundle.BaseModuleName()
7822 prefix := "TARGET_"
7823 var builder strings.Builder
7824 data.Custom(&builder, name, prefix, "", data)
7825 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007826 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007827 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7828 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007829}
7830
Jiyong Park7cd10e32020-01-14 09:22:18 +09007831func TestSymlinksFromApexToSystem(t *testing.T) {
7832 bp := `
7833 apex {
7834 name: "myapex",
7835 key: "myapex.key",
7836 native_shared_libs: ["mylib"],
7837 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007838 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007839 }
7840
Jiyong Park9d677202020-02-19 16:29:35 +09007841 apex {
7842 name: "myapex.updatable",
7843 key: "myapex.key",
7844 native_shared_libs: ["mylib"],
7845 java_libs: ["myjar"],
7846 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007847 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007848 }
7849
Jiyong Park7cd10e32020-01-14 09:22:18 +09007850 apex_key {
7851 name: "myapex.key",
7852 public_key: "testkey.avbpubkey",
7853 private_key: "testkey.pem",
7854 }
7855
7856 cc_library {
7857 name: "mylib",
7858 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007859 shared_libs: [
7860 "myotherlib",
7861 "myotherlib_ext",
7862 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007863 system_shared_libs: [],
7864 stl: "none",
7865 apex_available: [
7866 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007867 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007868 "//apex_available:platform",
7869 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007870 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007871 }
7872
7873 cc_library {
7874 name: "myotherlib",
7875 srcs: ["mylib.cpp"],
7876 system_shared_libs: [],
7877 stl: "none",
7878 apex_available: [
7879 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007880 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007881 "//apex_available:platform",
7882 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007883 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007884 }
7885
Jiyong Parkce243632023-02-17 18:22:25 +09007886 cc_library {
7887 name: "myotherlib_ext",
7888 srcs: ["mylib.cpp"],
7889 system_shared_libs: [],
7890 system_ext_specific: true,
7891 stl: "none",
7892 apex_available: [
7893 "myapex",
7894 "myapex.updatable",
7895 "//apex_available:platform",
7896 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007897 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007898 }
7899
Jiyong Park7cd10e32020-01-14 09:22:18 +09007900 java_library {
7901 name: "myjar",
7902 srcs: ["foo/bar/MyClass.java"],
7903 sdk_version: "none",
7904 system_modules: "none",
Priyanka Advani (xWF)33b3a632024-08-28 23:10:29 +00007905 libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007906 apex_available: [
7907 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007908 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007909 "//apex_available:platform",
7910 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007911 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007912 }
7913
7914 java_library {
7915 name: "myotherjar",
7916 srcs: ["foo/bar/MyClass.java"],
7917 sdk_version: "none",
7918 system_modules: "none",
7919 apex_available: [
7920 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007921 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007922 "//apex_available:platform",
7923 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007924 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007925 }
7926 `
7927
7928 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7929 for _, f := range files {
7930 if f.path == file {
7931 if f.isLink {
7932 t.Errorf("%q is not a real file", file)
7933 }
7934 return
7935 }
7936 }
7937 t.Errorf("%q is not found", file)
7938 }
7939
Jiyong Parkce243632023-02-17 18:22:25 +09007940 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007941 for _, f := range files {
7942 if f.path == file {
7943 if !f.isLink {
7944 t.Errorf("%q is not a symlink", file)
7945 }
Jiyong Parkce243632023-02-17 18:22:25 +09007946 if f.src != target {
7947 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7948 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007949 return
7950 }
7951 }
7952 t.Errorf("%q is not found", file)
7953 }
7954
Jiyong Park9d677202020-02-19 16:29:35 +09007955 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7956 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007957 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007958 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 ensureRealfileExists(t, files, "javalib/myjar.jar")
7960 ensureRealfileExists(t, files, "lib64/mylib.so")
7961 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007962 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007963
Jooyung Hana0503a52023-08-23 13:12:50 +09007964 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007965 ensureRealfileExists(t, files, "javalib/myjar.jar")
7966 ensureRealfileExists(t, files, "lib64/mylib.so")
7967 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007968 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007969
7970 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007971 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007972 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007973 ensureRealfileExists(t, files, "javalib/myjar.jar")
7974 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007975 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7976 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007977
Jooyung Hana0503a52023-08-23 13:12:50 +09007978 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007979 ensureRealfileExists(t, files, "javalib/myjar.jar")
7980 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007981 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7982 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007983}
7984
Yo Chiange8128052020-07-23 20:09:18 +08007985func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08007986 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007987 apex {
7988 name: "myapex",
7989 key: "myapex.key",
7990 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007991 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007992 }
7993
7994 apex_key {
7995 name: "myapex.key",
7996 public_key: "testkey.avbpubkey",
7997 private_key: "testkey.pem",
7998 }
7999
8000 cc_library_shared {
8001 name: "mylib",
8002 srcs: ["mylib.cpp"],
8003 shared_libs: ["myotherlib"],
8004 system_shared_libs: [],
8005 stl: "none",
8006 apex_available: [
8007 "myapex",
8008 "//apex_available:platform",
8009 ],
8010 }
8011
8012 cc_prebuilt_library_shared {
8013 name: "myotherlib",
8014 srcs: ["prebuilt.so"],
8015 system_shared_libs: [],
8016 stl: "none",
8017 apex_available: [
8018 "myapex",
8019 "//apex_available:platform",
8020 ],
8021 }
8022 `)
8023
Jooyung Hana0503a52023-08-23 13:12:50 +09008024 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008025 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008026 var builder strings.Builder
8027 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8028 androidMk := builder.String()
8029 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008030 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008031 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8032 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8033 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008034 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008035}
8036
Jooyung Han643adc42020-02-27 13:50:06 +09008037func TestApexWithJniLibs(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008038 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008039 apex {
8040 name: "myapex",
8041 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008042 binaries: ["mybin"],
8043 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008044 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008045 }
8046
8047 apex_key {
8048 name: "myapex.key",
8049 public_key: "testkey.avbpubkey",
8050 private_key: "testkey.pem",
8051 }
8052
8053 cc_library {
8054 name: "mylib",
8055 srcs: ["mylib.cpp"],
8056 shared_libs: ["mylib2"],
8057 system_shared_libs: [],
8058 stl: "none",
8059 apex_available: [ "myapex" ],
8060 }
8061
8062 cc_library {
8063 name: "mylib2",
8064 srcs: ["mylib.cpp"],
8065 system_shared_libs: [],
8066 stl: "none",
8067 apex_available: [ "myapex" ],
8068 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008069
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008070 // Used as both a JNI library and a regular shared library.
8071 cc_library {
8072 name: "mylib3",
8073 srcs: ["mylib.cpp"],
8074 system_shared_libs: [],
8075 stl: "none",
8076 apex_available: [ "myapex" ],
8077 }
8078
8079 cc_binary {
8080 name: "mybin",
8081 srcs: ["mybin.cpp"],
8082 shared_libs: ["mylib3"],
8083 system_shared_libs: [],
8084 stl: "none",
8085 apex_available: [ "myapex" ],
8086 }
8087
Jiyong Park34d5c332022-02-24 18:02:44 +09008088 rust_ffi_shared {
8089 name: "libfoo.rust",
8090 crate_name: "foo",
8091 srcs: ["foo.rs"],
8092 shared_libs: ["libfoo.shared_from_rust"],
8093 prefer_rlib: true,
8094 apex_available: ["myapex"],
8095 }
8096
8097 cc_library_shared {
8098 name: "libfoo.shared_from_rust",
8099 srcs: ["mylib.cpp"],
8100 system_shared_libs: [],
8101 stl: "none",
8102 stubs: {
8103 versions: ["10", "11", "12"],
8104 },
8105 }
8106
Jooyung Han643adc42020-02-27 13:50:06 +09008107 `)
8108
Jooyung Hana0503a52023-08-23 13:12:50 +09008109 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008110 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008111 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008112 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008113 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008114 "lib64/mylib.so",
8115 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008116 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008117 "lib64/libfoo.rust.so",
8118 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8119 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008120 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008121
8122 // b/220397949
8123 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008124}
8125
Jooyung Han49f67012020-04-17 13:43:10 +09008126func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008127 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008128 apex {
8129 name: "myapex",
8130 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008131 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008132 }
8133 apex_key {
8134 name: "myapex.key",
8135 public_key: "testkey.avbpubkey",
8136 private_key: "testkey.pem",
8137 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008138 `,
8139 android.FixtureModifyConfig(func(config android.Config) {
8140 delete(config.Targets, android.Android)
8141 config.AndroidCommonTarget = android.Target{}
8142 }),
8143 )
Jooyung Han49f67012020-04-17 13:43:10 +09008144
8145 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8146 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8147 }
8148}
8149
Jiyong Parkbd159612020-02-28 15:22:21 +09008150func TestAppBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008151 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008152 apex {
8153 name: "myapex",
8154 key: "myapex.key",
8155 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008156 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008157 }
8158
8159 apex_key {
8160 name: "myapex.key",
8161 public_key: "testkey.avbpubkey",
8162 private_key: "testkey.pem",
8163 }
8164
8165 android_app {
8166 name: "AppFoo",
8167 srcs: ["foo/bar/MyClass.java"],
8168 sdk_version: "none",
8169 system_modules: "none",
8170 apex_available: [ "myapex" ],
8171 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008172 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008173
Jooyung Hana0503a52023-08-23 13:12:50 +09008174 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008175 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008176
8177 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008178 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 +09008179}
8180
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008181func TestAppSetBundle(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008182 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008183 apex {
8184 name: "myapex",
8185 key: "myapex.key",
8186 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008187 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008188 }
8189
8190 apex_key {
8191 name: "myapex.key",
8192 public_key: "testkey.avbpubkey",
8193 private_key: "testkey.pem",
8194 }
8195
8196 android_app_set {
8197 name: "AppSet",
8198 set: "AppSet.apks",
8199 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008200 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008201 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008202 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008203 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8204 s := mod.Rule("apexRule").Args["copy_commands"]
8205 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008206 if len(copyCmds) != 4 {
8207 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008208 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008209 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8210 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008211 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8212 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008213
8214 // Ensure that canned_fs_config has an entry for the app set zip file
8215 generateFsRule := mod.Rule("generateFsConfig")
8216 cmd := generateFsRule.RuleParams.Command
8217 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008218}
8219
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008220func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008221 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008222 apex_set {
8223 name: "myapex",
8224 filename: "foo_v2.apex",
8225 sanitized: {
8226 none: { set: "myapex.apks", },
8227 hwaddress: { set: "myapex.hwasan.apks", },
8228 },
Paul Duffin24704672021-04-06 16:09:30 +01008229 }
8230 `
8231 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008232
Paul Duffin24704672021-04-06 16:09:30 +01008233 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das3576e762024-01-03 18:57:03 +00008234 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008235
Spandan Das3576e762024-01-03 18:57:03 +00008236 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Paul Duffin24704672021-04-06 16:09:30 +01008237 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008238
Paul Duffin24704672021-04-06 16:09:30 +01008239 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8240
8241 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008242 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8243 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008244
8245 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008246}
8247
Pranav Guptaeba03b02022-09-27 00:27:08 +00008248func TestApexSetApksModuleAssignment(t *testing.T) {
8249 ctx := testApex(t, `
8250 apex_set {
8251 name: "myapex",
8252 set: ":myapex_apks_file",
8253 }
8254
8255 filegroup {
8256 name: "myapex_apks_file",
8257 srcs: ["myapex.apks"],
8258 }
8259 `)
8260
Spandan Das3576e762024-01-03 18:57:03 +00008261 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008262
8263 // Check that the extractor produces the correct apks file from the input module
Spandan Das3576e762024-01-03 18:57:03 +00008264 extractorOutput := "out/soong/.intermediates/prebuilt_myapex.apex.extractor/android_common/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008265 extractedApex := m.Output(extractorOutput)
8266
8267 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8268}
8269
Paul Duffin89f570a2021-06-16 01:42:33 +01008270func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008271 t.Helper()
8272
Paul Duffin55607122021-03-30 23:32:51 +01008273 fs := android.MockFS{
8274 "a.java": nil,
8275 "a.jar": nil,
8276 "apex_manifest.json": nil,
8277 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008278 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008279 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8280 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8281 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008282 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008283 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008284
Paul Duffin55607122021-03-30 23:32:51 +01008285 errorHandler := android.FixtureExpectsNoErrors
8286 if errmsg != "" {
8287 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008288 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008289
Paul Duffin55607122021-03-30 23:32:51 +01008290 result := android.GroupFixturePreparers(
8291 cc.PrepareForTestWithCcDefaultModules,
8292 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008293 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008294 java.PrepareForTestWithJavaSdkLibraryFiles,
8295 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008296 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008297 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008298 android.FixtureModifyMockFS(func(fs android.MockFS) {
8299 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8300 insert := ""
8301 for _, fragment := range fragments {
8302 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8303 }
8304 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8305 platform_bootclasspath {
8306 name: "platform-bootclasspath",
8307 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008308 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008309 %s
8310 ],
8311 }
8312 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008313 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008314 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008315 // Dexpreopt for boot jars requires the ART boot image profile.
8316 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8317 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008318 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008319 ).
8320 ExtendWithErrorHandler(errorHandler).
8321 RunTestWithBp(t, bp)
8322
8323 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008324}
8325
Paul Duffin5556c5f2022-06-09 17:32:21 +00008326func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008327 preparers := android.GroupFixturePreparers(
8328 java.PrepareForTestWithJavaDefaultModules,
Spandan Das5be63332023-12-13 00:06:32 +00008329 prepareForTestWithBootclasspathFragment,
8330 dexpreopt.FixtureSetTestOnlyArtBootImageJars("com.android.art:libfoo"),
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008331 PrepareForTestWithApexBuildComponents,
8332 ).
8333 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
Spandan Das3576e762024-01-03 18:57:03 +00008334 "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_com.android.art and prebuilt_com.mycompany.android.art"))
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008335
8336 bpBase := `
8337 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008338 name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008339 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008340 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008341 set: "myapex.apks",
8342 }
8343
8344 apex_set {
Spandan Das5be63332023-12-13 00:06:32 +00008345 name: "com.mycompany.android.art",
8346 apex_name: "com.android.art",
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008347 installable: true,
Spandan Das5be63332023-12-13 00:06:32 +00008348 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008349 set: "company-myapex.apks",
8350 }
8351
8352 prebuilt_bootclasspath_fragment {
Spandan Das5be63332023-12-13 00:06:32 +00008353 name: "art-bootclasspath-fragment",
8354 apex_available: ["com.android.art"],
Spandan Dasfae468e2023-12-12 23:23:53 +00008355 hidden_api: {
8356 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8357 metadata: "my-bootclasspath-fragment/metadata.csv",
8358 index: "my-bootclasspath-fragment/index.csv",
8359 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
8360 all_flags: "my-bootclasspath-fragment/all-flags.csv",
8361 },
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008362 %s
8363 }
8364 `
8365
8366 t.Run("java_import", func(t *testing.T) {
8367 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8368 java_import {
8369 name: "libfoo",
8370 jars: ["libfoo.jar"],
Spandan Das5be63332023-12-13 00:06:32 +00008371 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008372 }
8373 `)
8374 })
8375
8376 t.Run("java_sdk_library_import", func(t *testing.T) {
8377 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8378 java_sdk_library_import {
8379 name: "libfoo",
8380 public: {
8381 jars: ["libbar.jar"],
8382 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008383 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008384 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008385 }
8386 `)
8387 })
8388
8389 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8390 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8391 image_name: "art",
8392 contents: ["libfoo"],
8393 `)+`
8394 java_sdk_library_import {
8395 name: "libfoo",
8396 public: {
8397 jars: ["libbar.jar"],
8398 },
Spandan Dasfae468e2023-12-12 23:23:53 +00008399 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +00008400 apex_available: ["com.android.art"],
Martin Stjernholm43c44b02021-06-30 16:35:07 +01008401 }
8402 `)
8403 })
8404}
8405
Paul Duffin5556c5f2022-06-09 17:32:21 +00008406func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
8407 preparers := android.GroupFixturePreparers(
8408 java.PrepareForTestWithJavaDefaultModules,
8409 PrepareForTestWithApexBuildComponents,
8410 )
8411
Spandan Das59a4a2b2024-01-09 21:35:56 +00008412 errCtx := moduleErrorfTestCtx{}
8413
Paul Duffin5556c5f2022-06-09 17:32:21 +00008414 bpBase := `
8415 apex_set {
8416 name: "com.android.myapex",
8417 installable: true,
8418 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8419 set: "myapex.apks",
8420 }
8421
8422 apex_set {
8423 name: "com.android.myapex_compressed",
8424 apex_name: "com.android.myapex",
8425 installable: true,
8426 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8427 set: "myapex_compressed.apks",
8428 }
8429
8430 prebuilt_bootclasspath_fragment {
8431 name: "my-bootclasspath-fragment",
8432 apex_available: [
8433 "com.android.myapex",
8434 "com.android.myapex_compressed",
8435 ],
8436 hidden_api: {
8437 annotation_flags: "annotation-flags.csv",
8438 metadata: "metadata.csv",
8439 index: "index.csv",
8440 signature_patterns: "signature_patterns.csv",
8441 },
8442 %s
8443 }
8444 `
8445
8446 t.Run("java_import", func(t *testing.T) {
8447 result := preparers.RunTestWithBp(t,
8448 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8449 java_import {
8450 name: "libfoo",
8451 jars: ["libfoo.jar"],
8452 apex_available: [
8453 "com.android.myapex",
8454 "com.android.myapex_compressed",
8455 ],
8456 }
8457 `)
8458
8459 module := result.Module("libfoo", "android_common_com.android.myapex")
8460 usesLibraryDep := module.(java.UsesLibraryDependency)
8461 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008462 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008463 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008464 })
8465
8466 t.Run("java_sdk_library_import", func(t *testing.T) {
8467 result := preparers.RunTestWithBp(t,
8468 fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
8469 java_sdk_library_import {
8470 name: "libfoo",
8471 public: {
8472 jars: ["libbar.jar"],
8473 },
8474 apex_available: [
8475 "com.android.myapex",
8476 "com.android.myapex_compressed",
8477 ],
8478 compile_dex: true,
8479 }
8480 `)
8481
8482 module := result.Module("libfoo", "android_common_com.android.myapex")
8483 usesLibraryDep := module.(java.UsesLibraryDependency)
8484 android.AssertPathRelativeToTopEquals(t, "dex jar path",
Spandan Das3576e762024-01-03 18:57:03 +00008485 "out/soong/.intermediates/prebuilt_com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
Spandan Das59a4a2b2024-01-09 21:35:56 +00008486 usesLibraryDep.DexJarBuildPath(errCtx).Path())
Paul Duffin5556c5f2022-06-09 17:32:21 +00008487 })
8488
8489 t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
8490 _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
8491 image_name: "art",
8492 contents: ["libfoo"],
8493 `)+`
8494 java_sdk_library_import {
8495 name: "libfoo",
8496 public: {
8497 jars: ["libbar.jar"],
8498 },
8499 apex_available: [
8500 "com.android.myapex",
8501 "com.android.myapex_compressed",
8502 ],
8503 compile_dex: true,
8504 }
8505 `)
8506 })
8507}
8508
Jooyung Han548640b2020-04-27 12:10:30 +09008509func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
8510 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8511 apex {
8512 name: "myapex",
8513 key: "myapex.key",
8514 updatable: true,
8515 }
8516
8517 apex_key {
8518 name: "myapex.key",
8519 public_key: "testkey.avbpubkey",
8520 private_key: "testkey.pem",
8521 }
8522 `)
8523}
8524
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008525func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
8526 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8527 apex {
8528 name: "myapex",
8529 key: "myapex.key",
8530 }
8531
8532 apex_key {
8533 name: "myapex.key",
8534 public_key: "testkey.avbpubkey",
8535 private_key: "testkey.pem",
8536 }
8537 `)
8538}
8539
satayevb98371c2021-06-15 16:49:50 +01008540func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
8541 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8542 apex {
8543 name: "myapex",
8544 key: "myapex.key",
8545 systemserverclasspath_fragments: [
8546 "mysystemserverclasspathfragment",
8547 ],
8548 min_sdk_version: "29",
8549 updatable: true,
8550 }
8551
8552 apex_key {
8553 name: "myapex.key",
8554 public_key: "testkey.avbpubkey",
8555 private_key: "testkey.pem",
8556 }
8557
8558 java_library {
8559 name: "foo",
8560 srcs: ["b.java"],
8561 min_sdk_version: "29",
8562 installable: true,
8563 apex_available: [
8564 "myapex",
8565 ],
8566 }
8567
8568 systemserverclasspath_fragment {
8569 name: "mysystemserverclasspathfragment",
8570 generate_classpaths_proto: false,
8571 contents: [
8572 "foo",
8573 ],
8574 apex_available: [
8575 "myapex",
8576 ],
8577 }
satayevabcd5972021-08-06 17:49:46 +01008578 `,
8579 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8580 )
satayevb98371c2021-06-15 16:49:50 +01008581}
8582
Paul Duffin064b70c2020-11-02 17:32:38 +00008583func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
satayevabcd5972021-08-06 17:49:46 +01008584 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008585 t.Run("prebuilt no source", func(t *testing.T) {
Paul Duffin89f570a2021-06-16 01:42:33 +01008586 fragment := java.ApexVariantReference{
8587 Apex: proptools.StringPtr("myapex"),
8588 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8589 }
8590
Paul Duffin064b70c2020-11-02 17:32:38 +00008591 testDexpreoptWithApexes(t, `
8592 prebuilt_apex {
8593 name: "myapex" ,
8594 arch: {
8595 arm64: {
8596 src: "myapex-arm64.apex",
8597 },
8598 arm: {
8599 src: "myapex-arm.apex",
8600 },
8601 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008602 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8603 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008604
Paul Duffin89f570a2021-06-16 01:42:33 +01008605 prebuilt_bootclasspath_fragment {
8606 name: "my-bootclasspath-fragment",
8607 contents: ["libfoo"],
8608 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008609 hidden_api: {
8610 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8611 metadata: "my-bootclasspath-fragment/metadata.csv",
8612 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008613 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8614 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8615 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008616 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008617 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008618
Paul Duffin89f570a2021-06-16 01:42:33 +01008619 java_import {
8620 name: "libfoo",
8621 jars: ["libfoo.jar"],
8622 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01008623 permitted_packages: ["libfoo"],
Paul Duffin89f570a2021-06-16 01:42:33 +01008624 }
8625 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008626 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008627}
8628
Spandan Dasf14e2542021-11-12 00:01:37 +00008629func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008630 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008631 bp += `
8632 apex_key {
8633 name: "myapex.key",
8634 public_key: "testkey.avbpubkey",
8635 private_key: "testkey.pem",
8636 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008637 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008638 "lib1/src/A.java": nil,
8639 "lib2/src/B.java": nil,
8640 "system/sepolicy/apex/myapex-file_contexts": nil,
8641 }
8642
Paul Duffin45338f02021-03-30 23:07:52 +01008643 errorHandler := android.FixtureExpectsNoErrors
8644 if errmsg != "" {
8645 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008646 }
Colin Crossae8600b2020-10-29 17:09:13 -07008647
Paul Duffin45338f02021-03-30 23:07:52 +01008648 android.GroupFixturePreparers(
8649 android.PrepareForTestWithAndroidBuildComponents,
8650 java.PrepareForTestWithJavaBuildComponents,
8651 PrepareForTestWithApexBuildComponents,
8652 android.PrepareForTestWithNeverallowRules(rules),
8653 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008654 apexBootJars := make([]string, 0, len(bootJars))
8655 for _, apexBootJar := range bootJars {
8656 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008657 }
satayevd604b212021-07-21 14:23:52 +01008658 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008659 }),
8660 fs.AddToFixture(),
8661 ).
8662 ExtendWithErrorHandler(errorHandler).
8663 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008664}
8665
8666func TestApexPermittedPackagesRules(t *testing.T) {
8667 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008668 name string
8669 expectedError string
8670 bp string
8671 bootJars []string
8672 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008673 }{
8674
8675 {
8676 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8677 expectedError: "",
8678 bp: `
8679 java_library {
8680 name: "bcp_lib1",
8681 srcs: ["lib1/src/*.java"],
8682 permitted_packages: ["foo.bar"],
8683 apex_available: ["myapex"],
8684 sdk_version: "none",
8685 system_modules: "none",
8686 }
8687 java_library {
8688 name: "nonbcp_lib2",
8689 srcs: ["lib2/src/*.java"],
8690 apex_available: ["myapex"],
8691 permitted_packages: ["a.b"],
8692 sdk_version: "none",
8693 system_modules: "none",
8694 }
8695 apex {
8696 name: "myapex",
8697 key: "myapex.key",
8698 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008699 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008700 }`,
8701 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008702 bcpPermittedPackages: map[string][]string{
8703 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008704 "foo.bar",
8705 },
8706 },
8707 },
8708 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008709 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008710 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 +01008711 bp: `
8712 java_library {
8713 name: "bcp_lib1",
8714 srcs: ["lib1/src/*.java"],
8715 apex_available: ["myapex"],
8716 permitted_packages: ["foo.bar"],
8717 sdk_version: "none",
8718 system_modules: "none",
8719 }
8720 java_library {
8721 name: "bcp_lib2",
8722 srcs: ["lib2/src/*.java"],
8723 apex_available: ["myapex"],
8724 permitted_packages: ["foo.bar", "bar.baz"],
8725 sdk_version: "none",
8726 system_modules: "none",
8727 }
8728 apex {
8729 name: "myapex",
8730 key: "myapex.key",
8731 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008732 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008733 }
8734 `,
8735 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008736 bcpPermittedPackages: map[string][]string{
8737 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008738 "foo.bar",
8739 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008740 "bcp_lib2": []string{
8741 "foo.bar",
8742 },
8743 },
8744 },
8745 {
8746 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8747 expectedError: "",
8748 bp: `
8749 java_library {
8750 name: "bcp_lib_restricted",
8751 srcs: ["lib1/src/*.java"],
8752 apex_available: ["myapex"],
8753 permitted_packages: ["foo.bar"],
8754 sdk_version: "none",
8755 min_sdk_version: "29",
8756 system_modules: "none",
8757 }
8758 java_library {
8759 name: "bcp_lib_unrestricted",
8760 srcs: ["lib2/src/*.java"],
8761 apex_available: ["myapex"],
8762 permitted_packages: ["foo.bar", "bar.baz"],
8763 sdk_version: "none",
8764 min_sdk_version: "29",
8765 system_modules: "none",
8766 }
8767 apex {
8768 name: "myapex",
8769 key: "myapex.key",
8770 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8771 updatable: true,
8772 min_sdk_version: "29",
8773 }
8774 `,
8775 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8776 bcpPermittedPackages: map[string][]string{
8777 "bcp_lib1_non_updateable": []string{
8778 "foo.bar",
8779 },
8780 // 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 +01008781 },
8782 },
8783 }
8784 for _, tc := range testcases {
8785 t.Run(tc.name, func(t *testing.T) {
Spandan Dasf14e2542021-11-12 00:01:37 +00008786 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8787 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008788 })
8789 }
8790}
8791
Jiyong Park62304bb2020-04-13 16:19:48 +09008792func TestTestFor(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008793 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008794 apex {
8795 name: "myapex",
8796 key: "myapex.key",
8797 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008798 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008799 }
8800
8801 apex_key {
8802 name: "myapex.key",
8803 public_key: "testkey.avbpubkey",
8804 private_key: "testkey.pem",
8805 }
8806
8807 cc_library {
8808 name: "mylib",
8809 srcs: ["mylib.cpp"],
8810 system_shared_libs: [],
8811 stl: "none",
8812 stubs: {
8813 versions: ["1"],
8814 },
8815 apex_available: ["myapex"],
8816 }
8817
8818 cc_library {
8819 name: "myprivlib",
8820 srcs: ["mylib.cpp"],
8821 system_shared_libs: [],
8822 stl: "none",
8823 apex_available: ["myapex"],
8824 }
8825
8826
8827 cc_test {
8828 name: "mytest",
8829 gtest: false,
8830 srcs: ["mylib.cpp"],
8831 system_shared_libs: [],
8832 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008833 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008834 test_for: ["myapex"]
8835 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008836
8837 cc_library {
8838 name: "mytestlib",
8839 srcs: ["mylib.cpp"],
8840 system_shared_libs: [],
8841 shared_libs: ["mylib", "myprivlib"],
8842 stl: "none",
8843 test_for: ["myapex"],
8844 }
8845
8846 cc_benchmark {
8847 name: "mybench",
8848 srcs: ["mylib.cpp"],
8849 system_shared_libs: [],
8850 shared_libs: ["mylib", "myprivlib"],
8851 stl: "none",
8852 test_for: ["myapex"],
8853 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008854 `)
8855
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008856 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008857 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008858 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8859 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8860 }
8861
8862 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008863 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008864 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8865 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8866 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8867}
Jiyong Park46a512f2020-12-04 18:02:13 +09008868
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008869func TestIndirectTestFor(t *testing.T) {
8870 ctx := testApex(t, `
8871 apex {
8872 name: "myapex",
8873 key: "myapex.key",
8874 native_shared_libs: ["mylib", "myprivlib"],
8875 updatable: false,
8876 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008877
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008878 apex_key {
8879 name: "myapex.key",
8880 public_key: "testkey.avbpubkey",
8881 private_key: "testkey.pem",
8882 }
8883
8884 cc_library {
8885 name: "mylib",
8886 srcs: ["mylib.cpp"],
8887 system_shared_libs: [],
8888 stl: "none",
8889 stubs: {
8890 versions: ["1"],
8891 },
8892 apex_available: ["myapex"],
8893 }
8894
8895 cc_library {
8896 name: "myprivlib",
8897 srcs: ["mylib.cpp"],
8898 system_shared_libs: [],
8899 stl: "none",
8900 shared_libs: ["mylib"],
8901 apex_available: ["myapex"],
8902 }
8903
8904 cc_library {
8905 name: "mytestlib",
8906 srcs: ["mylib.cpp"],
8907 system_shared_libs: [],
8908 shared_libs: ["myprivlib"],
8909 stl: "none",
8910 test_for: ["myapex"],
8911 }
8912 `)
8913
8914 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008915 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008916 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8917 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8918 }
8919
8920 // The platform variant of mytestlib links to the platform variant of the
8921 // internal myprivlib.
8922 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8923
8924 // The platform variant of myprivlib links to the platform variant of mylib
8925 // and bypasses its stubs.
8926 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 +09008927}
8928
Martin Stjernholmec009002021-03-27 15:18:31 +00008929func TestTestForForLibInOtherApex(t *testing.T) {
8930 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8931 _ = testApex(t, `
8932 apex {
8933 name: "com.android.art",
8934 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008935 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008936 updatable: false,
8937 }
8938
8939 apex {
8940 name: "com.android.art.debug",
8941 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008942 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008943 updatable: false,
8944 }
8945
8946 apex_key {
8947 name: "myapex.key",
8948 public_key: "testkey.avbpubkey",
8949 private_key: "testkey.pem",
8950 }
8951
8952 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008953 name: "libnativebridge",
8954 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008955 system_shared_libs: [],
8956 stl: "none",
8957 stubs: {
8958 versions: ["1"],
8959 },
8960 apex_available: ["com.android.art", "com.android.art.debug"],
8961 }
8962
8963 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008964 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008965 srcs: ["mylib.cpp"],
8966 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008967 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008968 stl: "none",
8969 apex_available: ["com.android.art.debug"],
8970 test_for: ["com.android.art"],
8971 }
8972 `,
8973 android.MockFS{
8974 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8975 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8976 }.AddToFixture())
8977}
8978
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008979// TODO(jungjw): Move this to proptools
8980func intPtr(i int) *int {
8981 return &i
8982}
8983
8984func TestApexSet(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08008985 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008986 apex_set {
8987 name: "myapex",
8988 set: "myapex.apks",
8989 filename: "foo_v2.apex",
8990 overrides: ["foo"],
8991 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008992 `,
8993 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8994 variables.Platform_sdk_version = intPtr(30)
8995 }),
8996 android.FixtureModifyConfig(func(config android.Config) {
8997 config.Targets[android.Android] = []android.Target{
8998 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8999 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9000 }
9001 }),
9002 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009003
Spandan Das3576e762024-01-03 18:57:03 +00009004 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009005
9006 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009007 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009008 actual := extractedApex.Args["abis"]
9009 expected := "ARMEABI_V7A,ARM64_V8A"
9010 if actual != expected {
9011 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9012 }
9013 actual = extractedApex.Args["sdk-version"]
9014 expected = "30"
9015 if actual != expected {
9016 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9017 }
9018
Paul Duffin6717d882021-06-15 19:09:41 +01009019 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009020 a := m.Module().(*ApexSet)
9021 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009022 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009023 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9024 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9025 }
9026}
9027
Anton Hansson805e0a52022-11-25 14:06:46 +00009028func TestApexSet_NativeBridge(t *testing.T) {
9029 ctx := testApex(t, `
9030 apex_set {
9031 name: "myapex",
9032 set: "myapex.apks",
9033 filename: "foo_v2.apex",
9034 overrides: ["foo"],
9035 }
9036 `,
9037 android.FixtureModifyConfig(func(config android.Config) {
9038 config.Targets[android.Android] = []android.Target{
9039 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9040 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9041 }
9042 }),
9043 )
9044
Spandan Das3576e762024-01-03 18:57:03 +00009045 m := ctx.ModuleForTests("prebuilt_myapex.apex.extractor", "android_common")
Anton Hansson805e0a52022-11-25 14:06:46 +00009046
9047 // Check extract_apks tool parameters. No native bridge arch expected
9048 extractedApex := m.Output("extracted/myapex.apks")
9049 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9050}
9051
Jiyong Park7d95a512020-05-10 15:16:24 +09009052func TestNoStaticLinkingToStubsLib(t *testing.T) {
9053 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9054 apex {
9055 name: "myapex",
9056 key: "myapex.key",
9057 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009058 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009059 }
9060
9061 apex_key {
9062 name: "myapex.key",
9063 public_key: "testkey.avbpubkey",
9064 private_key: "testkey.pem",
9065 }
9066
9067 cc_library {
9068 name: "mylib",
9069 srcs: ["mylib.cpp"],
9070 static_libs: ["otherlib"],
9071 system_shared_libs: [],
9072 stl: "none",
9073 apex_available: [ "myapex" ],
9074 }
9075
9076 cc_library {
9077 name: "otherlib",
9078 srcs: ["mylib.cpp"],
9079 system_shared_libs: [],
9080 stl: "none",
9081 stubs: {
9082 versions: ["1", "2", "3"],
9083 },
9084 apex_available: [ "myapex" ],
9085 }
9086 `)
9087}
9088
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009089func TestApexKeysTxt(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009090 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009091 apex {
9092 name: "myapex",
9093 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009094 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009095 custom_sign_tool: "sign_myapex",
9096 }
9097
9098 apex_key {
9099 name: "myapex.key",
9100 public_key: "testkey.avbpubkey",
9101 private_key: "testkey.pem",
9102 }
9103 `)
9104
Jooyung Han286957d2023-10-30 16:17:56 +09009105 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009106 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009107 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 +09009108}
9109
9110func TestApexKeysTxtOverrides(t *testing.T) {
9111 ctx := testApex(t, `
9112 apex {
9113 name: "myapex",
9114 key: "myapex.key",
9115 updatable: false,
9116 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009117 }
9118
9119 apex_key {
9120 name: "myapex.key",
9121 public_key: "testkey.avbpubkey",
9122 private_key: "testkey.pem",
9123 }
9124
9125 prebuilt_apex {
9126 name: "myapex",
9127 prefer: true,
9128 arch: {
9129 arm64: {
9130 src: "myapex-arm64.apex",
9131 },
9132 arm: {
9133 src: "myapex-arm.apex",
9134 },
9135 },
9136 }
9137
9138 apex_set {
9139 name: "myapex_set",
9140 set: "myapex.apks",
9141 filename: "myapex_set.apex",
9142 overrides: ["myapex"],
9143 }
9144 `)
9145
Colin Crossf61d03d2023-11-02 16:56:39 -07009146 content := android.ContentFromFileRuleForTests(t, ctx,
9147 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009148 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 -07009149 content = android.ContentFromFileRuleForTests(t, ctx,
9150 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009151 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 +09009152}
9153
Jooyung Han938b5932020-06-20 12:47:47 +09009154func TestAllowedFiles(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009155 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009156 apex {
9157 name: "myapex",
9158 key: "myapex.key",
9159 apps: ["app"],
9160 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009161 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009162 }
9163
9164 apex_key {
9165 name: "myapex.key",
9166 public_key: "testkey.avbpubkey",
9167 private_key: "testkey.pem",
9168 }
9169
9170 android_app {
9171 name: "app",
9172 srcs: ["foo/bar/MyClass.java"],
9173 package_name: "foo",
9174 sdk_version: "none",
9175 system_modules: "none",
9176 apex_available: [ "myapex" ],
9177 }
9178 `, withFiles(map[string][]byte{
9179 "sub/Android.bp": []byte(`
9180 override_apex {
9181 name: "override_myapex",
9182 base: "myapex",
9183 apps: ["override_app"],
9184 allowed_files: ":allowed",
9185 }
9186 // Overridable "path" property should be referenced indirectly
9187 filegroup {
9188 name: "allowed",
9189 srcs: ["allowed.txt"],
9190 }
9191 override_android_app {
9192 name: "override_app",
9193 base: "app",
9194 package_name: "bar",
9195 }
9196 `),
9197 }))
9198
Jooyung Hana0503a52023-08-23 13:12:50 +09009199 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009200 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9201 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9202 }
9203
Spandan Das50801e22024-05-13 18:29:45 +00009204 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009205 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9206 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9207 }
9208}
9209
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009210func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009211 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009212 apex {
9213 name: "myapex",
9214 key: "myapex.key",
9215 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009216 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009217 }
9218
9219 apex_key {
9220 name: "myapex.key",
9221 public_key: "testkey.avbpubkey",
9222 private_key: "testkey.pem",
9223 }
9224
9225 cc_library {
9226 name: "mylib",
9227 srcs: ["mylib.cpp"],
9228 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009229 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009230 },
9231 apex_available: ["myapex"],
9232 }
9233
9234 cc_prebuilt_library_shared {
9235 name: "mylib",
9236 prefer: false,
9237 srcs: ["prebuilt.so"],
9238 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009239 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009240 },
9241 apex_available: ["myapex"],
9242 }
9243 `)
9244}
9245
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009246func TestCompressedApex(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009247 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009248 apex {
9249 name: "myapex",
9250 key: "myapex.key",
9251 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009252 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009253 }
9254 apex_key {
9255 name: "myapex.key",
9256 public_key: "testkey.avbpubkey",
9257 private_key: "testkey.pem",
9258 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009259 `,
9260 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9261 variables.CompressedApex = proptools.BoolPtr(true)
9262 }),
9263 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009264
Jooyung Hana0503a52023-08-23 13:12:50 +09009265 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009266 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9267
Jooyung Hana0503a52023-08-23 13:12:50 +09009268 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009269 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9270
9271 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009272 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009273 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9274
9275 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009276 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009277 var builder strings.Builder
9278 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9279 androidMk := builder.String()
9280 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9281}
9282
Jooyung Han26ec8482024-07-31 15:04:05 +09009283func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
9284 for _, compressionEnabled := range []bool{true, false} {
9285 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
9286 ctx := testApex(t, `
9287 apex_set {
9288 name: "com.company.android.myapex",
9289 apex_name: "com.android.myapex",
9290 set: "company-myapex.apks",
9291 }
9292 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9293 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9294 }),
9295 )
9296
9297 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9298 if compressionEnabled {
9299 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9300 } else {
9301 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9302 }
9303 })
9304 }
9305}
9306
Martin Stjernholm2856c662020-12-02 15:03:42 +00009307func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009308 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009309 apex {
9310 name: "myapex",
9311 key: "myapex.key",
9312 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009313 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009314 }
9315
9316 apex_key {
9317 name: "myapex.key",
9318 public_key: "testkey.avbpubkey",
9319 private_key: "testkey.pem",
9320 }
9321
9322 cc_library {
9323 name: "mylib",
9324 srcs: ["mylib.cpp"],
9325 apex_available: ["myapex"],
9326 shared_libs: ["otherlib"],
9327 system_shared_libs: [],
9328 }
9329
9330 cc_library {
9331 name: "otherlib",
9332 srcs: ["mylib.cpp"],
9333 stubs: {
9334 versions: ["current"],
9335 },
9336 }
9337
9338 cc_prebuilt_library_shared {
9339 name: "otherlib",
9340 prefer: true,
9341 srcs: ["prebuilt.so"],
9342 stubs: {
9343 versions: ["current"],
9344 },
9345 }
9346 `)
9347
Jooyung Hana0503a52023-08-23 13:12:50 +09009348 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009349 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009350 var builder strings.Builder
9351 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9352 androidMk := builder.String()
9353
9354 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9355 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009356 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009357}
9358
Jiyong Parke3867542020-12-03 17:28:25 +09009359func TestExcludeDependency(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009360 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009361 apex {
9362 name: "myapex",
9363 key: "myapex.key",
9364 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009365 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009366 }
9367
9368 apex_key {
9369 name: "myapex.key",
9370 public_key: "testkey.avbpubkey",
9371 private_key: "testkey.pem",
9372 }
9373
9374 cc_library {
9375 name: "mylib",
9376 srcs: ["mylib.cpp"],
9377 system_shared_libs: [],
9378 stl: "none",
9379 apex_available: ["myapex"],
9380 shared_libs: ["mylib2"],
9381 target: {
9382 apex: {
9383 exclude_shared_libs: ["mylib2"],
9384 },
9385 },
9386 }
9387
9388 cc_library {
9389 name: "mylib2",
9390 srcs: ["mylib.cpp"],
9391 system_shared_libs: [],
9392 stl: "none",
9393 }
9394 `)
9395
9396 // Check if mylib is linked to mylib2 for the non-apex target
9397 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9398 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9399
9400 // Make sure that the link doesn't occur for the apex target
9401 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9402 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9403
9404 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009405 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009406 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9407}
9408
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009409func TestPrebuiltStubLibDep(t *testing.T) {
9410 bpBase := `
9411 apex {
9412 name: "myapex",
9413 key: "myapex.key",
9414 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009415 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009416 }
9417 apex_key {
9418 name: "myapex.key",
9419 public_key: "testkey.avbpubkey",
9420 private_key: "testkey.pem",
9421 }
9422 cc_library {
9423 name: "mylib",
9424 srcs: ["mylib.cpp"],
9425 apex_available: ["myapex"],
9426 shared_libs: ["stublib"],
9427 system_shared_libs: [],
9428 }
9429 apex {
9430 name: "otherapex",
9431 enabled: %s,
9432 key: "myapex.key",
9433 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009434 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009435 }
9436 `
9437
9438 stublibSourceBp := `
9439 cc_library {
9440 name: "stublib",
9441 srcs: ["mylib.cpp"],
9442 apex_available: ["otherapex"],
9443 system_shared_libs: [],
9444 stl: "none",
9445 stubs: {
9446 versions: ["1"],
9447 },
9448 }
9449 `
9450
9451 stublibPrebuiltBp := `
9452 cc_prebuilt_library_shared {
9453 name: "stublib",
9454 srcs: ["prebuilt.so"],
9455 apex_available: ["otherapex"],
9456 stubs: {
9457 versions: ["1"],
9458 },
9459 %s
9460 }
9461 `
9462
9463 tests := []struct {
9464 name string
9465 stublibBp string
9466 usePrebuilt bool
9467 modNames []string // Modules to collect AndroidMkEntries for
9468 otherApexEnabled []string
9469 }{
9470 {
9471 name: "only_source",
9472 stublibBp: stublibSourceBp,
9473 usePrebuilt: false,
9474 modNames: []string{"stublib"},
9475 otherApexEnabled: []string{"true", "false"},
9476 },
9477 {
9478 name: "source_preferred",
9479 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9480 usePrebuilt: false,
9481 modNames: []string{"stublib", "prebuilt_stublib"},
9482 otherApexEnabled: []string{"true", "false"},
9483 },
9484 {
9485 name: "prebuilt_preferred",
9486 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9487 usePrebuilt: true,
9488 modNames: []string{"stublib", "prebuilt_stublib"},
9489 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9490 },
9491 {
9492 name: "only_prebuilt",
9493 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9494 usePrebuilt: true,
9495 modNames: []string{"stublib"},
9496 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9497 },
9498 }
9499
9500 for _, test := range tests {
9501 t.Run(test.name, func(t *testing.T) {
9502 for _, otherApexEnabled := range test.otherApexEnabled {
9503 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08009504 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009505
9506 type modAndMkEntries struct {
9507 mod *cc.Module
9508 mkEntries android.AndroidMkEntries
9509 }
9510 entries := []*modAndMkEntries{}
9511
9512 // Gather shared lib modules that are installable
9513 for _, modName := range test.modNames {
9514 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9515 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9516 continue
9517 }
9518 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009519 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009520 continue
9521 }
Colin Crossaa255532020-07-03 13:18:24 -07009522 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009523 if ent.Disabled {
9524 continue
9525 }
9526 entries = append(entries, &modAndMkEntries{
9527 mod: mod,
9528 mkEntries: ent,
9529 })
9530 }
9531 }
9532 }
9533
9534 var entry *modAndMkEntries = nil
9535 for _, ent := range entries {
9536 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9537 if entry != nil {
9538 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9539 } else {
9540 entry = ent
9541 }
9542 }
9543 }
9544
9545 if entry == nil {
9546 t.Errorf("AndroidMk entry for \"stublib\" missing")
9547 } else {
9548 isPrebuilt := entry.mod.Prebuilt() != nil
9549 if isPrebuilt != test.usePrebuilt {
9550 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9551 }
9552 if !entry.mod.IsStubs() {
9553 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9554 }
9555 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9556 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9557 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009558 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009559 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009560 if !android.InList(expected, cflags) {
9561 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9562 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009563 }
9564 })
9565 }
9566 })
9567 }
9568}
9569
Colin Crossc33e5212021-05-25 18:16:02 -07009570func TestApexJavaCoverage(t *testing.T) {
9571 bp := `
9572 apex {
9573 name: "myapex",
9574 key: "myapex.key",
9575 java_libs: ["mylib"],
9576 bootclasspath_fragments: ["mybootclasspathfragment"],
9577 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9578 updatable: false,
9579 }
9580
9581 apex_key {
9582 name: "myapex.key",
9583 public_key: "testkey.avbpubkey",
9584 private_key: "testkey.pem",
9585 }
9586
9587 java_library {
9588 name: "mylib",
9589 srcs: ["mylib.java"],
9590 apex_available: ["myapex"],
9591 compile_dex: true,
9592 }
9593
9594 bootclasspath_fragment {
9595 name: "mybootclasspathfragment",
9596 contents: ["mybootclasspathlib"],
9597 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009598 hidden_api: {
9599 split_packages: ["*"],
9600 },
Colin Crossc33e5212021-05-25 18:16:02 -07009601 }
9602
9603 java_library {
9604 name: "mybootclasspathlib",
9605 srcs: ["mybootclasspathlib.java"],
9606 apex_available: ["myapex"],
9607 compile_dex: true,
9608 }
9609
9610 systemserverclasspath_fragment {
9611 name: "mysystemserverclasspathfragment",
9612 contents: ["mysystemserverclasspathlib"],
9613 apex_available: ["myapex"],
9614 }
9615
9616 java_library {
9617 name: "mysystemserverclasspathlib",
9618 srcs: ["mysystemserverclasspathlib.java"],
9619 apex_available: ["myapex"],
9620 compile_dex: true,
9621 }
9622 `
9623
9624 result := android.GroupFixturePreparers(
9625 PrepareForTestWithApexBuildComponents,
9626 prepareForTestWithMyapex,
9627 java.PrepareForTestWithJavaDefaultModules,
9628 android.PrepareForTestWithAndroidBuildComponents,
9629 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009630 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9631 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009632 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009633 ).RunTest(t)
9634
9635 // Make sure jacoco ran on both mylib and mybootclasspathlib
9636 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9637 t.Errorf("Failed to find jacoco rule for mylib")
9638 }
9639 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9640 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9641 }
9642 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9643 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9644 }
9645}
9646
Jiyong Park192600a2021-08-03 07:52:17 +00009647func TestProhibitStaticExecutable(t *testing.T) {
9648 testApexError(t, `executable mybin is static`, `
9649 apex {
9650 name: "myapex",
9651 key: "myapex.key",
9652 binaries: ["mybin"],
9653 min_sdk_version: "29",
9654 }
9655
9656 apex_key {
9657 name: "myapex.key",
9658 public_key: "testkey.avbpubkey",
9659 private_key: "testkey.pem",
9660 }
9661
9662 cc_binary {
9663 name: "mybin",
9664 srcs: ["mylib.cpp"],
9665 relative_install_path: "foo/bar",
9666 static_executable: true,
9667 system_shared_libs: [],
9668 stl: "none",
9669 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009670 min_sdk_version: "29",
9671 }
9672 `)
9673
9674 testApexError(t, `executable mybin.rust is static`, `
9675 apex {
9676 name: "myapex",
9677 key: "myapex.key",
9678 binaries: ["mybin.rust"],
9679 min_sdk_version: "29",
9680 }
9681
9682 apex_key {
9683 name: "myapex.key",
9684 public_key: "testkey.avbpubkey",
9685 private_key: "testkey.pem",
9686 }
9687
9688 rust_binary {
9689 name: "mybin.rust",
9690 srcs: ["foo.rs"],
9691 static_executable: true,
9692 apex_available: ["myapex"],
9693 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009694 }
9695 `)
9696}
9697
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009698func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
9699 ctx := testApex(t, `
9700 apex {
9701 name: "myapex",
9702 key: "myapex.key",
9703 updatable: false,
9704 java_libs: ["foo"],
9705 }
9706
9707 apex_key {
9708 name: "myapex.key",
9709 public_key: "testkey.avbpubkey",
9710 private_key: "testkey.pem",
9711 }
9712
9713 java_library {
9714 name: "foo",
9715 srcs: ["foo.java"],
9716 apex_available: ["myapex"],
9717 installable: true,
9718 }
9719 `,
9720 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9721 )
9722
Jooyung Hana0503a52023-08-23 13:12:50 +09009723 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009724 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9725 var builder strings.Builder
9726 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9727 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009728 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 +00009729}
9730
9731func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
9732 ctx := testApex(t, `
9733 prebuilt_apex {
9734 name: "myapex",
9735 arch: {
9736 arm64: {
9737 src: "myapex-arm64.apex",
9738 },
9739 arm: {
9740 src: "myapex-arm.apex",
9741 },
9742 },
9743 exported_java_libs: ["foo"],
9744 }
9745
9746 java_import {
9747 name: "foo",
9748 jars: ["foo.jar"],
Jiakai Zhang28bc9a82021-12-20 15:08:57 +00009749 apex_available: ["myapex"],
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009750 }
9751 `,
9752 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9753 )
9754
9755 prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
9756 entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
9757 mainModuleEntries := entriesList[0]
9758 android.AssertArrayString(t,
9759 "LOCAL_REQUIRED_MODULES",
9760 mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
9761 []string{
9762 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
9763 "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
9764 })
9765}
9766
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009767func TestAndroidMk_RequiredModules(t *testing.T) {
9768 ctx := testApex(t, `
9769 apex {
9770 name: "myapex",
9771 key: "myapex.key",
9772 updatable: false,
9773 java_libs: ["foo"],
9774 required: ["otherapex"],
9775 }
9776
9777 apex {
9778 name: "otherapex",
9779 key: "myapex.key",
9780 updatable: false,
9781 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009782 }
9783
9784 apex_key {
9785 name: "myapex.key",
9786 public_key: "testkey.avbpubkey",
9787 private_key: "testkey.pem",
9788 }
9789
9790 java_library {
9791 name: "foo",
9792 srcs: ["foo.java"],
9793 apex_available: ["myapex", "otherapex"],
9794 installable: true,
9795 }
9796 `)
9797
Jooyung Hana0503a52023-08-23 13:12:50 +09009798 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009799 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9800 var builder strings.Builder
9801 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9802 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009803 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009804}
9805
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009806func TestAndroidMk_RequiredDeps(t *testing.T) {
9807 ctx := testApex(t, `
9808 apex {
9809 name: "myapex",
9810 key: "myapex.key",
9811 updatable: false,
9812 }
9813
9814 apex_key {
9815 name: "myapex.key",
9816 public_key: "testkey.avbpubkey",
9817 private_key: "testkey.pem",
9818 }
9819 `)
9820
Jooyung Hana0503a52023-08-23 13:12:50 +09009821 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009822 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009823 data := android.AndroidMkDataForTest(t, ctx, bundle)
9824 var builder strings.Builder
9825 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9826 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009827 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009828}
9829
Jooyung Hana6d36672022-02-24 13:58:07 +09009830func TestApexOutputFileProducer(t *testing.T) {
9831 for _, tc := range []struct {
9832 name string
9833 ref string
9834 expected_data []string
9835 }{
9836 {
9837 name: "test_using_output",
9838 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009839 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009840 },
9841 {
9842 name: "test_using_apex",
9843 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009844 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009845 },
9846 } {
9847 t.Run(tc.name, func(t *testing.T) {
9848 ctx := testApex(t, `
9849 apex {
9850 name: "myapex",
9851 key: "myapex.key",
9852 compressible: true,
9853 updatable: false,
9854 }
9855
9856 apex_key {
9857 name: "myapex.key",
9858 public_key: "testkey.avbpubkey",
9859 private_key: "testkey.pem",
9860 }
9861
9862 java_test {
9863 name: "`+tc.name+`",
9864 srcs: ["a.java"],
9865 data: ["`+tc.ref+`"],
9866 }
9867 `,
9868 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9869 variables.CompressedApex = proptools.BoolPtr(true)
9870 }))
9871 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9872 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9873 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9874 })
9875 }
9876}
9877
satayev758968a2021-12-06 11:42:40 +00009878func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
9879 preparer := android.GroupFixturePreparers(
9880 PrepareForTestWithApexBuildComponents,
9881 prepareForTestWithMyapex,
9882 java.PrepareForTestWithJavaSdkLibraryFiles,
9883 java.PrepareForTestWithJavaDefaultModules,
9884 android.PrepareForTestWithAndroidBuildComponents,
9885 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9886 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9887 )
9888
9889 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9890 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9891 preparer.RunTestWithBp(t, `
9892 apex {
9893 name: "myapex",
9894 key: "myapex.key",
9895 bootclasspath_fragments: ["mybootclasspathfragment"],
9896 min_sdk_version: "30",
9897 updatable: false,
9898 }
9899
9900 apex_key {
9901 name: "myapex.key",
9902 public_key: "testkey.avbpubkey",
9903 private_key: "testkey.pem",
9904 }
9905
9906 bootclasspath_fragment {
9907 name: "mybootclasspathfragment",
9908 contents: ["mybootclasspathlib"],
9909 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009910 hidden_api: {
9911 split_packages: ["*"],
9912 },
satayev758968a2021-12-06 11:42:40 +00009913 }
9914
9915 java_sdk_library {
9916 name: "mybootclasspathlib",
9917 srcs: ["mybootclasspathlib.java"],
9918 apex_available: ["myapex"],
9919 compile_dex: true,
9920 unsafe_ignore_missing_latest_api: true,
9921 min_sdk_version: "31",
9922 static_libs: ["util"],
9923 }
9924
9925 java_library {
9926 name: "util",
9927 srcs: ["a.java"],
9928 apex_available: ["myapex"],
9929 min_sdk_version: "31",
9930 static_libs: ["another_util"],
9931 }
9932
9933 java_library {
9934 name: "another_util",
9935 srcs: ["a.java"],
9936 min_sdk_version: "31",
9937 apex_available: ["myapex"],
9938 }
9939 `)
9940 })
9941
9942 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9943 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
9944 preparer.RunTestWithBp(t, `
9945 apex {
9946 name: "myapex",
9947 key: "myapex.key",
9948 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9949 min_sdk_version: "30",
9950 updatable: false,
9951 }
9952
9953 apex_key {
9954 name: "myapex.key",
9955 public_key: "testkey.avbpubkey",
9956 private_key: "testkey.pem",
9957 }
9958
9959 systemserverclasspath_fragment {
9960 name: "mysystemserverclasspathfragment",
9961 contents: ["mysystemserverclasspathlib"],
9962 apex_available: ["myapex"],
9963 }
9964
9965 java_sdk_library {
9966 name: "mysystemserverclasspathlib",
9967 srcs: ["mysystemserverclasspathlib.java"],
9968 apex_available: ["myapex"],
9969 compile_dex: true,
9970 min_sdk_version: "32",
9971 unsafe_ignore_missing_latest_api: true,
9972 static_libs: ["util"],
9973 }
9974
9975 java_library {
9976 name: "util",
9977 srcs: ["a.java"],
9978 apex_available: ["myapex"],
9979 min_sdk_version: "31",
9980 static_libs: ["another_util"],
9981 }
9982
9983 java_library {
9984 name: "another_util",
9985 srcs: ["a.java"],
9986 min_sdk_version: "31",
9987 apex_available: ["myapex"],
9988 }
9989 `)
9990 })
9991
9992 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Priyanka Advani (xWF)33b3a632024-08-28 23:10:29 +00009993 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
satayev758968a2021-12-06 11:42:40 +00009994 RunTestWithBp(t, `
9995 apex {
9996 name: "myapex",
9997 key: "myapex.key",
9998 bootclasspath_fragments: ["mybootclasspathfragment"],
9999 min_sdk_version: "30",
10000 updatable: false,
10001 }
10002
10003 apex_key {
10004 name: "myapex.key",
10005 public_key: "testkey.avbpubkey",
10006 private_key: "testkey.pem",
10007 }
10008
10009 bootclasspath_fragment {
10010 name: "mybootclasspathfragment",
10011 contents: ["mybootclasspathlib"],
10012 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010013 hidden_api: {
10014 split_packages: ["*"],
10015 },
satayev758968a2021-12-06 11:42:40 +000010016 }
10017
10018 java_sdk_library {
10019 name: "mybootclasspathlib",
10020 srcs: ["mybootclasspathlib.java"],
10021 apex_available: ["myapex"],
10022 compile_dex: true,
10023 unsafe_ignore_missing_latest_api: true,
10024 }
10025 `)
10026 })
10027
10028 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
10029 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10030 RunTestWithBp(t, `
10031 apex {
10032 name: "myapex",
10033 key: "myapex.key",
10034 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10035 min_sdk_version: "30",
10036 updatable: false,
10037 }
10038
10039 apex_key {
10040 name: "myapex.key",
10041 public_key: "testkey.avbpubkey",
10042 private_key: "testkey.pem",
10043 }
10044
10045 systemserverclasspath_fragment {
10046 name: "mysystemserverclasspathfragment",
10047 contents: ["mysystemserverclasspathlib"],
10048 apex_available: ["myapex"],
10049 }
10050
10051 java_sdk_library {
10052 name: "mysystemserverclasspathlib",
10053 srcs: ["mysystemserverclasspathlib.java"],
10054 apex_available: ["myapex"],
10055 compile_dex: true,
10056 unsafe_ignore_missing_latest_api: true,
10057 }
10058 `)
10059 })
10060}
10061
Jiakai Zhang6decef92022-01-12 17:56:19 +000010062// Verifies that the APEX depends on all the Make modules in the list.
10063func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10064 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10065 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010066 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010067 }
10068}
10069
10070// Verifies that the APEX does not depend on any of the Make modules in the list.
10071func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10072 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10073 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010074 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010075 }
10076}
10077
Cole Faust24e25c02024-01-19 14:12:17 -080010078func TestApexStrictUpdtabilityLint(t *testing.T) {
10079 bpTemplate := `
10080 apex {
10081 name: "myapex",
10082 key: "myapex.key",
10083 java_libs: ["myjavalib"],
10084 updatable: %v,
10085 min_sdk_version: "29",
10086 }
10087 apex_key {
10088 name: "myapex.key",
10089 }
10090 java_library {
10091 name: "myjavalib",
10092 srcs: ["MyClass.java"],
10093 apex_available: [ "myapex" ],
10094 lint: {
10095 strict_updatability_linting: %v,
10096 %s
10097 },
10098 sdk_version: "current",
10099 min_sdk_version: "29",
10100 }
10101 `
10102 fs := android.MockFS{
10103 "lint-baseline.xml": nil,
10104 }
10105
10106 testCases := []struct {
10107 testCaseName string
10108 apexUpdatable bool
10109 javaStrictUpdtabilityLint bool
10110 lintFileExists bool
10111 disallowedFlagExpected bool
10112 }{
10113 {
10114 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10115 apexUpdatable: true,
10116 javaStrictUpdtabilityLint: true,
10117 lintFileExists: false,
10118 disallowedFlagExpected: false,
10119 },
10120 {
10121 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10122 apexUpdatable: false,
10123 javaStrictUpdtabilityLint: false,
10124 lintFileExists: true,
10125 disallowedFlagExpected: false,
10126 },
10127 {
10128 testCaseName: "non-updatable apex respects strict updatability of javalib",
10129 apexUpdatable: false,
10130 javaStrictUpdtabilityLint: true,
10131 lintFileExists: true,
10132 disallowedFlagExpected: true,
10133 },
10134 {
10135 testCaseName: "updatable apex sets strict updatability of javalib to true",
10136 apexUpdatable: true,
10137 javaStrictUpdtabilityLint: false, // will be set to true by mutator
10138 lintFileExists: true,
10139 disallowedFlagExpected: true,
10140 },
10141 }
10142
10143 for _, testCase := range testCases {
10144 fixtures := []android.FixturePreparer{}
10145 baselineProperty := ""
10146 if testCase.lintFileExists {
10147 fixtures = append(fixtures, fs.AddToFixture())
10148 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10149 }
10150 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
10151
10152 result := testApex(t, bp, fixtures...)
10153 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10154 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10155 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
10156
10157 if disallowedFlagActual != testCase.disallowedFlagExpected {
10158 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10159 }
10160 }
10161}
10162
10163func TestUpdatabilityLintSkipLibcore(t *testing.T) {
10164 bp := `
10165 apex {
10166 name: "myapex",
10167 key: "myapex.key",
10168 java_libs: ["myjavalib"],
10169 updatable: true,
10170 min_sdk_version: "29",
10171 }
10172 apex_key {
10173 name: "myapex.key",
10174 }
10175 java_library {
10176 name: "myjavalib",
10177 srcs: ["MyClass.java"],
10178 apex_available: [ "myapex" ],
10179 sdk_version: "current",
10180 min_sdk_version: "29",
10181 lint: {
10182 baseline_filename: "lint-baseline.xml",
10183 }
10184 }
10185 `
10186
10187 testCases := []struct {
10188 testCaseName string
10189 moduleDirectory string
10190 disallowedFlagExpected bool
10191 }{
10192 {
10193 testCaseName: "lintable module defined outside libcore",
10194 moduleDirectory: "",
10195 disallowedFlagExpected: true,
10196 },
10197 {
10198 testCaseName: "lintable module defined in libcore root directory",
10199 moduleDirectory: "libcore/",
10200 disallowedFlagExpected: false,
10201 },
10202 {
10203 testCaseName: "lintable module defined in libcore child directory",
10204 moduleDirectory: "libcore/childdir/",
10205 disallowedFlagExpected: true,
10206 },
10207 }
10208
10209 for _, testCase := range testCases {
10210 lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
10211 bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
10212 result := testApex(t, "", lintFileCreator, bpFileCreator)
10213 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10214 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10215 cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
10216 disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
10217
10218 if disallowedFlagActual != testCase.disallowedFlagExpected {
10219 t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
10220 }
10221 }
10222}
10223
10224// checks transtive deps of an apex coming from bootclasspath_fragment
10225func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
10226 bp := `
10227 apex {
10228 name: "myapex",
10229 key: "myapex.key",
10230 bootclasspath_fragments: ["mybootclasspathfragment"],
10231 updatable: true,
10232 min_sdk_version: "29",
10233 }
10234 apex_key {
10235 name: "myapex.key",
10236 }
10237 bootclasspath_fragment {
10238 name: "mybootclasspathfragment",
10239 contents: ["myjavalib"],
10240 apex_available: ["myapex"],
10241 hidden_api: {
10242 split_packages: ["*"],
10243 },
10244 }
10245 java_library {
10246 name: "myjavalib",
10247 srcs: ["MyClass.java"],
10248 apex_available: [ "myapex" ],
10249 sdk_version: "current",
10250 min_sdk_version: "29",
10251 compile_dex: true,
10252 lint: {
10253 baseline_filename: "lint-baseline.xml",
10254 }
10255 }
10256 `
10257 fs := android.MockFS{
10258 "lint-baseline.xml": nil,
10259 }
10260
10261 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
10262 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10263 sboxProto := android.RuleBuilderSboxProtoForTests(t, result, myjavalib.Output("lint.sbox.textproto"))
10264 if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
10265 t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
10266 }
10267}
Spandan Das66773252022-01-15 00:23:18 +000010268
Jihoon Kang784c0052024-06-25 22:15:39 +000010269func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
10270 bp := `
10271 apex {
10272 name: "myapex",
10273 key: "myapex.key",
10274 bootclasspath_fragments: ["mybootclasspathfragment"],
10275 min_sdk_version: "29",
10276 }
10277 apex_key {
10278 name: "myapex.key",
10279 }
10280 bootclasspath_fragment {
10281 name: "mybootclasspathfragment",
10282 contents: ["foo"],
10283 apex_available: ["myapex"],
10284 hidden_api: {
10285 split_packages: ["*"],
10286 },
10287 }
10288 java_sdk_library {
10289 name: "foo",
10290 srcs: ["MyClass.java"],
10291 apex_available: [ "myapex" ],
10292 sdk_version: "current",
10293 min_sdk_version: "29",
10294 compile_dex: true,
10295 }
10296 `
10297 fs := android.MockFS{
10298 "lint-baseline.xml": nil,
10299 }
10300
10301 result := android.GroupFixturePreparers(
10302 prepareForApexTest,
10303 java.PrepareForTestWithJavaSdkLibraryFiles,
10304 java.PrepareForTestWithJacocoInstrumentation,
10305 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010306 android.FixtureMergeMockFs(fs),
10307 ).RunTestWithBp(t, bp)
10308
10309 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10310 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10311 android.AssertStringDoesContain(t,
10312 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10313 lintReportInputs, "foo.impl")
10314}
10315
Spandan Das42e89502022-05-06 22:12:55 +000010316// updatable apexes should propagate updatable=true to its apps
10317func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
10318 bp := `
10319 apex {
10320 name: "myapex",
10321 key: "myapex.key",
10322 updatable: %v,
10323 apps: [
10324 "myapp",
10325 ],
10326 min_sdk_version: "30",
10327 }
10328 apex_key {
10329 name: "myapex.key",
10330 }
10331 android_app {
10332 name: "myapp",
10333 updatable: %v,
10334 apex_available: [
10335 "myapex",
10336 ],
10337 sdk_version: "current",
10338 min_sdk_version: "30",
10339 }
10340 `
10341 testCases := []struct {
10342 name string
10343 apex_is_updatable_bp bool
10344 app_is_updatable_bp bool
10345 app_is_updatable_expected bool
10346 }{
10347 {
10348 name: "Non-updatable apex respects updatable property of non-updatable app",
10349 apex_is_updatable_bp: false,
10350 app_is_updatable_bp: false,
10351 app_is_updatable_expected: false,
10352 },
10353 {
10354 name: "Non-updatable apex respects updatable property of updatable app",
10355 apex_is_updatable_bp: false,
10356 app_is_updatable_bp: true,
10357 app_is_updatable_expected: true,
10358 },
10359 {
10360 name: "Updatable apex respects updatable property of updatable app",
10361 apex_is_updatable_bp: true,
10362 app_is_updatable_bp: true,
10363 app_is_updatable_expected: true,
10364 },
10365 {
10366 name: "Updatable apex sets updatable=true on non-updatable app",
10367 apex_is_updatable_bp: true,
10368 app_is_updatable_bp: false,
10369 app_is_updatable_expected: true,
10370 },
10371 }
10372 for _, testCase := range testCases {
10373 result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
10374 myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
10375 android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
10376 }
10377}
10378
Kiyoung Kim487689e2022-07-26 09:48:22 +090010379func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10380 bp := `
10381 apex {
10382 name: "myapex",
10383 key: "myapex.key",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010384 native_shared_libs: ["libbaz"],
10385 binaries: ["binfoo"],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010386 min_sdk_version: "29",
10387 }
10388 apex_key {
10389 name: "myapex.key",
10390 }
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010391 cc_binary {
10392 name: "binfoo",
10393 shared_libs: ["libbar", "libbaz", "libqux",],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010394 apex_available: ["myapex"],
10395 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010396 recovery_available: false,
10397 }
10398 cc_library {
10399 name: "libbar",
10400 srcs: ["libbar.cc"],
10401 stubs: {
10402 symbol_file: "libbar.map.txt",
10403 versions: [
10404 "29",
10405 ],
10406 },
10407 }
10408 cc_library {
10409 name: "libbaz",
10410 srcs: ["libbaz.cc"],
10411 apex_available: ["myapex"],
10412 min_sdk_version: "29",
10413 stubs: {
10414 symbol_file: "libbaz.map.txt",
10415 versions: [
10416 "29",
10417 ],
10418 },
Kiyoung Kim487689e2022-07-26 09:48:22 +090010419 }
10420 cc_api_library {
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010421 name: "libbar",
10422 src: "libbar_stub.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010423 min_sdk_version: "29",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010424 variants: ["apex.29"],
10425 }
10426 cc_api_variant {
10427 name: "libbar",
10428 variant: "apex",
10429 version: "29",
10430 src: "libbar_apex_29.so",
10431 }
10432 cc_api_library {
10433 name: "libbaz",
10434 src: "libbaz_stub.so",
10435 min_sdk_version: "29",
10436 variants: ["apex.29"],
10437 }
10438 cc_api_variant {
10439 name: "libbaz",
10440 variant: "apex",
10441 version: "29",
10442 src: "libbaz_apex_29.so",
10443 }
10444 cc_api_library {
10445 name: "libqux",
10446 src: "libqux_stub.so",
10447 min_sdk_version: "29",
10448 variants: ["apex.29"],
10449 }
10450 cc_api_variant {
10451 name: "libqux",
10452 variant: "apex",
10453 version: "29",
10454 src: "libqux_apex_29.so",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010455 }
10456 api_imports {
10457 name: "api_imports",
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010458 apex_shared_libs: [
10459 "libbar",
10460 "libbaz",
10461 "libqux",
Kiyoung Kim487689e2022-07-26 09:48:22 +090010462 ],
Kiyoung Kim487689e2022-07-26 09:48:22 +090010463 }
10464 `
10465 result := testApex(t, bp)
10466
10467 hasDep := func(m android.Module, wantDep android.Module) bool {
10468 t.Helper()
10469 var found bool
10470 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10471 if dep == wantDep {
10472 found = true
10473 }
10474 })
10475 return found
10476 }
10477
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010478 // Library defines stubs and cc_api_library should be used with cc_api_library
10479 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
10480 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10481 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
Kiyoung Kim487689e2022-07-26 09:48:22 +090010482
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010483 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10484 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
Kiyoung Kim487689e2022-07-26 09:48:22 +090010485
Kiyoung Kim76b06f32023-02-06 22:08:13 +090010486 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
10487 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10488 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10489 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
10490
10491 // Library defined in the same APEX should be linked with original definition instead of cc_api_library
10492 libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
10493 libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
10494 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
10495 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
10496
10497 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
10498 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
10499 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
10500
10501 // cc_api_library defined without original library should be linked with cc_api_library
10502 libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
10503 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
10504 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
10505}
10506
10507func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
10508 bp := `
10509 apex {
10510 name: "myapex",
10511 key: "myapex.key",
10512 native_shared_libs: ["libbar"],
10513 min_sdk_version: "29",
10514 }
10515 apex_key {
10516 name: "myapex.key",
10517 }
10518 cc_binary {
10519 name: "binfoo",
10520 shared_libs: ["libbar"],
10521 recovery_available: false,
10522 }
10523 cc_library {
10524 name: "libbar",
10525 srcs: ["libbar.cc"],
10526 apex_available: ["myapex"],
10527 min_sdk_version: "29",
10528 stubs: {
10529 symbol_file: "libbar.map.txt",
10530 versions: [
10531 "29",
10532 ],
10533 },
10534 }
10535 cc_api_library {
10536 name: "libbar",
10537 src: "libbar_stub.so",
10538 variants: ["apex.29"],
10539 }
10540 cc_api_variant {
10541 name: "libbar",
10542 variant: "apex",
10543 version: "29",
10544 src: "libbar_apex_29.so",
10545 }
10546 api_imports {
10547 name: "api_imports",
10548 apex_shared_libs: [
10549 "libbar",
10550 ],
10551 }
10552 `
10553
10554 result := testApex(t, bp)
10555
10556 hasDep := func(m android.Module, wantDep android.Module) bool {
10557 t.Helper()
10558 var found bool
10559 result.VisitDirectDeps(m, func(dep blueprint.Module) {
10560 if dep == wantDep {
10561 found = true
10562 }
10563 })
10564 return found
10565 }
10566
10567 // Library defines stubs and cc_api_library should be used with cc_api_library
10568 binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
10569 libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
10570 libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
10571
10572 android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
10573 android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
10574
10575 binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
10576 android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
10577 android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
10578 android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
Kiyoung Kim487689e2022-07-26 09:48:22 +090010579}
Dennis Shend4f5d932023-01-31 20:27:21 +000010580
10581func TestTrimmedApex(t *testing.T) {
10582 bp := `
10583 apex {
10584 name: "myapex",
10585 key: "myapex.key",
10586 native_shared_libs: ["libfoo","libbaz"],
10587 min_sdk_version: "29",
10588 trim_against: "mydcla",
10589 }
10590 apex {
10591 name: "mydcla",
10592 key: "myapex.key",
10593 native_shared_libs: ["libfoo","libbar"],
10594 min_sdk_version: "29",
10595 file_contexts: ":myapex-file_contexts",
10596 dynamic_common_lib_apex: true,
10597 }
10598 apex_key {
10599 name: "myapex.key",
10600 }
10601 cc_library {
10602 name: "libfoo",
10603 shared_libs: ["libc"],
10604 apex_available: ["myapex","mydcla"],
10605 min_sdk_version: "29",
10606 }
10607 cc_library {
10608 name: "libbar",
10609 shared_libs: ["libc"],
10610 apex_available: ["myapex","mydcla"],
10611 min_sdk_version: "29",
10612 }
10613 cc_library {
10614 name: "libbaz",
10615 shared_libs: ["libc"],
10616 apex_available: ["myapex","mydcla"],
10617 min_sdk_version: "29",
10618 }
10619 cc_api_library {
10620 name: "libc",
10621 src: "libc.so",
10622 min_sdk_version: "29",
10623 recovery_available: true,
Ivan Lozanoadd122a2023-07-13 11:01:41 -040010624 vendor_available: true,
Justin Yunaf1fde42023-09-27 16:22:10 +090010625 product_available: true,
Dennis Shend4f5d932023-01-31 20:27:21 +000010626 }
10627 api_imports {
10628 name: "api_imports",
10629 shared_libs: [
10630 "libc",
10631 ],
10632 header_libs: [],
10633 }
10634 `
10635 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010636 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010637 apexRule := module.MaybeRule("apexRule")
10638 if apexRule.Rule == nil {
10639 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10640 }
10641
10642 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010643 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010644 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10645 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10646 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10647 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10648}
Jingwen Chendea7a642023-03-28 11:30:50 +000010649
10650func TestCannedFsConfig(t *testing.T) {
10651 ctx := testApex(t, `
10652 apex {
10653 name: "myapex",
10654 key: "myapex.key",
10655 updatable: false,
10656 }
10657
10658 apex_key {
10659 name: "myapex.key",
10660 public_key: "testkey.avbpubkey",
10661 private_key: "testkey.pem",
10662 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010663 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010664 generateFsRule := mod.Rule("generateFsConfig")
10665 cmd := generateFsRule.RuleParams.Command
10666
10667 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10668}
10669
10670func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
10671 ctx := testApex(t, `
10672 apex {
10673 name: "myapex",
10674 key: "myapex.key",
10675 canned_fs_config: "my_config",
10676 updatable: false,
10677 }
10678
10679 apex_key {
10680 name: "myapex.key",
10681 public_key: "testkey.avbpubkey",
10682 private_key: "testkey.pem",
10683 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010684 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010685 generateFsRule := mod.Rule("generateFsConfig")
10686 cmd := generateFsRule.RuleParams.Command
10687
10688 // Ensure that canned_fs_config has "cat my_config" at the end
10689 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10690}
Spandan Das20fce2d2023-04-12 17:21:39 +000010691
10692func TestStubLibrariesMultipleApexViolation(t *testing.T) {
10693 testCases := []struct {
10694 desc string
10695 hasStubs bool
10696 apexAvailable string
10697 expectedError string
10698 }{
10699 {
10700 desc: "non-stub library can have multiple apex_available",
10701 hasStubs: false,
10702 apexAvailable: `["myapex", "otherapex"]`,
10703 },
10704 {
10705 desc: "stub library should not be available to anyapex",
10706 hasStubs: true,
10707 apexAvailable: `["//apex_available:anyapex"]`,
10708 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10709 },
10710 {
10711 desc: "stub library should not be available to multiple apexes",
10712 hasStubs: true,
10713 apexAvailable: `["myapex", "otherapex"]`,
10714 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10715 },
10716 {
10717 desc: "stub library can be available to a core apex and a test apex",
10718 hasStubs: true,
10719 apexAvailable: `["myapex", "test_myapex"]`,
10720 },
10721 }
10722 bpTemplate := `
10723 cc_library {
10724 name: "libfoo",
10725 %v
10726 apex_available: %v,
10727 }
10728 apex {
10729 name: "myapex",
10730 key: "apex.key",
10731 updatable: false,
10732 native_shared_libs: ["libfoo"],
10733 }
10734 apex {
10735 name: "otherapex",
10736 key: "apex.key",
10737 updatable: false,
10738 }
10739 apex_test {
10740 name: "test_myapex",
10741 key: "apex.key",
10742 updatable: false,
10743 native_shared_libs: ["libfoo"],
10744 }
10745 apex_key {
10746 name: "apex.key",
10747 }
10748 `
10749 for _, tc := range testCases {
10750 stubs := ""
10751 if tc.hasStubs {
10752 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10753 }
10754 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10755 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10756 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10757 })
10758 if tc.expectedError == "" {
10759 testApex(t, bp, mockFsFixturePreparer)
10760 } else {
10761 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10762 }
10763 }
10764}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010765
10766func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
10767 context := android.GroupFixturePreparers(
10768 android.PrepareForIntegrationTestWithAndroid,
10769 cc.PrepareForIntegrationTestWithCc,
10770 PrepareForTestWithApexBuildComponents,
10771 prepareForTestWithMyapex,
10772 filesystem.PrepareForTestWithFilesystemBuildComponents,
10773 )
10774 result := context.RunTestWithBp(t, `
10775 android_system_image {
10776 name: "myfilesystem",
10777 deps: [
10778 "libfoo",
10779 ],
10780 linker_config_src: "linker.config.json",
10781 }
10782
10783 cc_library {
10784 name: "libfoo",
10785 shared_libs: [
10786 "libbar",
10787 ],
10788 stl: "none",
10789 }
10790
10791 cc_library {
10792 name: "libbar",
10793 stl: "none",
10794 apex_available: ["myapex"],
10795 }
10796
10797 apex {
10798 name: "myapex",
10799 native_shared_libs: ["libbar"],
10800 key: "myapex.key",
10801 updatable: false,
10802 }
10803
10804 apex_key {
10805 name: "myapex.key",
10806 public_key: "testkey.avbpubkey",
10807 private_key: "testkey.pem",
10808 }
10809 `)
10810
Cole Faust3b806d32024-03-11 15:15:03 -070010811 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010812 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10813 inputs.Strings(),
10814 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10815}
Yu Liueae7b362023-11-16 17:05:47 -080010816
10817var apex_default_bp = `
10818 apex_key {
10819 name: "myapex.key",
10820 public_key: "testkey.avbpubkey",
10821 private_key: "testkey.pem",
10822 }
10823
10824 filegroup {
10825 name: "myapex.manifest",
10826 srcs: ["apex_manifest.json"],
10827 }
10828
10829 filegroup {
10830 name: "myapex.androidmanifest",
10831 srcs: ["AndroidManifest.xml"],
10832 }
10833`
10834
10835func TestAconfigFilesJavaDeps(t *testing.T) {
10836 ctx := testApex(t, apex_default_bp+`
10837 apex {
10838 name: "myapex",
10839 manifest: ":myapex.manifest",
10840 androidManifest: ":myapex.androidmanifest",
10841 key: "myapex.key",
10842 java_libs: [
10843 "my_java_library_foo",
10844 "my_java_library_bar",
10845 ],
10846 updatable: false,
10847 }
10848
10849 java_library {
10850 name: "my_java_library_foo",
10851 srcs: ["foo/bar/MyClass.java"],
10852 sdk_version: "none",
10853 system_modules: "none",
10854 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010855 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010856 "myapex",
10857 ],
10858 }
10859
10860 java_library {
10861 name: "my_java_library_bar",
10862 srcs: ["foo/bar/MyClass.java"],
10863 sdk_version: "none",
10864 system_modules: "none",
10865 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010866 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010867 "myapex",
10868 ],
10869 }
10870
10871 aconfig_declarations {
10872 name: "my_aconfig_declarations_foo",
10873 package: "com.example.package",
10874 container: "myapex",
10875 srcs: ["foo.aconfig"],
10876 }
10877
10878 java_aconfig_library {
10879 name: "my_java_aconfig_library_foo",
10880 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010881 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010882 "myapex",
10883 ],
10884 }
10885
10886 aconfig_declarations {
10887 name: "my_aconfig_declarations_bar",
10888 package: "com.example.package",
10889 container: "myapex",
10890 srcs: ["bar.aconfig"],
10891 }
10892
10893 java_aconfig_library {
10894 name: "my_java_aconfig_library_bar",
10895 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010896 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010897 "myapex",
10898 ],
10899 }
10900 `)
10901
10902 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10903 s := mod.Rule("apexRule").Args["copy_commands"]
10904 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000010905 if len(copyCmds) != 8 {
Yu Liueae7b362023-11-16 17:05:47 -080010906 t.Fatalf("Expected 5 commands, got %d in:\n%s", len(copyCmds), s)
10907 }
10908
Yu Liuab31c822024-02-28 22:21:31 +000010909 ensureMatches(t, copyCmds[4], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
10910 ensureMatches(t, copyCmds[5], "^cp -f .*/package.map .*/image.apex/etc$")
10911 ensureMatches(t, copyCmds[6], "^cp -f .*/flag.map .*/image.apex/etc$")
10912 ensureMatches(t, copyCmds[7], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080010913
Yu Liubba555e2024-02-17 00:36:42 +000010914 inputs := []string{
10915 "my_aconfig_declarations_foo/intermediate.pb",
10916 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010917 }
Yu Liubba555e2024-02-17 00:36:42 +000010918 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10919 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10920 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10921 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080010922}
10923
10924func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
10925 ctx := testApex(t, apex_default_bp+`
10926 apex {
10927 name: "myapex",
10928 manifest: ":myapex.manifest",
10929 androidManifest: ":myapex.androidmanifest",
10930 key: "myapex.key",
10931 java_libs: [
10932 "my_java_library_foo",
10933 ],
10934 native_shared_libs: [
10935 "my_cc_library_bar",
10936 ],
10937 binaries: [
10938 "my_cc_binary_baz",
10939 ],
10940 updatable: false,
10941 }
10942
10943 java_library {
10944 name: "my_java_library_foo",
10945 srcs: ["foo/bar/MyClass.java"],
10946 sdk_version: "none",
10947 system_modules: "none",
10948 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010949 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010950 "myapex",
10951 ],
10952 }
10953
10954 cc_library {
10955 name: "my_cc_library_bar",
10956 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010957 static_libs: [
10958 "my_cc_aconfig_library_bar",
10959 "my_cc_aconfig_library_baz",
10960 ],
Yu Liueae7b362023-11-16 17:05:47 -080010961 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010962 "myapex",
10963 ],
10964 }
10965
10966 cc_binary {
10967 name: "my_cc_binary_baz",
10968 srcs: ["foo/bar/MyClass.cc"],
10969 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010970 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010971 "myapex",
10972 ],
10973 }
10974
10975 aconfig_declarations {
10976 name: "my_aconfig_declarations_foo",
10977 package: "com.example.package",
10978 container: "myapex",
10979 srcs: ["foo.aconfig"],
10980 }
10981
10982 java_aconfig_library {
10983 name: "my_java_aconfig_library_foo",
10984 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010985 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010986 "myapex",
10987 ],
10988 }
10989
10990 aconfig_declarations {
10991 name: "my_aconfig_declarations_bar",
10992 package: "com.example.package",
10993 container: "myapex",
10994 srcs: ["bar.aconfig"],
10995 }
10996
10997 cc_aconfig_library {
10998 name: "my_cc_aconfig_library_bar",
10999 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011000 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011001 "myapex",
11002 ],
11003 }
11004
11005 aconfig_declarations {
11006 name: "my_aconfig_declarations_baz",
11007 package: "com.example.package",
11008 container: "myapex",
11009 srcs: ["baz.aconfig"],
11010 }
11011
11012 cc_aconfig_library {
11013 name: "my_cc_aconfig_library_baz",
11014 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080011015 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011016 "myapex",
11017 ],
11018 }
11019
11020 cc_library {
11021 name: "server_configurable_flags",
11022 srcs: ["server_configurable_flags.cc"],
11023 }
Ted Bauerf0f18592024-04-23 18:25:26 +000011024 cc_library {
11025 name: "libbase",
11026 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000011027 apex_available: [
11028 "myapex",
11029 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000011030 }
11031 cc_library {
11032 name: "libaconfig_storage_read_api_cc",
11033 srcs: ["libaconfig_storage_read_api_cc.cc"],
11034 }
Yu Liueae7b362023-11-16 17:05:47 -080011035 `)
11036
11037 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11038 s := mod.Rule("apexRule").Args["copy_commands"]
11039 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Yu Liubba555e2024-02-17 00:36:42 +000011040 if len(copyCmds) != 12 {
11041 t.Fatalf("Expected 12 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080011042 }
11043
Yu Liuab31c822024-02-28 22:21:31 +000011044 ensureMatches(t, copyCmds[8], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11045 ensureMatches(t, copyCmds[9], "^cp -f .*/package.map .*/image.apex/etc$")
11046 ensureMatches(t, copyCmds[10], "^cp -f .*/flag.map .*/image.apex/etc$")
11047 ensureMatches(t, copyCmds[11], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liueae7b362023-11-16 17:05:47 -080011048
Yu Liubba555e2024-02-17 00:36:42 +000011049 inputs := []string{
11050 "my_aconfig_declarations_foo/intermediate.pb",
11051 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
11052 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080011053 }
Yu Liubba555e2024-02-17 00:36:42 +000011054 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11055 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11056 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11057 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Yu Liueae7b362023-11-16 17:05:47 -080011058}
11059
Yu Liucec0e412023-11-30 16:45:50 -080011060func TestAconfigFilesRustDeps(t *testing.T) {
11061 ctx := testApex(t, apex_default_bp+`
11062 apex {
11063 name: "myapex",
11064 manifest: ":myapex.manifest",
11065 androidManifest: ":myapex.androidmanifest",
11066 key: "myapex.key",
11067 native_shared_libs: [
11068 "libmy_rust_library",
11069 ],
11070 binaries: [
11071 "my_rust_binary",
11072 ],
11073 rust_dyn_libs: [
11074 "libmy_rust_dylib",
11075 ],
11076 updatable: false,
11077 }
11078
11079 rust_library {
11080 name: "libflags_rust", // test mock
11081 crate_name: "flags_rust",
11082 srcs: ["lib.rs"],
11083 apex_available: [
11084 "myapex",
11085 ],
11086 }
11087
11088 rust_library {
11089 name: "liblazy_static", // test mock
11090 crate_name: "lazy_static",
11091 srcs: ["src/lib.rs"],
11092 apex_available: [
11093 "myapex",
11094 ],
11095 }
11096
Ted Bauer02d475c2024-03-27 20:56:26 +000011097 rust_library {
11098 name: "libaconfig_storage_read_api", // test mock
11099 crate_name: "aconfig_storage_read_api",
11100 srcs: ["src/lib.rs"],
11101 apex_available: [
11102 "myapex",
11103 ],
11104 }
11105
Ted Bauer6ef40db2024-03-29 14:04:10 +000011106 rust_library {
11107 name: "liblogger", // test mock
11108 crate_name: "logger",
11109 srcs: ["src/lib.rs"],
11110 apex_available: [
11111 "myapex",
11112 ],
11113 }
11114
11115 rust_library {
11116 name: "liblog_rust", // test mock
11117 crate_name: "log_rust",
11118 srcs: ["src/lib.rs"],
11119 apex_available: [
11120 "myapex",
11121 ],
11122 }
11123
Yu Liucec0e412023-11-30 16:45:50 -080011124 rust_ffi_shared {
11125 name: "libmy_rust_library",
11126 srcs: ["src/lib.rs"],
11127 rustlibs: ["libmy_rust_aconfig_library_foo"],
11128 crate_name: "my_rust_library",
11129 apex_available: [
11130 "myapex",
11131 ],
11132 }
11133
11134 rust_library_dylib {
11135 name: "libmy_rust_dylib",
11136 srcs: ["foo/bar/MyClass.rs"],
11137 rustlibs: ["libmy_rust_aconfig_library_bar"],
11138 crate_name: "my_rust_dylib",
11139 apex_available: [
11140 "myapex",
11141 ],
11142 }
11143
11144 rust_binary {
11145 name: "my_rust_binary",
11146 srcs: ["foo/bar/MyClass.rs"],
11147 rustlibs: [
11148 "libmy_rust_aconfig_library_baz",
11149 "libmy_rust_dylib",
11150 ],
11151 apex_available: [
11152 "myapex",
11153 ],
11154 }
11155
11156 aconfig_declarations {
11157 name: "my_aconfig_declarations_foo",
11158 package: "com.example.package",
11159 container: "myapex",
11160 srcs: ["foo.aconfig"],
11161 }
11162
11163 aconfig_declarations {
11164 name: "my_aconfig_declarations_bar",
11165 package: "com.example.package",
11166 container: "myapex",
11167 srcs: ["bar.aconfig"],
11168 }
11169
11170 aconfig_declarations {
11171 name: "my_aconfig_declarations_baz",
11172 package: "com.example.package",
11173 container: "myapex",
11174 srcs: ["baz.aconfig"],
11175 }
11176
11177 rust_aconfig_library {
11178 name: "libmy_rust_aconfig_library_foo",
11179 aconfig_declarations: "my_aconfig_declarations_foo",
11180 crate_name: "my_rust_aconfig_library_foo",
11181 apex_available: [
11182 "myapex",
11183 ],
11184 }
11185
11186 rust_aconfig_library {
11187 name: "libmy_rust_aconfig_library_bar",
11188 aconfig_declarations: "my_aconfig_declarations_bar",
11189 crate_name: "my_rust_aconfig_library_bar",
11190 apex_available: [
11191 "myapex",
11192 ],
11193 }
11194
11195 rust_aconfig_library {
11196 name: "libmy_rust_aconfig_library_baz",
11197 aconfig_declarations: "my_aconfig_declarations_baz",
11198 crate_name: "my_rust_aconfig_library_baz",
11199 apex_available: [
11200 "myapex",
11201 ],
11202 }
11203 `)
11204
11205 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11206 s := mod.Rule("apexRule").Args["copy_commands"]
11207 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ted Bauer6ef40db2024-03-29 14:04:10 +000011208 if len(copyCmds) != 32 {
Ted Bauer02d475c2024-03-27 20:56:26 +000011209 t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011210 }
11211
Ted Bauer6ef40db2024-03-29 14:04:10 +000011212 ensureMatches(t, copyCmds[28], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$")
11213 ensureMatches(t, copyCmds[29], "^cp -f .*/package.map .*/image.apex/etc$")
11214 ensureMatches(t, copyCmds[30], "^cp -f .*/flag.map .*/image.apex/etc$")
11215 ensureMatches(t, copyCmds[31], "^cp -f .*/flag.val .*/image.apex/etc$")
Yu Liucec0e412023-11-30 16:45:50 -080011216
Yu Liubba555e2024-02-17 00:36:42 +000011217 inputs := []string{
11218 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011219 "my_aconfig_declarations_bar/intermediate.pb",
11220 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011221 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11222 }
11223 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11224 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11225 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11226 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
11227}
11228
11229func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11230 aconfigRule := mod.Description(desc)
11231 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011232 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011233 if len(aconfigArgs) != len(inputs) {
11234 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011235 }
Yu Liucec0e412023-11-30 16:45:50 -080011236
Yu Liubba555e2024-02-17 00:36:42 +000011237 ensureEquals(t, container, aconfigRule.Args["container"])
11238 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11239
11240 buildParams := aconfigRule.BuildParams
11241 for _, input := range inputs {
11242 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11243 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011244 }
Yu Liubba555e2024-02-17 00:36:42 +000011245
11246 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011247}
11248
Yu Liueae7b362023-11-16 17:05:47 -080011249func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
11250 ctx := testApex(t, apex_default_bp+`
11251 apex {
11252 name: "myapex",
11253 manifest: ":myapex.manifest",
11254 androidManifest: ":myapex.androidmanifest",
11255 key: "myapex.key",
11256 java_libs: [
11257 "my_java_library_foo",
11258 "other_java_library_bar",
11259 ],
11260 updatable: false,
11261 }
11262
11263 java_library {
11264 name: "my_java_library_foo",
11265 srcs: ["foo/bar/MyClass.java"],
11266 sdk_version: "none",
11267 system_modules: "none",
11268 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011269 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011270 "myapex",
11271 ],
11272 }
11273
11274 java_library {
11275 name: "other_java_library_bar",
11276 srcs: ["foo/bar/MyClass.java"],
11277 sdk_version: "none",
11278 system_modules: "none",
11279 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011280 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011281 "myapex",
11282 ],
11283 }
11284
11285 aconfig_declarations {
11286 name: "my_aconfig_declarations_foo",
11287 package: "com.example.package",
11288 container: "myapex",
11289 srcs: ["foo.aconfig"],
11290 }
11291
11292 java_aconfig_library {
11293 name: "my_java_aconfig_library_foo",
11294 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011295 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011296 "myapex",
11297 ],
11298 }
11299
11300 aconfig_declarations {
11301 name: "other_aconfig_declarations_bar",
11302 package: "com.example.package",
11303 container: "otherapex",
11304 srcs: ["bar.aconfig"],
11305 }
11306
11307 java_aconfig_library {
11308 name: "other_java_aconfig_library_bar",
11309 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011310 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011311 "myapex",
11312 ],
11313 }
11314 `)
11315
11316 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11317 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11318 s := " " + combineAconfigRule.Args["cache_files"]
11319 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11320 if len(aconfigArgs) != 1 {
11321 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11322 }
11323 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11324
11325 buildParams := combineAconfigRule.BuildParams
11326 if len(buildParams.Inputs) != 1 {
11327 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11328 }
11329 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11330 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11331}
11332
11333func TestAconfigFilesRemoveDuplicates(t *testing.T) {
11334 ctx := testApex(t, apex_default_bp+`
11335 apex {
11336 name: "myapex",
11337 manifest: ":myapex.manifest",
11338 androidManifest: ":myapex.androidmanifest",
11339 key: "myapex.key",
11340 java_libs: [
11341 "my_java_library_foo",
11342 "my_java_library_bar",
11343 ],
11344 updatable: false,
11345 }
11346
11347 java_library {
11348 name: "my_java_library_foo",
11349 srcs: ["foo/bar/MyClass.java"],
11350 sdk_version: "none",
11351 system_modules: "none",
11352 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011353 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011354 "myapex",
11355 ],
11356 }
11357
11358 java_library {
11359 name: "my_java_library_bar",
11360 srcs: ["foo/bar/MyClass.java"],
11361 sdk_version: "none",
11362 system_modules: "none",
11363 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011364 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011365 "myapex",
11366 ],
11367 }
11368
11369 aconfig_declarations {
11370 name: "my_aconfig_declarations_foo",
11371 package: "com.example.package",
11372 container: "myapex",
11373 srcs: ["foo.aconfig"],
11374 }
11375
11376 java_aconfig_library {
11377 name: "my_java_aconfig_library_foo",
11378 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011379 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011380 "myapex",
11381 ],
11382 }
11383
11384 java_aconfig_library {
11385 name: "my_java_aconfig_library_bar",
11386 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011387 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011388 "myapex",
11389 ],
11390 }
11391 `)
11392
11393 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11394 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11395 s := " " + combineAconfigRule.Args["cache_files"]
11396 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11397 if len(aconfigArgs) != 1 {
11398 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11399 }
11400 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11401
11402 buildParams := combineAconfigRule.BuildParams
11403 if len(buildParams.Inputs) != 1 {
11404 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11405 }
11406 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11407 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11408}
Spandan Das5be63332023-12-13 00:06:32 +000011409
11410// Test that the boot jars come from the _selected_ apex prebuilt
11411// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11412func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
11413 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11414 t.Helper()
11415 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11416 foundLibfooJar := false
11417 base := stem + ".jar"
11418 for _, output := range s.AllOutputs() {
11419 if filepath.Base(output) == base {
11420 foundLibfooJar = true
11421 buildRule := s.Output(output)
11422 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11423 }
11424 }
11425 if !foundLibfooJar {
11426 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11427 }
11428 }
11429
Spandan Das64c9e0c2023-12-20 20:13:34 +000011430 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11431 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11432 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11433 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11434 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11435 android.AssertStringMatches(t, "Could not find the correct boot dex jar in package check rule", bootJarsCheckRule.RuleParams.Command, "build/soong/scripts/check_boot_jars/package_allowed_list.txt.*"+expectedBootJar)
11436 }
11437
11438 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11439 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11440 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11441 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11442 }
11443
Spandan Das5be63332023-12-13 00:06:32 +000011444 bp := `
11445 // Source APEX.
11446
11447 java_library {
11448 name: "framework-foo",
11449 srcs: ["foo.java"],
11450 installable: true,
11451 apex_available: [
11452 "com.android.foo",
11453 ],
11454 }
11455
11456 bootclasspath_fragment {
11457 name: "foo-bootclasspath-fragment",
11458 contents: ["framework-foo"],
11459 apex_available: [
11460 "com.android.foo",
11461 ],
11462 hidden_api: {
11463 split_packages: ["*"],
11464 },
11465 }
11466
11467 apex_key {
11468 name: "com.android.foo.key",
11469 public_key: "com.android.foo.avbpubkey",
11470 private_key: "com.android.foo.pem",
11471 }
11472
11473 apex {
11474 name: "com.android.foo",
11475 key: "com.android.foo.key",
11476 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11477 updatable: false,
11478 }
11479
11480 // Prebuilt APEX.
11481
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011482 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011483 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011484 public: {
11485 jars: ["foo.jar"],
11486 },
Spandan Das5be63332023-12-13 00:06:32 +000011487 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011488 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011489 }
11490
11491 prebuilt_bootclasspath_fragment {
11492 name: "foo-bootclasspath-fragment",
11493 contents: ["framework-foo"],
11494 hidden_api: {
11495 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11496 metadata: "my-bootclasspath-fragment/metadata.csv",
11497 index: "my-bootclasspath-fragment/index.csv",
11498 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11499 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11500 },
11501 apex_available: [
11502 "com.android.foo",
11503 ],
11504 }
11505
11506 prebuilt_apex {
11507 name: "com.android.foo",
11508 apex_name: "com.android.foo",
11509 src: "com.android.foo-arm.apex",
11510 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11511 }
11512
11513 // Another Prebuilt ART APEX
11514 prebuilt_apex {
11515 name: "com.android.foo.v2",
11516 apex_name: "com.android.foo", // Used to determine the API domain
11517 src: "com.android.foo-arm.apex",
11518 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11519 }
11520
11521 // APEX contribution modules
11522
11523 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011524 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011525 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011526 contents: ["com.android.foo"],
11527 }
11528
11529 apex_contributions {
11530 name: "foo.prebuilt.contributions",
11531 api_domain: "com.android.foo",
11532 contents: ["prebuilt_com.android.foo"],
11533 }
11534
11535 apex_contributions {
11536 name: "foo.prebuilt.v2.contributions",
11537 api_domain: "com.android.foo",
11538 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011539 }
11540 `
11541
11542 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011543 desc string
11544 selectedApexContributions string
11545 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011546 }{
11547 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011548 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11549 selectedApexContributions: "foo.source.contributions",
11550 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011551 },
11552 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011553 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11554 selectedApexContributions: "foo.prebuilt.contributions",
11555 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011556 },
11557 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011558 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11559 selectedApexContributions: "foo.prebuilt.v2.contributions",
11560 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo.v2.deapexer/android_common/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011561 },
11562 }
11563
11564 fragment := java.ApexVariantReference{
11565 Apex: proptools.StringPtr("com.android.foo"),
11566 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11567 }
11568
11569 for _, tc := range testCases {
11570 preparer := android.GroupFixturePreparers(
11571 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11572 android.FixtureMergeMockFs(map[string][]byte{
11573 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11574 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011575 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11576 // file creation.
11577 java.FixtureConfigureBootJars("platform:foo"),
11578 android.FixtureModifyMockFS(func(fs android.MockFS) {
11579 fs["platform/Android.bp"] = []byte(`
11580 java_library {
11581 name: "foo",
11582 srcs: ["Test.java"],
11583 compile_dex: true,
11584 }
11585 `)
11586 fs["platform/Test.java"] = nil
11587 }),
11588
Colin Crossa66b4632024-08-08 15:50:47 -070011589 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011590 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011591 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011592 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011593 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11594 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011595 }
11596}
Spandan Das3576e762024-01-03 18:57:03 +000011597
11598// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11599// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11600func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Spandan Das3576e762024-01-03 18:57:03 +000011601 // for a mainline module family, check that only the flagged soong module is visible to make
11602 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11603 variation := func(moduleName string) string {
11604 ret := "android_common_com.android.foo"
11605 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011606 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011607 }
11608 return ret
11609 }
11610
11611 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11612 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11613
11614 for _, hiddenModuleName := range hiddenModuleNames {
11615 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11616 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11617
11618 }
11619 }
11620
11621 bp := `
11622 apex_key {
11623 name: "com.android.foo.key",
11624 public_key: "com.android.foo.avbpubkey",
11625 private_key: "com.android.foo.pem",
11626 }
11627
11628 // AOSP source apex
11629 apex {
11630 name: "com.android.foo",
11631 key: "com.android.foo.key",
11632 updatable: false,
11633 }
11634
11635 // Google source apex
11636 override_apex {
11637 name: "com.google.android.foo",
11638 base: "com.android.foo",
11639 key: "com.android.foo.key",
11640 }
11641
11642 // Prebuilt Google APEX.
11643
11644 prebuilt_apex {
11645 name: "com.google.android.foo",
11646 apex_name: "com.android.foo",
11647 src: "com.android.foo-arm.apex",
11648 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11649 }
11650
11651 // Another Prebuilt Google APEX
11652 prebuilt_apex {
11653 name: "com.google.android.foo.v2",
11654 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011655 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011656 src: "com.android.foo-arm.apex",
11657 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11658 }
11659
11660 // APEX contribution modules
11661
11662 apex_contributions {
11663 name: "foo.source.contributions",
11664 api_domain: "com.android.foo",
11665 contents: ["com.google.android.foo"],
11666 }
11667
11668 apex_contributions {
11669 name: "foo.prebuilt.contributions",
11670 api_domain: "com.android.foo",
11671 contents: ["prebuilt_com.google.android.foo"],
11672 }
11673
11674 apex_contributions {
11675 name: "foo.prebuilt.v2.contributions",
11676 api_domain: "com.android.foo",
11677 contents: ["prebuilt_com.google.android.foo.v2"],
11678 }
11679
11680 // This is an incompatible module because it selects multiple versions of the same mainline module
11681 apex_contributions {
11682 name: "foo.prebuilt.duplicate.contributions",
11683 api_domain: "com.android.foo",
11684 contents: [
11685 "prebuilt_com.google.android.foo",
11686 "prebuilt_com.google.android.foo.v2",
11687 ],
11688 }
11689 `
11690
11691 testCases := []struct {
11692 desc string
11693 selectedApexContributions string
11694 expectedVisibleModuleName string
11695 expectedHiddenModuleNames []string
11696 expectedError string
11697 }{
11698 {
11699 desc: "Source apex is selected, prebuilts should be hidden from make",
11700 selectedApexContributions: "foo.source.contributions",
11701 expectedVisibleModuleName: "com.google.android.foo",
11702 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11703 },
11704 {
11705 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11706 selectedApexContributions: "foo.prebuilt.contributions",
11707 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11708 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11709 },
11710 {
11711 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11712 selectedApexContributions: "foo.prebuilt.v2.contributions",
11713 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11714 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11715 },
11716 {
11717 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11718 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11719 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11720 },
11721 }
11722
11723 for _, tc := range testCases {
11724 preparer := android.GroupFixturePreparers(
11725 android.FixtureMergeMockFs(map[string][]byte{
11726 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11727 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011728 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011729 )
11730 if tc.expectedError != "" {
11731 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11732 testApex(t, bp, preparer)
11733 return
11734 }
11735 ctx := testApex(t, bp, preparer)
11736
Spandan Das3576e762024-01-03 18:57:03 +000011737 // Check that
11738 // 1. The contents of the selected apex_contributions are visible to make
11739 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11740 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11741 }
11742}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011743
Spandan Das85bd4622024-08-01 00:51:20 +000011744// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11745func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
11746 // for a mainline module family, check that only the flagged soong module is visible to make
11747 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11748 variation := func(moduleName string) string {
11749 ret := "android_common_com.android.adservices"
11750 if moduleName == "com.google.android.foo" {
11751 ret = "android_common_com.google.android.foo_com.google.android.foo"
11752 }
11753 return ret
11754 }
11755
11756 for _, visibleModuleName := range visibleModuleNames {
11757 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11758 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11759 }
11760
11761 for _, hiddenModuleName := range hiddenModuleNames {
11762 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11763 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11764
11765 }
11766 }
11767
11768 bp := `
11769 apex_key {
11770 name: "com.android.adservices.key",
11771 public_key: "com.android.adservices.avbpubkey",
11772 private_key: "com.android.adservices.pem",
11773 }
11774
11775 // AOSP source apex
11776 apex {
11777 name: "com.android.adservices",
11778 key: "com.android.adservices.key",
11779 updatable: false,
11780 }
11781
11782 // Prebuilt Google APEX.
11783
11784 prebuilt_apex {
11785 name: "com.google.android.adservices",
11786 apex_name: "com.android.adservices",
11787 src: "com.android.foo-arm.apex",
11788 }
11789
11790 // Another Prebuilt Google APEX
11791 prebuilt_apex {
11792 name: "com.google.android.adservices.v2",
11793 apex_name: "com.android.adservices",
11794 src: "com.android.foo-arm.apex",
11795 }
11796
11797 // APEX contribution modules
11798
11799
11800 apex_contributions {
11801 name: "adservices.prebuilt.contributions",
11802 api_domain: "com.android.adservices",
11803 contents: ["prebuilt_com.google.android.adservices"],
11804 }
11805
11806 apex_contributions {
11807 name: "adservices.prebuilt.v2.contributions",
11808 api_domain: "com.android.adservices",
11809 contents: ["prebuilt_com.google.android.adservices.v2"],
11810 }
11811 `
11812
11813 testCases := []struct {
11814 desc string
11815 selectedApexContributions string
11816 expectedVisibleModuleNames []string
11817 expectedHiddenModuleNames []string
11818 }{
11819 {
11820 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11821 selectedApexContributions: "",
11822 expectedVisibleModuleNames: []string{"com.android.adservices"},
11823 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11824 },
11825 {
11826 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11827 selectedApexContributions: "adservices.prebuilt.contributions",
11828 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11829 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11830 },
11831 {
11832 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11833 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11834 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11835 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11836 },
11837 }
11838
11839 for _, tc := range testCases {
11840 preparer := android.GroupFixturePreparers(
11841 android.FixtureMergeMockFs(map[string][]byte{
11842 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11843 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011844 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011845 )
11846 ctx := testApex(t, bp, preparer)
11847
11848 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11849 }
11850}
11851
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011852func TestAconfifDeclarationsValidation(t *testing.T) {
11853 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11854 for _, moduleName := range moduleNames {
11855 ret += fmt.Sprintf(`
11856 aconfig_declarations {
11857 name: "%[1]s",
11858 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011859 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011860 srcs: [
11861 "%[1]s.aconfig",
11862 ],
11863 }
11864 java_aconfig_library {
11865 name: "%[1]s-lib",
11866 aconfig_declarations: "%[1]s",
11867 }
11868 `, moduleName)
11869 }
11870 return ret
11871 }
11872
11873 result := android.GroupFixturePreparers(
11874 prepareForApexTest,
11875 java.PrepareForTestWithJavaSdkLibraryFiles,
11876 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011877 ).RunTestWithBp(t, `
11878 java_library {
11879 name: "baz-java-lib",
11880 static_libs: [
11881 "baz-lib",
11882 ],
11883 }
11884 filegroup {
11885 name: "qux-filegroup",
11886 srcs: [
11887 ":qux-lib{.generated_srcjars}",
11888 ],
11889 }
11890 filegroup {
11891 name: "qux-another-filegroup",
11892 srcs: [
11893 ":qux-filegroup",
11894 ],
11895 }
11896 java_library {
11897 name: "quux-java-lib",
11898 srcs: [
11899 "a.java",
11900 ],
11901 libs: [
11902 "quux-lib",
11903 ],
11904 }
11905 java_sdk_library {
11906 name: "foo",
11907 srcs: [
11908 ":qux-another-filegroup",
11909 ],
11910 api_packages: ["foo"],
11911 system: {
11912 enabled: true,
11913 },
11914 module_lib: {
11915 enabled: true,
11916 },
11917 test: {
11918 enabled: true,
11919 },
11920 static_libs: [
11921 "bar-lib",
11922 ],
11923 libs: [
11924 "baz-java-lib",
11925 "quux-java-lib",
11926 ],
11927 aconfig_declarations: [
11928 "bar",
11929 ],
11930 }
11931 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11932
11933 m := result.ModuleForTests("foo.stubs.source", "android_common")
11934 outDir := "out/soong/.intermediates"
11935
11936 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11937 // textproto files
11938 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11939
11940 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11941 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11942 // to aconfig.
11943 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11944 "passed as an input",
11945 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11946
11947 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11948 // to metalava as classpath. Thus the cache file provided by the associated
11949 // aconfig_declarations module "baz" should be passed to aconfig.
11950 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11951 "java_aconfig_library passed as an input",
11952 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11953
11954 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11955 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11956 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11957 "input",
11958 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11959
11960 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11961 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11962 // aconfig_declarations module "quux" should not be passed to aconfig.
11963 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11964 "depend on java_aconfig_library not passed as an input",
11965 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11966}
Cole Faust7c991b42024-05-15 11:17:55 -070011967
11968func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
11969 ctx := testApex(t, `
11970 apex {
11971 name: "myapex",
11972 key: "myapex.key",
11973 prebuilts: ["myetc", "myetc2"],
11974 min_sdk_version: "29",
11975 }
11976 apex_key {
11977 name: "myapex.key",
11978 public_key: "testkey.avbpubkey",
11979 private_key: "testkey.pem",
11980 }
11981
11982 prebuilt_etc {
11983 name: "myetc",
11984 src: "myprebuilt",
11985 filename: "myfilename",
11986 }
11987 prebuilt_etc {
11988 name: "myetc2",
11989 sub_dir: "mysubdir",
11990 src: "myprebuilt",
11991 filename: "myfilename",
11992 }
11993 `, withFiles(android.MockFS{
11994 "packages/modules/common/build/allowed_deps.txt": nil,
11995 }))
11996
11997 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11998 data := android.AndroidMkDataForTest(t, ctx, ab)
11999 var builder strings.Builder
12000 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
12001 androidMk := builder.String()
12002
12003 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
12004 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
12005}
Spandan Das50801e22024-05-13 18:29:45 +000012006
12007func TestApexMinSdkVersionOverride(t *testing.T) {
12008 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
12009 args := module.Rule("apexRule").Args
12010 optFlags := args["opt_flags"]
12011 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
12012 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
12013 }
12014 }
12015
12016 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
12017 t.Helper()
12018 found := false
12019 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
12020 if dep == wantDep {
12021 found = true
12022 }
12023 })
12024 if !found {
12025 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
12026 }
12027 }
12028
12029 ctx := testApex(t, `
12030 apex {
12031 name: "com.android.apex30",
12032 min_sdk_version: "30",
12033 key: "apex30.key",
12034 java_libs: ["javalib"],
12035 }
12036
12037 java_library {
12038 name: "javalib",
12039 srcs: ["A.java"],
12040 apex_available: ["com.android.apex30"],
12041 min_sdk_version: "30",
12042 sdk_version: "current",
12043 }
12044
12045 override_apex {
12046 name: "com.mycompany.android.apex30",
12047 base: "com.android.apex30",
12048 }
12049
12050 override_apex {
12051 name: "com.mycompany.android.apex31",
12052 base: "com.android.apex30",
12053 min_sdk_version: "31",
12054 }
12055
12056 apex_key {
12057 name: "apex30.key",
12058 public_key: "testkey.avbpubkey",
12059 private_key: "testkey.pem",
12060 }
12061
12062 `, android.FixtureMergeMockFs(android.MockFS{
12063 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
12064 }),
12065 )
12066
12067 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
12068 checkMinSdkVersion(t, baseModule, "30")
12069
12070 // Override module, but uses same min_sdk_version
12071 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
12072 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
12073 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
12074 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
12075
12076 // Override module, uses different min_sdk_version
12077 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
12078 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
12079 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
12080 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
12081}
Spandan Das0b28fa02024-05-28 23:40:17 +000012082
12083func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
12084 context := android.GroupFixturePreparers(
12085 android.PrepareForIntegrationTestWithAndroid,
12086 PrepareForTestWithApexBuildComponents,
12087 android.FixtureMergeMockFs(android.MockFS{
12088 "system/sepolicy/apex/foo-file_contexts": nil,
12089 }),
12090 )
12091 res := context.RunTestWithBp(t, `
12092 apex {
12093 name: "foo",
12094 key: "myapex.key",
12095 apex_available_name: "com.android.foo",
12096 variant_version: "0",
12097 updatable: false,
12098 }
12099 apex_key {
12100 name: "myapex.key",
12101 public_key: "testkey.avbpubkey",
12102 private_key: "testkey.pem",
12103 }
12104 prebuilt_apex {
12105 name: "foo",
12106 src: "foo.apex",
12107 prefer: true,
12108 }
12109 override_apex {
12110 name: "myoverrideapex",
12111 base: "foo",
12112 }
12113 `)
12114
12115 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
12116}
Spandan Dasca1d63e2024-07-01 22:53:49 +000012117
12118func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
12119 testApexError(t, `"myapex" .*: updatable: updatable APEXes should not set min_sdk_version to current. Please use a finalized API level or a recognized in-development codename`, `
12120 apex {
12121 name: "myapex",
12122 key: "myapex.key",
12123 updatable: true,
12124 min_sdk_version: "current",
12125 }
12126
12127 apex_key {
12128 name: "myapex.key",
12129 public_key: "testkey.avbpubkey",
12130 private_key: "testkey.pem",
12131 }
12132 `)
12133}
Spandan Das2f68f192024-07-22 19:25:50 +000012134
12135func TestPrebuiltStubNoinstall(t *testing.T) {
12136 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
12137 result := android.GroupFixturePreparers(
12138 prepareForApexTest,
12139 android.PrepareForTestWithAndroidMk,
12140 android.PrepareForTestWithMakevars,
12141 android.FixtureMergeMockFs(fs),
12142 ).RunTest(t)
12143
12144 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000012145 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000012146
12147 installRules := result.InstallMakeRulesForTesting(t)
12148
12149 var installedlibRule *android.InstallMakeRule
12150 for i, rule := range installRules {
12151 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
12152 if installedlibRule != nil {
12153 t.Errorf("Duplicate install rules for %s", rule.Target)
12154 }
12155 installedlibRule = &installRules[i]
12156 }
12157 }
12158 if installedlibRule == nil {
12159 t.Errorf("No install rule found for installedlib")
12160 return
12161 }
12162
12163 if expectLibfooOnSystemLib {
12164 android.AssertStringListContains(t,
12165 "installedlib doesn't have install dependency on libfoo impl",
12166 installedlibRule.OrderOnlyDeps,
12167 "out/target/product/test_device/system/lib/libfoo.so")
12168 } else {
12169 android.AssertStringListDoesNotContain(t,
12170 "installedlib has install dependency on libfoo stub",
12171 installedlibRule.Deps,
12172 "out/target/product/test_device/system/lib/libfoo.so")
12173 android.AssertStringListDoesNotContain(t,
12174 "installedlib has order-only install dependency on libfoo stub",
12175 installedlibRule.OrderOnlyDeps,
12176 "out/target/product/test_device/system/lib/libfoo.so")
12177 }
12178 }
12179
12180 prebuiltLibfooBp := []byte(`
12181 cc_prebuilt_library {
12182 name: "libfoo",
12183 prefer: true,
12184 srcs: ["libfoo.so"],
12185 stubs: {
12186 versions: ["1"],
12187 },
12188 apex_available: ["apexfoo"],
12189 }
12190 `)
12191
12192 apexfooBp := []byte(`
12193 apex {
12194 name: "apexfoo",
12195 key: "apexfoo.key",
12196 native_shared_libs: ["libfoo"],
12197 updatable: false,
12198 compile_multilib: "both",
12199 }
12200 apex_key {
12201 name: "apexfoo.key",
12202 public_key: "testkey.avbpubkey",
12203 private_key: "testkey.pem",
12204 }
12205 `)
12206
12207 installedlibBp := []byte(`
12208 cc_library {
12209 name: "installedlib",
12210 shared_libs: ["libfoo"],
12211 }
12212 `)
12213
12214 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
12215 testFunc(
12216 t,
12217 /*expectLibfooOnSystemLib=*/ false,
12218 android.MockFS{
12219 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12220 "apexfoo/Android.bp": apexfooBp,
12221 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12222 "Android.bp": installedlibBp,
12223 },
12224 )
12225 })
12226
12227 disabledSourceLibfooBp := []byte(`
12228 cc_library {
12229 name: "libfoo",
12230 enabled: false,
12231 stubs: {
12232 versions: ["1"],
12233 },
12234 apex_available: ["apexfoo"],
12235 }
12236 `)
12237
12238 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
12239 testFunc(
12240 t,
12241 /*expectLibfooOnSystemLib=*/ false,
12242 android.MockFS{
12243 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12244 "impl/Android.bp": disabledSourceLibfooBp,
12245 "apexfoo/Android.bp": apexfooBp,
12246 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12247 "Android.bp": installedlibBp,
12248 },
12249 )
12250 })
12251}