blob: 6f0357a0973f9562d6b839bd577670707b2777fb [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
Jooyung Han35155c42020-02-06 17:33:20 +090085// withNativeBridgeTargets sets configuration with targets including:
86// - X86_64 (primary)
87// - X86 (secondary)
88// - Arm64 on X86_64 (native bridge)
89// - Arm on X86 (native bridge)
Paul Duffin810f33d2021-03-09 14:12:32 +000090var withNativeBridgeEnabled = android.FixtureModifyConfig(
91 func(config android.Config) {
92 config.Targets[android.Android] = []android.Target{
93 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
94 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
95 {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
96 NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
97 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
98 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
99 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
100 NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
101 }
102 },
103)
104
105func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
106 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
107 variables.ManifestPackageNameOverrides = specs
108 })
Jooyung Han35155c42020-02-06 17:33:20 +0900109}
110
Albert Martineefabcf2022-03-21 20:11:16 +0000111func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
112 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
113 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
114 })
115}
116
Paul Duffin810f33d2021-03-09 14:12:32 +0000117var withBinder32bit = android.FixtureModifyProductVariables(
118 func(variables android.FixtureProductVariables) {
119 variables.Binder32bit = proptools.BoolPtr(true)
120 },
121)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900122
Paul Duffin810f33d2021-03-09 14:12:32 +0000123var withUnbundledBuild = android.FixtureModifyProductVariables(
124 func(variables android.FixtureProductVariables) {
125 variables.Unbundled_build = proptools.BoolPtr(true)
126 },
127)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900128
Paul Duffin284165a2021-03-29 01:50:31 +0100129// Legacy preparer used for running tests within the apex package.
130//
131// This includes everything that was needed to run any test in the apex package prior to the
132// introduction of the test fixtures. Tests that are being converted to use fixtures directly
133// rather than through the testApex...() methods should avoid using this and instead use the
134// various preparers directly, using android.GroupFixturePreparers(...) to group them when
135// necessary.
136//
137// deprecated
138var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000139 // General preparers in alphabetical order as test infrastructure will enforce correct
140 // registration order.
141 android.PrepareForTestWithAndroidBuildComponents,
142 bpf.PrepareForTestWithBpf,
143 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100144 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000145 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
146 rust.PrepareForTestWithRustDefaultModules,
147 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800148 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000149
150 PrepareForTestWithApexBuildComponents,
151
152 // Additional apex test specific preparers.
153 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
154 filegroup {
155 name: "myapex-file_contexts",
156 srcs: [
157 "apex/myapex-file_contexts",
158 ],
159 }
160 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000161 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000162 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000163 "a.java": nil,
164 "PrebuiltAppFoo.apk": nil,
165 "PrebuiltAppFooPriv.apk": nil,
166 "apex_manifest.json": nil,
167 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000168 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
169 "system/sepolicy/apex/myapex2-file_contexts": nil,
170 "system/sepolicy/apex/otherapex-file_contexts": nil,
171 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
172 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700173 "mylib.cpp": nil,
174 "mytest.cpp": nil,
175 "mytest1.cpp": nil,
176 "mytest2.cpp": nil,
177 "mytest3.cpp": nil,
178 "myprebuilt": nil,
179 "my_include": nil,
180 "foo/bar/MyClass.java": nil,
181 "prebuilt.jar": nil,
182 "prebuilt.so": nil,
183 "vendor/foo/devkeys/test.x509.pem": nil,
184 "vendor/foo/devkeys/test.pk8": nil,
185 "testkey.x509.pem": nil,
186 "testkey.pk8": nil,
187 "testkey.override.x509.pem": nil,
188 "testkey.override.pk8": nil,
189 "vendor/foo/devkeys/testkey.avbpubkey": nil,
190 "vendor/foo/devkeys/testkey.pem": nil,
191 "NOTICE": nil,
192 "custom_notice": nil,
193 "custom_notice_for_static_lib": nil,
194 "testkey2.avbpubkey": nil,
195 "testkey2.pem": nil,
196 "myapex-arm64.apex": nil,
197 "myapex-arm.apex": nil,
198 "myapex.apks": nil,
199 "frameworks/base/api/current.txt": nil,
200 "framework/aidl/a.aidl": nil,
201 "dummy.txt": nil,
202 "baz": nil,
203 "bar/baz": nil,
204 "testdata/baz": nil,
205 "AppSet.apks": nil,
206 "foo.rs": nil,
207 "libfoo.jar": nil,
208 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000209 },
210 ),
211
212 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000213 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
214 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
215 variables.Platform_sdk_codename = proptools.StringPtr("Q")
216 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000217 // "Tiramisu" needs to be in the next line for compatibility with soong code,
218 // not because of these tests specifically (it's not used by the tests)
219 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000220 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000221 }),
222)
223
Paul Duffin52bfaa42021-03-23 23:40:12 +0000224var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
225 "system/sepolicy/apex/myapex-file_contexts": nil,
226})
227
Jooyung Han643adc42020-02-27 13:50:06 +0900228// ensure that 'result' equals 'expected'
229func ensureEquals(t *testing.T, result string, expected string) {
230 t.Helper()
231 if result != expected {
232 t.Errorf("%q != %q", expected, result)
233 }
234}
235
Jiyong Park25fc6a92018-11-18 18:02:45 +0900236// ensure that 'result' contains 'expected'
237func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900238 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239 if !strings.Contains(result, expected) {
240 t.Errorf("%q is not found in %q", expected, result)
241 }
242}
243
Liz Kammer5bd365f2020-05-27 15:15:11 -0700244// ensure that 'result' contains 'expected' exactly one time
245func ensureContainsOnce(t *testing.T, result string, expected string) {
246 t.Helper()
247 count := strings.Count(result, expected)
248 if count != 1 {
249 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
250 }
251}
252
Jiyong Park25fc6a92018-11-18 18:02:45 +0900253// ensures that 'result' does not contain 'notExpected'
254func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900255 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900256 if strings.Contains(result, notExpected) {
257 t.Errorf("%q is found in %q", notExpected, result)
258 }
259}
260
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700261func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900262 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700263 ok, err := regexp.MatchString(expectedRex, result)
264 if err != nil {
265 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
266 return
267 }
268 if !ok {
269 t.Errorf("%s does not match regular expession %s", result, expectedRex)
270 }
271}
272
Jooyung Hana3fddf42024-09-03 13:22:21 +0900273func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
274 t.Helper()
275 p := regexp.MustCompile(expectedRex)
276 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
277 t.Errorf("%q is not found in %v", expectedRex, result)
278 }
279}
280
Jiyong Park25fc6a92018-11-18 18:02:45 +0900281func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900282 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900283 if !android.InList(expected, result) {
284 t.Errorf("%q is not found in %v", expected, result)
285 }
286}
287
288func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900289 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900290 if android.InList(notExpected, result) {
291 t.Errorf("%q is found in %v", notExpected, result)
292 }
293}
294
Jooyung Hane1633032019-08-01 17:41:43 +0900295func ensureListEmpty(t *testing.T, result []string) {
296 t.Helper()
297 if len(result) > 0 {
298 t.Errorf("%q is expected to be empty", result)
299 }
300}
301
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000302func ensureListNotEmpty(t *testing.T, result []string) {
303 t.Helper()
304 if len(result) == 0 {
305 t.Errorf("%q is expected to be not empty", result)
306 }
307}
308
Jiyong Park25fc6a92018-11-18 18:02:45 +0900309// Minimal test
310func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700311 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800312 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900313 apex_defaults {
314 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900315 manifest: ":myapex.manifest",
316 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900317 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900318 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900319 native_shared_libs: [
320 "mylib",
321 "libfoo.ffi",
322 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900323 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800324 multilib: {
325 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900326 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800327 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900328 },
Jiyong Park77acec62020-06-01 21:39:15 +0900329 java_libs: [
330 "myjar",
331 "myjar_dex",
332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000333 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900334 }
335
Jiyong Park30ca9372019-02-07 16:27:23 +0900336 apex {
337 name: "myapex",
338 defaults: ["myapex-defaults"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 apex_key {
342 name: "myapex.key",
343 public_key: "testkey.avbpubkey",
344 private_key: "testkey.pem",
345 }
346
Jiyong Park809bb722019-02-13 21:33:49 +0900347 filegroup {
348 name: "myapex.manifest",
349 srcs: ["apex_manifest.json"],
350 }
351
352 filegroup {
353 name: "myapex.androidmanifest",
354 srcs: ["AndroidManifest.xml"],
355 }
356
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 cc_library {
358 name: "mylib",
359 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900360 shared_libs: [
361 "mylib2",
362 "libbar.ffi",
363 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900364 system_shared_libs: [],
365 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000366 // TODO: remove //apex_available:platform
367 apex_available: [
368 "//apex_available:platform",
369 "myapex",
370 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900371 }
372
Alex Light3d673592019-01-18 14:37:31 -0800373 cc_binary {
374 name: "foo",
375 srcs: ["mylib.cpp"],
376 compile_multilib: "both",
377 multilib: {
378 lib32: {
379 suffix: "32",
380 },
381 lib64: {
382 suffix: "64",
383 },
384 },
385 symlinks: ["foo_link_"],
386 symlink_preferred_arch: true,
387 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800388 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900389 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700390 }
391
Jiyong Park99644e92020-11-17 22:21:02 +0900392 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000393 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900394 srcs: ["foo.rs"],
395 rlibs: ["libfoo.rlib.rust"],
Vinh Tran4eeb2a92023-08-14 13:29:30 -0400396 rustlibs: ["libfoo.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900397 apex_available: ["myapex"],
398 }
399
400 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900405 shared_libs: ["libfoo.shared_from_rust"],
406 }
407
408 cc_library_shared {
409 name: "libfoo.shared_from_rust",
410 srcs: ["mylib.cpp"],
411 system_shared_libs: [],
412 stl: "none",
413 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900414 }
415
416 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000417 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900423 rust_ffi_shared {
424 name: "libfoo.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
430 rust_ffi_shared {
431 name: "libbar.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "bar",
434 apex_available: ["myapex"],
435 }
436
Paul Duffindddd5462020-04-07 15:25:44 +0100437 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900438 name: "mylib2",
439 srcs: ["mylib.cpp"],
440 system_shared_libs: [],
441 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900442 static_libs: ["libstatic"],
443 // TODO: remove //apex_available:platform
444 apex_available: [
445 "//apex_available:platform",
446 "myapex",
447 ],
448 }
449
Paul Duffindddd5462020-04-07 15:25:44 +0100450 cc_prebuilt_library_shared {
451 name: "mylib2",
452 srcs: ["prebuilt.so"],
453 // TODO: remove //apex_available:platform
454 apex_available: [
455 "//apex_available:platform",
456 "myapex",
457 ],
458 }
459
Jiyong Park9918e1a2020-03-17 19:16:40 +0900460 cc_library_static {
461 name: "libstatic",
462 srcs: ["mylib.cpp"],
463 system_shared_libs: [],
464 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000465 // TODO: remove //apex_available:platform
466 apex_available: [
467 "//apex_available:platform",
468 "myapex",
469 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900470 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471
472 java_library {
473 name: "myjar",
474 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900475 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900476 sdk_version: "none",
477 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900479 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000480 // TODO: remove //apex_available:platform
481 apex_available: [
482 "//apex_available:platform",
483 "myapex",
484 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 }
486
Jiyong Park77acec62020-06-01 21:39:15 +0900487 dex_import {
488 name: "myjar_dex",
489 jars: ["prebuilt.jar"],
490 apex_available: [
491 "//apex_available:platform",
492 "myapex",
493 ],
494 }
495
Jiyong Park7f7766d2019-07-25 22:02:35 +0900496 java_library {
497 name: "myotherjar",
498 srcs: ["foo/bar/MyClass.java"],
499 sdk_version: "none",
500 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900501 // TODO: remove //apex_available:platform
502 apex_available: [
503 "//apex_available:platform",
504 "myapex",
505 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900506 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900507
508 java_library {
509 name: "mysharedjar",
510 srcs: ["foo/bar/MyClass.java"],
511 sdk_version: "none",
512 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900513 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900514 `)
515
Jooyung Hana0503a52023-08-23 13:12:50 +0900516 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900517
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900518 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900519 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700520 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900521 var builder strings.Builder
522 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
523
524 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000525 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900526 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
527
Jiyong Park42cca6c2019-04-01 11:15:50 +0900528 optFlags := apexRule.Args["opt_flags"]
529 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700530 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900531 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900532
Jiyong Park25fc6a92018-11-18 18:02:45 +0900533 copyCmds := apexRule.Args["copy_commands"]
534
535 // Ensure that main rule creates an output
536 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
537
538 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700539 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
540 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900544
545 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900548 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
549 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900551 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900552
553 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800554 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
555 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900556 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900557 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900558 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900559 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
560 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900561 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900562 // .. but not for java libs
563 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900564 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800565
Colin Cross7113d202019-11-20 16:39:12 -0800566 // Ensure that the platform variant ends with _shared or _common
567 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
568 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900569 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
570 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900571 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
572
573 // Ensure that dynamic dependency to java libs are not included
574 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800575
576 // Ensure that all symlinks are present.
577 found_foo_link_64 := false
578 found_foo := false
579 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900580 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800581 if strings.HasSuffix(cmd, "bin/foo") {
582 found_foo = true
583 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
584 found_foo_link_64 = true
585 }
586 }
587 }
588 good := found_foo && found_foo_link_64
589 if !good {
590 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
591 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900592
Colin Crossf61d03d2023-11-02 16:56:39 -0700593 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
594 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100595 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100596 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
597 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
598 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100599
Colin Crossf61d03d2023-11-02 16:56:39 -0700600 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
601 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100602 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100603 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
604 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
605 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800606}
607
Jooyung Hanf21c7972019-12-16 22:32:06 +0900608func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700609 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800610 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900611 apex_defaults {
612 name: "myapex-defaults",
613 key: "myapex.key",
614 prebuilts: ["myetc"],
615 native_shared_libs: ["mylib"],
616 java_libs: ["myjar"],
617 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900618 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800619 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000620 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900621 }
622
623 prebuilt_etc {
624 name: "myetc",
625 src: "myprebuilt",
626 }
627
628 apex {
629 name: "myapex",
630 defaults: ["myapex-defaults"],
631 }
632
633 apex_key {
634 name: "myapex.key",
635 public_key: "testkey.avbpubkey",
636 private_key: "testkey.pem",
637 }
638
639 cc_library {
640 name: "mylib",
641 system_shared_libs: [],
642 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000643 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900644 }
645
646 java_library {
647 name: "myjar",
648 srcs: ["foo/bar/MyClass.java"],
649 sdk_version: "none",
650 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000651 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900652 }
653
654 android_app {
655 name: "AppFoo",
656 srcs: ["foo/bar/MyClass.java"],
657 sdk_version: "none",
658 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000659 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900660 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900661
662 runtime_resource_overlay {
663 name: "rro",
664 theme: "blue",
665 }
666
markchien2f59ec92020-09-02 16:23:38 +0800667 bpf {
668 name: "bpf",
669 srcs: ["bpf.c", "bpf2.c"],
670 }
671
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800673 name: "netdTest",
674 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800675 sub_dir: "netd",
676 }
677
Jooyung Hanf21c7972019-12-16 22:32:06 +0900678 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900679 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900680 "etc/myetc",
681 "javalib/myjar.jar",
682 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000683 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900684 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800685 "etc/bpf/bpf.o",
686 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800687 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900688 })
689}
690
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700692 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800693 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900694 apex {
695 name: "myapex",
696 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000697 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900698 }
699
700 apex_key {
701 name: "myapex.key",
702 public_key: "testkey.avbpubkey",
703 private_key: "testkey.pem",
704 }
705 `)
706
Jooyung Hana0503a52023-08-23 13:12:50 +0900707 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900708 args := module.Rule("apexRule").Args
709 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
710 t.Error("manifest should be apex_manifest.pb, but " + manifest)
711 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900712}
713
Liz Kammer4854a7d2021-05-27 14:28:27 -0400714func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700715 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400716 ctx := testApex(t, `
717 apex_defaults {
718 name: "my_defaults",
719 key: "myapex.key",
720 product_specific: true,
721 file_contexts: ":my-file-contexts",
722 updatable: false,
723 }
724 apex {
725 name: "myapex_30",
726 min_sdk_version: "30",
727 defaults: ["my_defaults"],
728 }
729
730 apex {
731 name: "myapex_current",
732 min_sdk_version: "current",
733 defaults: ["my_defaults"],
734 }
735
736 apex {
737 name: "myapex_none",
738 defaults: ["my_defaults"],
739 }
740
741 apex_key {
742 name: "myapex.key",
743 public_key: "testkey.avbpubkey",
744 private_key: "testkey.pem",
745 }
746
747 filegroup {
748 name: "my-file-contexts",
749 srcs: ["product_specific_file_contexts"],
750 }
751 `, withFiles(map[string][]byte{
752 "product_specific_file_contexts": nil,
753 }), android.FixtureModifyProductVariables(
754 func(variables android.FixtureProductVariables) {
755 variables.Unbundled_build = proptools.BoolPtr(true)
756 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
757 }), android.FixtureMergeEnv(map[string]string{
758 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
759 }))
760
761 testCases := []struct {
762 module string
763 minSdkVersion string
764 }{
765 {
766 module: "myapex_30",
767 minSdkVersion: "30",
768 },
769 {
770 module: "myapex_current",
771 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
772 },
773 {
774 module: "myapex_none",
775 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
776 },
777 }
778 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900779 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400780 args := module.Rule("apexRule").Args
781 optFlags := args["opt_flags"]
782 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
783 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
784 }
785 }
786}
787
Jihoon Kang842b9992024-02-08 01:41:51 +0000788func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700789 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000790 ctx := testApex(t, `
791 apex_defaults {
792 name: "my_defaults",
793 key: "myapex.key",
794 product_specific: true,
795 file_contexts: ":my-file-contexts",
796 updatable: false,
797 }
798 apex {
799 name: "myapex_30",
800 min_sdk_version: "30",
801 defaults: ["my_defaults"],
802 }
803
804 apex {
805 name: "myapex_current",
806 min_sdk_version: "current",
807 defaults: ["my_defaults"],
808 }
809
810 apex {
811 name: "myapex_none",
812 defaults: ["my_defaults"],
813 }
814
815 apex_key {
816 name: "myapex.key",
817 public_key: "testkey.avbpubkey",
818 private_key: "testkey.pem",
819 }
820
821 filegroup {
822 name: "my-file-contexts",
823 srcs: ["product_specific_file_contexts"],
824 }
825 `, withFiles(map[string][]byte{
826 "product_specific_file_contexts": nil,
827 }), android.FixtureModifyProductVariables(
828 func(variables android.FixtureProductVariables) {
829 variables.Unbundled_build = proptools.BoolPtr(true)
830 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
831 }), android.FixtureMergeEnv(map[string]string{
832 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
833 }))
834
835 testCases := []struct {
836 module string
837 minSdkVersion string
838 }{
839 {
840 module: "myapex_30",
841 minSdkVersion: "30",
842 },
843 {
844 module: "myapex_current",
845 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
846 },
847 {
848 module: "myapex_none",
849 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
850 },
851 }
852 for _, tc := range testCases {
853 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
854 args := module.Rule("apexRule").Args
855 optFlags := args["opt_flags"]
856 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
857 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
858 }
859 }
860}
861
Jooyung Hanaf730952023-02-28 14:13:38 +0900862func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700863 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900864 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900866 if vendor {
867 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900868 }
869 ctx := testApex(t, `
870 apex {
871 name: "myapex",
872 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900873 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900874 `+prop+`
875 }
876
877 apex_key {
878 name: "myapex.key",
879 public_key: "testkey.avbpubkey",
880 private_key: "testkey.pem",
881 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900883
Jooyung Hana0503a52023-08-23 13:12:50 +0900884 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900885 if vendor {
886 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
887 rule.RuleParams.Command,
888 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900889 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900890 android.AssertStringDoesContain(t, "should force-label as system_file",
891 rule.RuleParams.Command,
892 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900893 }
894 }
895}
896
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700898 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800899 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900900 apex {
901 name: "myapex",
902 key: "myapex.key",
903 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900904 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000905 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906 }
907
908 apex_key {
909 name: "myapex.key",
910 public_key: "testkey.avbpubkey",
911 private_key: "testkey.pem",
912 }
913
914 cc_library {
915 name: "mylib",
916 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000917 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 system_shared_libs: [],
919 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000920 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900921 }
922
923 cc_library {
924 name: "mylib2",
925 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900926 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 system_shared_libs: [],
928 stl: "none",
929 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000930 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900931 versions: ["1", "2", "3"],
932 },
933 }
934
935 cc_library {
936 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900937 srcs: ["mylib.cpp"],
938 shared_libs: ["mylib4"],
939 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 stl: "none",
941 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000942 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 versions: ["10", "11", "12"],
944 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000945 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900946 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900947
948 cc_library {
949 name: "mylib4",
950 srcs: ["mylib.cpp"],
951 system_shared_libs: [],
952 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000953 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900954 }
Jiyong Park105dc322021-06-11 17:22:09 +0900955
Spandan Das357ffcc2024-07-24 18:07:48 +0000956 cc_prebuilt_library_shared {
957 name: "my_prebuilt_platform_lib",
958 stubs: {
959 symbol_file: "my_prebuilt_platform_lib.map.txt",
960 versions: ["1", "2", "3"],
961 },
962 srcs: ["foo.so"],
963 }
964
965 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
966 cc_prebuilt_library_shared {
967 name: "my_prebuilt_platform_stub_only_lib",
968 stubs: {
969 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
970 versions: ["1", "2", "3"],
971 }
972 }
973
Jiyong Park105dc322021-06-11 17:22:09 +0900974 rust_binary {
975 name: "foo.rust",
976 srcs: ["foo.rs"],
977 shared_libs: ["libfoo.shared_from_rust"],
978 prefer_rlib: true,
979 apex_available: ["myapex"],
980 }
981
982 cc_library_shared {
983 name: "libfoo.shared_from_rust",
984 srcs: ["mylib.cpp"],
985 system_shared_libs: [],
986 stl: "none",
987 stubs: {
988 versions: ["10", "11", "12"],
989 },
990 }
991
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 `)
993
Jooyung Hana0503a52023-08-23 13:12:50 +0900994 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900995 copyCmds := apexRule.Args["copy_commands"]
996
997 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
1003 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001004 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001005
Colin Crossaede88c2020-08-11 12:17:01 -07001006 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007
1008 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001009 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001010 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001011 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012
1013 // 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 -07001014 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001015 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001016 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001017
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001018 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1019 // is replaced by sharing of "cFlags" in cc/builder.go.
1020 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1021 // module variable representing "cflags". So it was not detected by ensureNotContains.
1022 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1023 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1024 // including the original cflags's "-include mylib.h".
1025 //
Jiyong Park64379952018-12-13 18:37:29 +09001026 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001027 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1028 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001029
Jiyong Park85cc35a2022-07-17 11:30:47 +09001030 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1031 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1032 // Ensure that genstub for apex-provided lib is invoked with --apex
1033 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001034
Jooyung Hana0503a52023-08-23 13:12:50 +09001035 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001036 "lib64/mylib.so",
1037 "lib64/mylib3.so",
1038 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001039 "bin/foo.rust",
1040 "lib64/libc++.so", // by the implicit dependency from foo.rust
1041 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001042 })
Jiyong Park105dc322021-06-11 17:22:09 +09001043
1044 // Ensure that stub dependency from a rust module is not included
1045 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1046 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001047 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001048 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1049 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001050
Jooyung Hana0503a52023-08-23 13:12:50 +09001051 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001052 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001053
1054 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1055 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1056 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1057 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1058 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1059 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1060
1061 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1062 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1063 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1064 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1065 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1066 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 +09001067}
1068
Jooyung Han20348752023-12-05 15:23:56 +09001069func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001070 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001071 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1072 apex {
1073 name: "myapex",
1074 key: "myapex.key",
1075 vendor: true,
1076 updatable: false,
1077 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1078 }
1079
1080 apex_key {
1081 name: "myapex.key",
1082 public_key: "testkey.avbpubkey",
1083 private_key: "testkey.pem",
1084 }
1085
1086 cc_library {
1087 name: "libbar",
1088 srcs: ["mylib.cpp"],
1089 llndk: {
1090 symbol_file: "libbar.map.txt",
1091 }
1092 }
1093 `)
1094}
1095
Jiyong Park1bc84122021-06-22 20:23:05 +09001096func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001097 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001098 ctx := testApex(t, `
1099 apex {
1100 name: "myapex",
1101 key: "myapex.key",
1102 native_shared_libs: ["mylib"],
1103 binaries: ["foo.rust"],
1104 updatable: false,
1105 platform_apis: true,
1106 }
1107
1108 apex_key {
1109 name: "myapex.key",
1110 public_key: "testkey.avbpubkey",
1111 private_key: "testkey.pem",
1112 }
1113
1114 cc_library {
1115 name: "mylib",
1116 srcs: ["mylib.cpp"],
1117 shared_libs: ["mylib2"],
1118 system_shared_libs: [],
1119 stl: "none",
1120 apex_available: [ "myapex" ],
1121 }
1122
1123 cc_library {
1124 name: "mylib2",
1125 srcs: ["mylib.cpp"],
1126 cflags: ["-include mylib.h"],
1127 system_shared_libs: [],
1128 stl: "none",
1129 stubs: {
1130 versions: ["1", "2", "3"],
1131 },
1132 }
1133
1134 rust_binary {
1135 name: "foo.rust",
1136 srcs: ["foo.rs"],
1137 shared_libs: ["libfoo.shared_from_rust"],
1138 prefer_rlib: true,
1139 apex_available: ["myapex"],
1140 }
1141
1142 cc_library_shared {
1143 name: "libfoo.shared_from_rust",
1144 srcs: ["mylib.cpp"],
1145 system_shared_libs: [],
1146 stl: "none",
1147 stubs: {
1148 versions: ["10", "11", "12"],
1149 },
1150 }
1151 `)
1152
Jooyung Hana0503a52023-08-23 13:12:50 +09001153 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001154 copyCmds := apexRule.Args["copy_commands"]
1155
1156 // Ensure that indirect stubs dep is not included
1157 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1158 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1159
1160 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1161 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001162 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1164 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001165 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001166 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1167 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1168}
1169
Colin Cross7812fd32020-09-25 12:35:10 -07001170func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1171 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001172 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001173 apex {
1174 name: "myapex",
1175 key: "myapex.key",
1176 native_shared_libs: ["mylib", "mylib3"],
1177 min_sdk_version: "29",
1178 }
1179
1180 apex_key {
1181 name: "myapex.key",
1182 public_key: "testkey.avbpubkey",
1183 private_key: "testkey.pem",
1184 }
1185
1186 cc_library {
1187 name: "mylib",
1188 srcs: ["mylib.cpp"],
1189 shared_libs: ["mylib2", "mylib3"],
1190 system_shared_libs: [],
1191 stl: "none",
1192 apex_available: [ "myapex" ],
1193 min_sdk_version: "28",
1194 }
1195
1196 cc_library {
1197 name: "mylib2",
1198 srcs: ["mylib.cpp"],
1199 cflags: ["-include mylib.h"],
1200 system_shared_libs: [],
1201 stl: "none",
1202 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001203 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001204 versions: ["28", "29", "30", "current"],
1205 },
1206 min_sdk_version: "28",
1207 }
1208
1209 cc_library {
1210 name: "mylib3",
1211 srcs: ["mylib.cpp"],
1212 shared_libs: ["mylib4"],
1213 system_shared_libs: [],
1214 stl: "none",
1215 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001216 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001217 versions: ["28", "29", "30", "current"],
1218 },
1219 apex_available: [ "myapex" ],
1220 min_sdk_version: "28",
1221 }
1222
1223 cc_library {
1224 name: "mylib4",
1225 srcs: ["mylib.cpp"],
1226 system_shared_libs: [],
1227 stl: "none",
1228 apex_available: [ "myapex" ],
1229 min_sdk_version: "28",
1230 }
1231 `)
1232
Jooyung Hana0503a52023-08-23 13:12:50 +09001233 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001234 copyCmds := apexRule.Args["copy_commands"]
1235
1236 // Ensure that direct non-stubs dep is always included
1237 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1238
1239 // Ensure that indirect stubs dep is not included
1240 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1241
1242 // Ensure that direct stubs dep is included
1243 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1244
1245 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1246
Jiyong Park55549df2021-02-26 23:57:23 +09001247 // Ensure that mylib is linking with the latest version of stub for mylib2
1248 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001249 // ... and not linking to the non-stub (impl) variant of mylib2
1250 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1251
1252 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1253 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1254 // .. and not linking to the stubs variant of mylib3
1255 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1256
1257 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001258 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001259 ensureNotContains(t, mylib2Cflags, "-include ")
1260
Jiyong Park85cc35a2022-07-17 11:30:47 +09001261 // Ensure that genstub is invoked with --systemapi
1262 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001263
Jooyung Hana0503a52023-08-23 13:12:50 +09001264 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001265 "lib64/mylib.so",
1266 "lib64/mylib3.so",
1267 "lib64/mylib4.so",
1268 })
1269}
1270
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001271func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1272 t.Parallel()
1273 // myapex (Z)
1274 // mylib -----------------.
1275 // |
1276 // otherapex (29) |
1277 // libstub's versions: 29 Z current
1278 // |
1279 // <platform> |
1280 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001281 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001282 apex {
1283 name: "myapex",
1284 key: "myapex.key",
1285 native_shared_libs: ["mylib"],
1286 min_sdk_version: "Z", // non-final
1287 }
1288
1289 cc_library {
1290 name: "mylib",
1291 srcs: ["mylib.cpp"],
1292 shared_libs: ["libstub"],
1293 apex_available: ["myapex"],
1294 min_sdk_version: "Z",
1295 }
1296
1297 apex_key {
1298 name: "myapex.key",
1299 public_key: "testkey.avbpubkey",
1300 private_key: "testkey.pem",
1301 }
1302
1303 apex {
1304 name: "otherapex",
1305 key: "myapex.key",
1306 native_shared_libs: ["libstub"],
1307 min_sdk_version: "29",
1308 }
1309
1310 cc_library {
1311 name: "libstub",
1312 srcs: ["mylib.cpp"],
1313 stubs: {
1314 versions: ["29", "Z", "current"],
1315 },
1316 apex_available: ["otherapex"],
1317 min_sdk_version: "29",
1318 }
1319
1320 // platform module depending on libstub from otherapex should use the latest stub("current")
1321 cc_library {
1322 name: "libplatform",
1323 srcs: ["mylib.cpp"],
1324 shared_libs: ["libstub"],
1325 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001326 `,
1327 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1328 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1329 variables.Platform_sdk_final = proptools.BoolPtr(false)
1330 variables.Platform_version_active_codenames = []string{"Z"}
1331 }),
1332 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001333
Jiyong Park55549df2021-02-26 23:57:23 +09001334 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001335 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001336 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001337 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001338 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001339
1340 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1341 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1342 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1343 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1344 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1345}
1346
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001348 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001349 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001351 name: "myapex2",
1352 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001353 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001354 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001355 }
1356
1357 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001358 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001359 public_key: "testkey.avbpubkey",
1360 private_key: "testkey.pem",
1361 }
1362
1363 cc_library {
1364 name: "mylib",
1365 srcs: ["mylib.cpp"],
1366 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001367 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 system_shared_libs: [],
1369 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001370 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001371 }
1372
1373 cc_library {
1374 name: "libfoo",
1375 srcs: ["mylib.cpp"],
1376 shared_libs: ["libbar"],
1377 system_shared_libs: [],
1378 stl: "none",
1379 stubs: {
1380 versions: ["10", "20", "30"],
1381 },
1382 }
1383
1384 cc_library {
1385 name: "libbar",
1386 srcs: ["mylib.cpp"],
1387 system_shared_libs: [],
1388 stl: "none",
1389 }
1390
Jiyong Park678c8812020-02-07 17:25:49 +09001391 cc_library_static {
1392 name: "libbaz",
1393 srcs: ["mylib.cpp"],
1394 system_shared_libs: [],
1395 stl: "none",
1396 apex_available: [ "myapex2" ],
1397 }
1398
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 `)
1400
Jooyung Hana0503a52023-08-23 13:12:50 +09001401 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001402 copyCmds := apexRule.Args["copy_commands"]
1403
1404 // Ensure that direct non-stubs dep is always included
1405 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1406
1407 // Ensure that indirect stubs dep is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1409
1410 // Ensure that dependency of stubs is not included
1411 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1412
Colin Crossaede88c2020-08-11 12:17:01 -07001413 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414
1415 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001416 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001417 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001418 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001419
Jiyong Park3ff16992019-12-27 14:11:47 +09001420 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001421
1422 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1423 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001424
Colin Crossf61d03d2023-11-02 16:56:39 -07001425 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1426 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001427 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001428
Colin Crossf61d03d2023-11-02 16:56:39 -07001429 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1430 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001431 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001432}
1433
Jooyung Hand3639552019-08-09 12:57:43 +09001434func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001435 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001436 /*
1437 myapex
1438 |
1439 v (runtime_libs)
1440 mylib ------+------> libfoo [provides stub]
1441 |
1442 `------> libbar
1443 */
Colin Cross1c460562021-02-16 17:55:47 -08001444 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001445 apex {
1446 name: "myapex",
1447 key: "myapex.key",
1448 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001449 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001450 }
1451
1452 apex_key {
1453 name: "myapex.key",
1454 public_key: "testkey.avbpubkey",
1455 private_key: "testkey.pem",
1456 }
1457
1458 cc_library {
1459 name: "mylib",
1460 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001461 static_libs: ["libstatic"],
1462 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001463 runtime_libs: ["libfoo", "libbar"],
1464 system_shared_libs: [],
1465 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001466 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001467 }
1468
1469 cc_library {
1470 name: "libfoo",
1471 srcs: ["mylib.cpp"],
1472 system_shared_libs: [],
1473 stl: "none",
1474 stubs: {
1475 versions: ["10", "20", "30"],
1476 },
1477 }
1478
1479 cc_library {
1480 name: "libbar",
1481 srcs: ["mylib.cpp"],
1482 system_shared_libs: [],
1483 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001484 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001485 }
1486
Liz Kammer5f108fa2023-05-11 14:33:17 -04001487 cc_library {
1488 name: "libstatic",
1489 srcs: ["mylib.cpp"],
1490 system_shared_libs: [],
1491 stl: "none",
1492 apex_available: [ "myapex" ],
1493 runtime_libs: ["libstatic_to_runtime"],
1494 }
1495
1496 cc_library {
1497 name: "libshared",
1498 srcs: ["mylib.cpp"],
1499 system_shared_libs: [],
1500 stl: "none",
1501 apex_available: [ "myapex" ],
1502 runtime_libs: ["libshared_to_runtime"],
1503 }
1504
1505 cc_library {
1506 name: "libstatic_to_runtime",
1507 srcs: ["mylib.cpp"],
1508 system_shared_libs: [],
1509 stl: "none",
1510 apex_available: [ "myapex" ],
1511 }
1512
1513 cc_library {
1514 name: "libshared_to_runtime",
1515 srcs: ["mylib.cpp"],
1516 system_shared_libs: [],
1517 stl: "none",
1518 apex_available: [ "myapex" ],
1519 }
Jooyung Hand3639552019-08-09 12:57:43 +09001520 `)
1521
Jooyung Hana0503a52023-08-23 13:12:50 +09001522 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001523 copyCmds := apexRule.Args["copy_commands"]
1524
1525 // Ensure that direct non-stubs dep is always included
1526 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1527
1528 // Ensure that indirect stubs dep is not included
1529 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1530
1531 // Ensure that runtime_libs dep in included
1532 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001533 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1534 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1535
1536 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001537
Jooyung Hana0503a52023-08-23 13:12:50 +09001538 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001539 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1540 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001541}
1542
Paul Duffina02cae32021-03-09 01:44:06 +00001543var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1544 cc.PrepareForTestWithCcBuildComponents,
1545 PrepareForTestWithApexBuildComponents,
1546 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001547 apex {
1548 name: "com.android.runtime",
1549 key: "com.android.runtime.key",
1550 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001551 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001552 }
1553
1554 apex_key {
1555 name: "com.android.runtime.key",
1556 public_key: "testkey.avbpubkey",
1557 private_key: "testkey.pem",
1558 }
Paul Duffina02cae32021-03-09 01:44:06 +00001559 `),
1560 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1561)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001562
Paul Duffina02cae32021-03-09 01:44:06 +00001563func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001564 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001565 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001566 cc_library {
1567 name: "libc",
1568 no_libcrt: true,
1569 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001570 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001571 stl: "none",
1572 system_shared_libs: [],
1573 stubs: { versions: ["1"] },
1574 apex_available: ["com.android.runtime"],
1575
1576 sanitize: {
1577 hwaddress: true,
1578 }
1579 }
1580
1581 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001582 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 no_libcrt: true,
1584 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001585 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001586 stl: "none",
1587 system_shared_libs: [],
1588 srcs: [""],
1589 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001590 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001591
1592 sanitize: {
1593 never: true,
1594 },
Spandan Das4de7b492023-05-05 21:13:01 +00001595 apex_available: [
1596 "//apex_available:anyapex",
1597 "//apex_available:platform",
1598 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001599 } `)
1600 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001601
Jooyung Hana0503a52023-08-23 13:12:50 +09001602 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001603 "lib64/bionic/libc.so",
1604 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1605 })
1606
Colin Cross4c4c1be2022-02-10 11:41:18 -08001607 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001608
1609 installed := hwasan.Description("install libclang_rt.hwasan")
1610 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1611
1612 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1613 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1614 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1615}
1616
1617func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001618 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001619 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001620 prepareForTestOfRuntimeApexWithHwasan,
1621 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1622 variables.SanitizeDevice = []string{"hwaddress"}
1623 }),
1624 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001625 cc_library {
1626 name: "libc",
1627 no_libcrt: true,
1628 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001629 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001630 stl: "none",
1631 system_shared_libs: [],
1632 stubs: { versions: ["1"] },
1633 apex_available: ["com.android.runtime"],
1634 }
1635
1636 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001637 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 no_libcrt: true,
1639 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001640 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001641 stl: "none",
1642 system_shared_libs: [],
1643 srcs: [""],
1644 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001645 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001646
1647 sanitize: {
1648 never: true,
1649 },
Spandan Das4de7b492023-05-05 21:13:01 +00001650 apex_available: [
1651 "//apex_available:anyapex",
1652 "//apex_available:platform",
1653 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654 }
Paul Duffina02cae32021-03-09 01:44:06 +00001655 `)
1656 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001657
Jooyung Hana0503a52023-08-23 13:12:50 +09001658 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001659 "lib64/bionic/libc.so",
1660 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1661 })
1662
Colin Cross4c4c1be2022-02-10 11:41:18 -08001663 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001664
1665 installed := hwasan.Description("install libclang_rt.hwasan")
1666 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1667
1668 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1669 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1670 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1671}
1672
Jooyung Han61b66e92020-03-21 14:21:46 +00001673func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001674 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001675 testcases := []struct {
1676 name string
1677 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001678 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001679 shouldLink string
1680 shouldNotLink []string
1681 }{
1682 {
Jiyong Park55549df2021-02-26 23:57:23 +09001683 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001684 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001685 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001686 shouldLink: "current",
1687 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 },
1689 {
Jiyong Park55549df2021-02-26 23:57:23 +09001690 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001691 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001692 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001693 shouldLink: "current",
1694 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001695 },
1696 }
1697 for _, tc := range testcases {
1698 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001699 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001700 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 apex {
1702 name: "myapex",
1703 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001705 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001706 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001707 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001708
Jooyung Han61b66e92020-03-21 14:21:46 +00001709 apex_key {
1710 name: "myapex.key",
1711 public_key: "testkey.avbpubkey",
1712 private_key: "testkey.pem",
1713 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001714
Jooyung Han61b66e92020-03-21 14:21:46 +00001715 cc_library {
1716 name: "mylib",
1717 srcs: ["mylib.cpp"],
1718 vendor_available: true,
1719 shared_libs: ["libbar"],
1720 system_shared_libs: [],
1721 stl: "none",
1722 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001723 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001725
Jooyung Han61b66e92020-03-21 14:21:46 +00001726 cc_library {
1727 name: "libbar",
1728 srcs: ["mylib.cpp"],
1729 system_shared_libs: [],
1730 stl: "none",
1731 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001732 llndk: {
1733 symbol_file: "libbar.map.txt",
1734 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001735 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001736 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001737 withUnbundledBuild,
1738 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001739
Jooyung Han61b66e92020-03-21 14:21:46 +00001740 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001741 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 "lib64/mylib.so",
1743 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001744
Jooyung Han61b66e92020-03-21 14:21:46 +00001745 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001746 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001747 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1748 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001749
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1751 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001752 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001754 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001755
Steven Moreland2c4000c2021-04-27 02:08:49 +00001756 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001757 ver := tc.shouldLink
1758 if tc.shouldLink == "current" {
1759 ver = strconv.Itoa(android.FutureApiLevelInt)
1760 }
1761 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001762 })
1763 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001764}
1765
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001767 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001768 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001769 apex {
1770 name: "myapex",
1771 key: "myapex.key",
1772 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001773 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001774 }
1775
1776 apex_key {
1777 name: "myapex.key",
1778 public_key: "testkey.avbpubkey",
1779 private_key: "testkey.pem",
1780 }
1781
1782 cc_library {
1783 name: "mylib",
1784 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001785 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 shared_libs: ["libdl#27"],
1787 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001788 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001789 }
1790
1791 cc_library_shared {
1792 name: "mylib_shared",
1793 srcs: ["mylib.cpp"],
1794 shared_libs: ["libdl#27"],
1795 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001796 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001797 }
1798
1799 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001800 name: "libBootstrap",
1801 srcs: ["mylib.cpp"],
1802 stl: "none",
1803 bootstrap: true,
1804 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 `)
1806
Jooyung Hana0503a52023-08-23 13:12:50 +09001807 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001808 copyCmds := apexRule.Args["copy_commands"]
1809
1810 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001811 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001812 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1813 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
1815 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001816 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817
Colin Crossaede88c2020-08-11 12:17:01 -07001818 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1819 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1820 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001821
1822 // For dependency to libc
1823 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001824 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001825 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001826 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001828 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1829 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001830
1831 // For dependency to libm
1832 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001833 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001834 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001835 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001836 // ... and is not compiling with the stub
1837 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1838 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1839
1840 // For dependency to libdl
1841 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001842 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1845 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001846 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001847 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001848 // ... Cflags from stub is correctly exported to mylib
1849 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1850 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001851
1852 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001853 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1854 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1855 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1856 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001857}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001858
Jooyung Han749dc692020-04-15 11:03:39 +09001859func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001860 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001861 // there are three links between liba --> libz.
1862 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001863 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001864 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001865 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001866 apex {
1867 name: "myapex",
1868 key: "myapex.key",
1869 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001870 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001871 }
1872
1873 apex {
1874 name: "otherapex",
1875 key: "myapex.key",
1876 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001877 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001878 }
1879
1880 apex_key {
1881 name: "myapex.key",
1882 public_key: "testkey.avbpubkey",
1883 private_key: "testkey.pem",
1884 }
1885
1886 cc_library {
1887 name: "libx",
1888 shared_libs: ["liba"],
1889 system_shared_libs: [],
1890 stl: "none",
1891 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001892 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001893 }
1894
1895 cc_library {
1896 name: "liby",
1897 shared_libs: ["liba"],
1898 system_shared_libs: [],
1899 stl: "none",
1900 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001901 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001902 }
1903
1904 cc_library {
1905 name: "liba",
1906 shared_libs: ["libz"],
1907 system_shared_libs: [],
1908 stl: "none",
1909 apex_available: [
1910 "//apex_available:anyapex",
1911 "//apex_available:platform",
1912 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001913 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001914 }
1915
1916 cc_library {
1917 name: "libz",
1918 system_shared_libs: [],
1919 stl: "none",
1920 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001921 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001922 },
1923 }
Jooyung Han749dc692020-04-15 11:03:39 +09001924 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001925
1926 expectLink := func(from, from_variant, to, to_variant string) {
1927 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1928 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1929 }
1930 expectNoLink := func(from, from_variant, to, to_variant string) {
1931 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1932 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1933 }
1934 // platform liba is linked to non-stub version
1935 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001936 // liba in myapex is linked to current
1937 expectLink("liba", "shared_apex29", "libz", "shared_current")
1938 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001939 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001940 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001941 // liba in otherapex is linked to current
1942 expectLink("liba", "shared_apex30", "libz", "shared_current")
1943 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001944 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1945 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001946}
1947
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001949 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001950 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001951 apex {
1952 name: "myapex",
1953 key: "myapex.key",
1954 native_shared_libs: ["libx"],
1955 min_sdk_version: "R",
1956 }
1957
1958 apex_key {
1959 name: "myapex.key",
1960 public_key: "testkey.avbpubkey",
1961 private_key: "testkey.pem",
1962 }
1963
1964 cc_library {
1965 name: "libx",
1966 shared_libs: ["libz"],
1967 system_shared_libs: [],
1968 stl: "none",
1969 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001970 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001971 }
1972
1973 cc_library {
1974 name: "libz",
1975 system_shared_libs: [],
1976 stl: "none",
1977 stubs: {
1978 versions: ["29", "R"],
1979 },
1980 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001981 `,
1982 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1983 variables.Platform_version_active_codenames = []string{"R"}
1984 }),
1985 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001986
1987 expectLink := func(from, from_variant, to, to_variant string) {
1988 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1989 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1990 }
1991 expectNoLink := func(from, from_variant, to, to_variant string) {
1992 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1993 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1994 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001995 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1996 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001997 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1998 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001999}
2000
Jooyung Han4c4da062021-06-23 10:23:16 +09002001func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002002 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002003 testApex(t, `
2004 apex {
2005 name: "myapex",
2006 key: "myapex.key",
2007 java_libs: ["libx"],
2008 min_sdk_version: "S",
2009 }
2010
2011 apex_key {
2012 name: "myapex.key",
2013 public_key: "testkey.avbpubkey",
2014 private_key: "testkey.pem",
2015 }
2016
2017 java_library {
2018 name: "libx",
2019 srcs: ["a.java"],
2020 apex_available: [ "myapex" ],
2021 sdk_version: "current",
2022 min_sdk_version: "S", // should be okay
2023 }
2024 `,
2025 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2026 variables.Platform_version_active_codenames = []string{"S"}
2027 variables.Platform_sdk_codename = proptools.StringPtr("S")
2028 }),
2029 )
2030}
2031
Jooyung Han749dc692020-04-15 11:03:39 +09002032func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002033 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002034 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002035 apex {
2036 name: "myapex",
2037 key: "myapex.key",
2038 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002039 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002040 }
2041
2042 apex_key {
2043 name: "myapex.key",
2044 public_key: "testkey.avbpubkey",
2045 private_key: "testkey.pem",
2046 }
2047
2048 cc_library {
2049 name: "libx",
2050 shared_libs: ["libz"],
2051 system_shared_libs: [],
2052 stl: "none",
2053 apex_available: [ "myapex" ],
2054 }
2055
2056 cc_library {
2057 name: "libz",
2058 system_shared_libs: [],
2059 stl: "none",
2060 stubs: {
2061 versions: ["1", "2"],
2062 },
2063 }
2064 `)
2065
2066 expectLink := func(from, from_variant, to, to_variant string) {
2067 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2068 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2069 }
2070 expectNoLink := func(from, from_variant, to, to_variant string) {
2071 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2072 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2073 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002076 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002077 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002078}
2079
Jooyung Handfc864c2023-03-20 18:19:07 +09002080func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002081 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002082 ctx := testApex(t, `
2083 apex {
2084 name: "myapex",
2085 key: "myapex.key",
2086 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002087 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002088 vendor: true,
2089 min_sdk_version: "29",
2090 }
2091
2092 apex_key {
2093 name: "myapex.key",
2094 public_key: "testkey.avbpubkey",
2095 private_key: "testkey.pem",
2096 }
2097
2098 cc_library {
2099 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002100 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002101 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002102 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002103 shared_libs: ["libbar"],
2104 }
2105
2106 cc_library {
2107 name: "libbar",
2108 stubs: { versions: ["29", "30"] },
2109 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002110 }
2111 `)
2112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002114
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002115 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002116
2117 // Ensure that mylib links with "current" LLNDK
2118 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002119 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002120
2121 // Ensure that mylib is targeting 29
2122 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2123 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2124
2125 // Ensure that the correct variant of crtbegin_so is used.
2126 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2127 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002128
2129 // Ensure that the crtbegin_so used by the APEX is targeting 29
2130 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2131 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2132}
2133
Jooyung Han4495f842023-04-25 16:39:59 +09002134func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002135 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002136 ctx := testApex(t, `
2137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 updatable: true,
2141 native_shared_libs: [
2142 "mylib",
2143 "yourlib",
2144 ],
2145 min_sdk_version: "29",
2146 }
2147
2148 apex {
2149 name: "myapex2",
2150 key: "myapex.key",
2151 updatable: false,
2152 native_shared_libs: ["yourlib"],
2153 }
2154
2155 apex_key {
2156 name: "myapex.key",
2157 public_key: "testkey.avbpubkey",
2158 private_key: "testkey.pem",
2159 }
2160
2161 cc_library {
2162 name: "mylib",
2163 srcs: ["mylib.cpp"],
2164 shared_libs: ["libbar"],
2165 min_sdk_version: "29",
2166 apex_available: ["myapex"],
2167 }
2168
2169 cc_library {
2170 name: "libbar",
2171 stubs: { versions: ["29", "30"] },
2172 }
2173
2174 cc_library {
2175 name: "yourlib",
2176 srcs: ["mylib.cpp"],
2177 min_sdk_version: "29",
2178 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2179 }
2180 `, withFiles(android.MockFS{
2181 "packages/modules/common/build/allowed_deps.txt": nil,
2182 }))
2183
2184 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2185 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2186 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002188 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002189 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002190
Jooyung Hana0503a52023-08-23 13:12:50 +09002191 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002192 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2193 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002194 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2195 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2196 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2197 flatlist, "mylib:(minSdkVersion:29)")
2198 android.AssertStringListContains(t, "track platform-available lib",
2199 flatlist, "yourlib(minSdkVersion:29)")
2200}
2201
Nouby Mohamed8609a552024-09-04 22:19:51 +00002202func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002203 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002204 ctx := testApex(t, `
2205 apex {
2206 name: "myapex",
2207 key: "myapex.key",
2208 updatable: true,
2209 native_shared_libs: [
2210 "mylib",
2211 "yourlib",
2212 ],
2213 min_sdk_version: "29",
2214 }
2215
2216 apex {
2217 name: "myapex2",
2218 key: "myapex.key",
2219 updatable: false,
2220 native_shared_libs: ["yourlib"],
2221 }
2222
2223 apex_key {
2224 name: "myapex.key",
2225 public_key: "testkey.avbpubkey",
2226 private_key: "testkey.pem",
2227 }
2228
2229 cc_library {
2230 name: "mylib",
2231 srcs: ["mylib.cpp"],
2232 shared_libs: ["libbar"],
2233 min_sdk_version: "29",
2234 apex_available: ["myapex"],
2235 }
2236
2237 cc_library {
2238 name: "libbar",
2239 stubs: { versions: ["29", "30"] },
2240 }
2241
2242 cc_library {
2243 name: "yourlib",
2244 srcs: ["mylib.cpp"],
2245 min_sdk_version: "29",
2246 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2247 }
2248 `, withFiles(android.MockFS{
2249 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2250 }),
2251 android.FixtureModifyProductVariables(
2252 func(variables android.FixtureProductVariables) {
2253 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2254 },
2255 ))
2256
2257 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2258 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2259 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2260 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2261 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2262 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2263
2264 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2265 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2266 myapex.Output("depsinfo/flatlist.txt")), "\n")
2267 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2268 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2269 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2270 flatlist, "mylib:(minSdkVersion:29)")
2271 android.AssertStringListContains(t, "track platform-available lib",
2272 flatlist, "yourlib(minSdkVersion:29)")
2273}
2274
2275func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002276 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002277 ctx := testApex(t, `
2278 apex {
2279 name: "myapex",
2280 key: "myapex.key",
2281 updatable: true,
2282 native_shared_libs: [
2283 "mylib",
2284 "yourlib",
2285 ],
2286 min_sdk_version: "29",
2287 }
2288
2289 apex {
2290 name: "myapex2",
2291 key: "myapex.key",
2292 updatable: false,
2293 native_shared_libs: ["yourlib"],
2294 }
2295
2296 apex_key {
2297 name: "myapex.key",
2298 public_key: "testkey.avbpubkey",
2299 private_key: "testkey.pem",
2300 }
2301
2302 cc_library {
2303 name: "mylib",
2304 srcs: ["mylib.cpp"],
2305 shared_libs: ["libbar"],
2306 min_sdk_version: "29",
2307 apex_available: ["myapex"],
2308 }
2309
2310 cc_library {
2311 name: "libbar",
2312 stubs: { versions: ["29", "30"] },
2313 }
2314
2315 cc_library {
2316 name: "yourlib",
2317 srcs: ["mylib.cpp"],
2318 min_sdk_version: "29",
2319 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2320 }
2321 `, withFiles(android.MockFS{
2322 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2323 "packages/modules/common/build/allowed_deps.txt": nil,
2324 }),
2325 android.FixtureModifyProductVariables(
2326 func(variables android.FixtureProductVariables) {
2327 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2328 },
2329 ))
2330
2331 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2332 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2333 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2334 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2335 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2336 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2337
2338 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2339 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2340 myapex.Output("depsinfo/flatlist.txt")), "\n")
2341 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2342 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2343 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2344 flatlist, "mylib:(minSdkVersion:29)")
2345 android.AssertStringListContains(t, "track platform-available lib",
2346 flatlist, "yourlib(minSdkVersion:29)")
2347}
2348
Jooyung Han4495f842023-04-25 16:39:59 +09002349func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002350 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002351 ctx := testApex(t, `
2352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
2355 updatable: true,
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 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2366 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2367 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2368 }
2369}
2370
Jooyung Han03b51852020-02-26 22:45:42 +09002371func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002372 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002373 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002374 apex {
2375 name: "myapex",
2376 key: "myapex.key",
2377 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002378 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002379 }
2380
2381 apex_key {
2382 name: "myapex.key",
2383 public_key: "testkey.avbpubkey",
2384 private_key: "testkey.pem",
2385 }
2386
2387 cc_library {
2388 name: "libx",
2389 system_shared_libs: [],
2390 stl: "none",
2391 apex_available: [ "myapex" ],
2392 stubs: {
2393 versions: ["1", "2"],
2394 },
2395 }
2396
2397 cc_library {
2398 name: "libz",
2399 shared_libs: ["libx"],
2400 system_shared_libs: [],
2401 stl: "none",
2402 }
2403 `)
2404
2405 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002406 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002407 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2408 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2409 }
2410 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002411 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002412 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2413 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2414 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002415 expectLink("libz", "shared", "libx", "shared_current")
2416 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002417 expectNoLink("libz", "shared", "libz", "shared_1")
2418 expectNoLink("libz", "shared", "libz", "shared")
2419}
2420
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002421var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2422 func(variables android.FixtureProductVariables) {
2423 variables.SanitizeDevice = []string{"hwaddress"}
2424 },
2425)
2426
Jooyung Han75568392020-03-20 04:29:24 +09002427func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002428 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002429 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002430 apex {
2431 name: "myapex",
2432 key: "myapex.key",
2433 native_shared_libs: ["libx"],
2434 min_sdk_version: "29",
2435 }
2436
2437 apex_key {
2438 name: "myapex.key",
2439 public_key: "testkey.avbpubkey",
2440 private_key: "testkey.pem",
2441 }
2442
2443 cc_library {
2444 name: "libx",
2445 shared_libs: ["libbar"],
2446 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002447 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002448 }
2449
2450 cc_library {
2451 name: "libbar",
2452 stubs: {
2453 versions: ["29", "30"],
2454 },
2455 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002456 `,
2457 prepareForTestWithSantitizeHwaddress,
2458 )
Jooyung Han03b51852020-02-26 22:45:42 +09002459 expectLink := func(from, from_variant, to, to_variant string) {
2460 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2461 libFlags := ld.Args["libFlags"]
2462 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2463 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002464 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002465}
2466
Jooyung Han75568392020-03-20 04:29:24 +09002467func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002468 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002469 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002470 apex {
2471 name: "myapex",
2472 key: "myapex.key",
2473 native_shared_libs: ["libx"],
2474 min_sdk_version: "29",
2475 }
2476
2477 apex_key {
2478 name: "myapex.key",
2479 public_key: "testkey.avbpubkey",
2480 private_key: "testkey.pem",
2481 }
2482
2483 cc_library {
2484 name: "libx",
2485 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002486 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002487 }
Jooyung Han75568392020-03-20 04:29:24 +09002488 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002489
2490 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002491 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002492 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002493 // note that platform variant is not.
2494 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002495 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002496}
2497
Jooyung Han749dc692020-04-15 11:03:39 +09002498func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002499 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002500 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002501 apex {
2502 name: "myapex",
2503 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002504 native_shared_libs: ["mylib"],
2505 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002506 }
2507
2508 apex_key {
2509 name: "myapex.key",
2510 public_key: "testkey.avbpubkey",
2511 private_key: "testkey.pem",
2512 }
Jooyung Han749dc692020-04-15 11:03:39 +09002513
2514 cc_library {
2515 name: "mylib",
2516 srcs: ["mylib.cpp"],
2517 system_shared_libs: [],
2518 stl: "none",
2519 apex_available: [
2520 "myapex",
2521 ],
2522 min_sdk_version: "30",
2523 }
2524 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002525
2526 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2527 apex {
2528 name: "myapex",
2529 key: "myapex.key",
2530 native_shared_libs: ["libfoo.ffi"],
2531 min_sdk_version: "29",
2532 }
2533
2534 apex_key {
2535 name: "myapex.key",
2536 public_key: "testkey.avbpubkey",
2537 private_key: "testkey.pem",
2538 }
2539
2540 rust_ffi_shared {
2541 name: "libfoo.ffi",
2542 srcs: ["foo.rs"],
2543 crate_name: "foo",
2544 apex_available: [
2545 "myapex",
2546 ],
2547 min_sdk_version: "30",
2548 }
2549 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002550
2551 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2552 apex {
2553 name: "myapex",
2554 key: "myapex.key",
2555 java_libs: ["libfoo"],
2556 min_sdk_version: "29",
2557 }
2558
2559 apex_key {
2560 name: "myapex.key",
2561 public_key: "testkey.avbpubkey",
2562 private_key: "testkey.pem",
2563 }
2564
2565 java_import {
2566 name: "libfoo",
2567 jars: ["libfoo.jar"],
2568 apex_available: [
2569 "myapex",
2570 ],
2571 min_sdk_version: "30",
2572 }
2573 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002574
2575 // Skip check for modules compiling against core API surface
2576 testApex(t, `
2577 apex {
2578 name: "myapex",
2579 key: "myapex.key",
2580 java_libs: ["libfoo"],
2581 min_sdk_version: "29",
2582 }
2583
2584 apex_key {
2585 name: "myapex.key",
2586 public_key: "testkey.avbpubkey",
2587 private_key: "testkey.pem",
2588 }
2589
2590 java_library {
2591 name: "libfoo",
2592 srcs: ["Foo.java"],
2593 apex_available: [
2594 "myapex",
2595 ],
2596 // Compile against core API surface
2597 sdk_version: "core_current",
2598 min_sdk_version: "30",
2599 }
2600 `)
2601
Jooyung Han749dc692020-04-15 11:03:39 +09002602}
2603
2604func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002605 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002606 testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 native_shared_libs: ["libfoo"],
2611 java_libs: ["libbar"],
2612 min_sdk_version: "29",
2613 }
2614
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
2619 }
2620
2621 cc_library {
2622 name: "libfoo",
2623 srcs: ["mylib.cpp"],
2624 shared_libs: ["libfoo_dep"],
2625 apex_available: ["myapex"],
2626 min_sdk_version: "29",
2627 }
2628
2629 cc_library {
2630 name: "libfoo_dep",
2631 srcs: ["mylib.cpp"],
2632 apex_available: ["myapex"],
2633 min_sdk_version: "29",
2634 }
2635
2636 java_library {
2637 name: "libbar",
2638 sdk_version: "current",
2639 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002640 static_libs: [
2641 "libbar_dep",
2642 "libbar_import_dep",
2643 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002644 apex_available: ["myapex"],
2645 min_sdk_version: "29",
2646 }
2647
2648 java_library {
2649 name: "libbar_dep",
2650 sdk_version: "current",
2651 srcs: ["a.java"],
2652 apex_available: ["myapex"],
2653 min_sdk_version: "29",
2654 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002655
2656 java_import {
2657 name: "libbar_import_dep",
2658 jars: ["libbar.jar"],
2659 apex_available: ["myapex"],
2660 min_sdk_version: "29",
2661 }
Jooyung Han03b51852020-02-26 22:45:42 +09002662 `)
2663}
2664
Colin Cross8ca61c12022-10-06 21:00:14 -07002665func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002666 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002667 // Tests that an apex dependency with min_sdk_version higher than the
2668 // min_sdk_version of the apex is allowed as long as the dependency's
2669 // min_sdk_version is less than or equal to the api level that the
2670 // architecture was introduced in. In this case, arm64 didn't exist
2671 // until api level 21, so the arm64 code will never need to run on
2672 // an api level 20 device, even if other architectures of the apex
2673 // will.
2674 testApex(t, `
2675 apex {
2676 name: "myapex",
2677 key: "myapex.key",
2678 native_shared_libs: ["libfoo"],
2679 min_sdk_version: "20",
2680 }
2681
2682 apex_key {
2683 name: "myapex.key",
2684 public_key: "testkey.avbpubkey",
2685 private_key: "testkey.pem",
2686 }
2687
2688 cc_library {
2689 name: "libfoo",
2690 srcs: ["mylib.cpp"],
2691 apex_available: ["myapex"],
2692 min_sdk_version: "21",
2693 stl: "none",
2694 }
2695 `)
2696}
2697
Artur Satayev8cf899a2020-04-15 17:29:42 +01002698func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002699 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002700 testCases := []struct {
2701 name string
2702 expectedError string
2703 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002704 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002705 }{
2706 {
2707 name: "Non-updatable apex with non-stable dep",
2708 bp: `
2709 apex {
2710 name: "myapex",
2711 java_libs: ["myjar"],
2712 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002713 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002714 }
2715 apex_key {
2716 name: "myapex.key",
2717 public_key: "testkey.avbpubkey",
2718 private_key: "testkey.pem",
2719 }
2720 java_library {
2721 name: "myjar",
2722 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002723 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002724 apex_available: ["myapex"],
2725 }
2726 `,
2727 },
2728 {
2729 name: "Updatable apex with stable dep",
2730 bp: `
2731 apex {
2732 name: "myapex",
2733 java_libs: ["myjar"],
2734 key: "myapex.key",
2735 updatable: true,
2736 min_sdk_version: "29",
2737 }
2738 apex_key {
2739 name: "myapex.key",
2740 public_key: "testkey.avbpubkey",
2741 private_key: "testkey.pem",
2742 }
2743 java_library {
2744 name: "myjar",
2745 srcs: ["foo/bar/MyClass.java"],
2746 sdk_version: "current",
2747 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002748 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002749 }
2750 `,
2751 },
2752 {
2753 name: "Updatable apex with non-stable dep",
2754 expectedError: "cannot depend on \"myjar\"",
2755 bp: `
2756 apex {
2757 name: "myapex",
2758 java_libs: ["myjar"],
2759 key: "myapex.key",
2760 updatable: true,
2761 }
2762 apex_key {
2763 name: "myapex.key",
2764 public_key: "testkey.avbpubkey",
2765 private_key: "testkey.pem",
2766 }
2767 java_library {
2768 name: "myjar",
2769 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002770 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002771 apex_available: ["myapex"],
2772 }
2773 `,
2774 },
2775 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002776 name: "Updatable apex with non-stable legacy core platform dep",
2777 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2778 bp: `
2779 apex {
2780 name: "myapex",
2781 java_libs: ["myjar-uses-legacy"],
2782 key: "myapex.key",
2783 updatable: true,
2784 }
2785 apex_key {
2786 name: "myapex.key",
2787 public_key: "testkey.avbpubkey",
2788 private_key: "testkey.pem",
2789 }
2790 java_library {
2791 name: "myjar-uses-legacy",
2792 srcs: ["foo/bar/MyClass.java"],
2793 sdk_version: "core_platform",
2794 apex_available: ["myapex"],
2795 }
2796 `,
2797 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2798 },
2799 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002800 name: "Updatable apex with non-stable transitive dep",
2801 // This is not actually detecting that the transitive dependency is unstable, rather it is
2802 // detecting that the transitive dependency is building against a wider API surface than the
2803 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002804 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002805 bp: `
2806 apex {
2807 name: "myapex",
2808 java_libs: ["myjar"],
2809 key: "myapex.key",
2810 updatable: true,
2811 }
2812 apex_key {
2813 name: "myapex.key",
2814 public_key: "testkey.avbpubkey",
2815 private_key: "testkey.pem",
2816 }
2817 java_library {
2818 name: "myjar",
2819 srcs: ["foo/bar/MyClass.java"],
2820 sdk_version: "current",
2821 apex_available: ["myapex"],
2822 static_libs: ["transitive-jar"],
2823 }
2824 java_library {
2825 name: "transitive-jar",
2826 srcs: ["foo/bar/MyClass.java"],
2827 sdk_version: "core_platform",
2828 apex_available: ["myapex"],
2829 }
2830 `,
2831 },
2832 }
2833
2834 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002835 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2836 continue
2837 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002838 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002839 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002840 errorHandler := android.FixtureExpectsNoErrors
2841 if test.expectedError != "" {
2842 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002843 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002844 android.GroupFixturePreparers(
2845 java.PrepareForTestWithJavaDefaultModules,
2846 PrepareForTestWithApexBuildComponents,
2847 prepareForTestWithMyapex,
2848 android.OptionalFixturePreparer(test.preparer),
2849 ).
2850 ExtendWithErrorHandler(errorHandler).
2851 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002852 })
2853 }
2854}
2855
Jooyung Han749dc692020-04-15 11:03:39 +09002856func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2857 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2858 apex {
2859 name: "myapex",
2860 key: "myapex.key",
2861 native_shared_libs: ["mylib"],
2862 min_sdk_version: "29",
2863 }
2864
2865 apex_key {
2866 name: "myapex.key",
2867 public_key: "testkey.avbpubkey",
2868 private_key: "testkey.pem",
2869 }
2870
2871 cc_library {
2872 name: "mylib",
2873 srcs: ["mylib.cpp"],
2874 shared_libs: ["mylib2"],
2875 system_shared_libs: [],
2876 stl: "none",
2877 apex_available: [
2878 "myapex",
2879 ],
2880 min_sdk_version: "29",
2881 }
2882
2883 // indirect part of the apex
2884 cc_library {
2885 name: "mylib2",
2886 srcs: ["mylib.cpp"],
2887 system_shared_libs: [],
2888 stl: "none",
2889 apex_available: [
2890 "myapex",
2891 ],
2892 min_sdk_version: "30",
2893 }
2894 `)
2895}
2896
2897func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002898 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002899 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2900 apex {
2901 name: "myapex",
2902 key: "myapex.key",
2903 apps: ["AppFoo"],
2904 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002905 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002906 }
2907
2908 apex_key {
2909 name: "myapex.key",
2910 public_key: "testkey.avbpubkey",
2911 private_key: "testkey.pem",
2912 }
2913
2914 android_app {
2915 name: "AppFoo",
2916 srcs: ["foo/bar/MyClass.java"],
2917 sdk_version: "current",
2918 min_sdk_version: "29",
2919 system_modules: "none",
2920 stl: "none",
2921 static_libs: ["bar"],
2922 apex_available: [ "myapex" ],
2923 }
2924
2925 java_library {
2926 name: "bar",
2927 sdk_version: "current",
2928 srcs: ["a.java"],
2929 apex_available: [ "myapex" ],
2930 }
2931 `)
2932}
2933
2934func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002935 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002936 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002937 apex {
2938 name: "myapex",
2939 key: "myapex.key",
2940 native_shared_libs: ["mylib"],
2941 min_sdk_version: "29",
2942 }
2943
2944 apex_key {
2945 name: "myapex.key",
2946 public_key: "testkey.avbpubkey",
2947 private_key: "testkey.pem",
2948 }
2949
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002950 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002951 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2952 cc_library {
2953 name: "mylib",
2954 srcs: ["mylib.cpp"],
2955 shared_libs: ["mylib2"],
2956 system_shared_libs: [],
2957 stl: "none",
2958 apex_available: ["myapex", "otherapex"],
2959 min_sdk_version: "29",
2960 }
2961
2962 cc_library {
2963 name: "mylib2",
2964 srcs: ["mylib.cpp"],
2965 system_shared_libs: [],
2966 stl: "none",
2967 apex_available: ["otherapex"],
2968 stubs: { versions: ["29", "30"] },
2969 min_sdk_version: "30",
2970 }
2971
2972 apex {
2973 name: "otherapex",
2974 key: "myapex.key",
2975 native_shared_libs: ["mylib", "mylib2"],
2976 min_sdk_version: "30",
2977 }
2978 `)
2979 expectLink := func(from, from_variant, to, to_variant string) {
2980 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2981 libFlags := ld.Args["libFlags"]
2982 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2983 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002984 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002985 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002986}
2987
Jooyung Haned124c32021-01-26 11:43:46 +09002988func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002989 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002990 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2991 func(variables android.FixtureProductVariables) {
2992 variables.Platform_sdk_codename = proptools.StringPtr("S")
2993 variables.Platform_version_active_codenames = []string{"S"}
2994 },
2995 )
Jooyung Haned124c32021-01-26 11:43:46 +09002996 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2997 apex {
2998 name: "myapex",
2999 key: "myapex.key",
3000 native_shared_libs: ["libfoo"],
3001 min_sdk_version: "S",
3002 }
3003 apex_key {
3004 name: "myapex.key",
3005 public_key: "testkey.avbpubkey",
3006 private_key: "testkey.pem",
3007 }
3008 cc_library {
3009 name: "libfoo",
3010 shared_libs: ["libbar"],
3011 apex_available: ["myapex"],
3012 min_sdk_version: "29",
3013 }
3014 cc_library {
3015 name: "libbar",
3016 apex_available: ["myapex"],
3017 }
3018 `, withSAsActiveCodeNames)
3019}
3020
3021func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003022 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003023 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3024 variables.Platform_sdk_codename = proptools.StringPtr("S")
3025 variables.Platform_version_active_codenames = []string{"S", "T"}
3026 })
Colin Cross1c460562021-02-16 17:55:47 -08003027 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003028 apex {
3029 name: "myapex",
3030 key: "myapex.key",
3031 native_shared_libs: ["libfoo"],
3032 min_sdk_version: "S",
3033 }
3034 apex_key {
3035 name: "myapex.key",
3036 public_key: "testkey.avbpubkey",
3037 private_key: "testkey.pem",
3038 }
3039 cc_library {
3040 name: "libfoo",
3041 shared_libs: ["libbar"],
3042 apex_available: ["myapex"],
3043 min_sdk_version: "S",
3044 }
3045 cc_library {
3046 name: "libbar",
3047 stubs: {
3048 symbol_file: "libbar.map.txt",
3049 versions: ["30", "S", "T"],
3050 },
3051 }
3052 `, withSAsActiveCodeNames)
3053
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003054 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003055 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3056 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003057 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003058}
3059
Jiyong Park7c2ee712018-12-07 00:42:25 +09003060func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003061 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003062 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003063 apex {
3064 name: "myapex",
3065 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003066 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003067 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003068 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003069 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003070 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003071 }
3072
3073 apex_key {
3074 name: "myapex.key",
3075 public_key: "testkey.avbpubkey",
3076 private_key: "testkey.pem",
3077 }
3078
3079 prebuilt_etc {
3080 name: "myetc",
3081 src: "myprebuilt",
3082 sub_dir: "foo/bar",
3083 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003084
3085 cc_library {
3086 name: "mylib",
3087 srcs: ["mylib.cpp"],
3088 relative_install_path: "foo/bar",
3089 system_shared_libs: [],
3090 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003091 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003092 }
3093
3094 cc_binary {
3095 name: "mybin",
3096 srcs: ["mylib.cpp"],
3097 relative_install_path: "foo/bar",
3098 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003100 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003101 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003102
3103 rust_binary {
3104 name: "mybin.rust",
3105 srcs: ["foo.rs"],
3106 relative_install_path: "rust_subdir",
3107 apex_available: [ "myapex" ],
3108 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003109 `)
3110
Jooyung Hana0503a52023-08-23 13:12:50 +09003111 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003112 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003113
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003114 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003115 ensureContains(t, cmd, "/etc ")
3116 ensureContains(t, cmd, "/etc/foo ")
3117 ensureContains(t, cmd, "/etc/foo/bar ")
3118 ensureContains(t, cmd, "/lib64 ")
3119 ensureContains(t, cmd, "/lib64/foo ")
3120 ensureContains(t, cmd, "/lib64/foo/bar ")
3121 ensureContains(t, cmd, "/lib ")
3122 ensureContains(t, cmd, "/lib/foo ")
3123 ensureContains(t, cmd, "/lib/foo/bar ")
3124 ensureContains(t, cmd, "/bin ")
3125 ensureContains(t, cmd, "/bin/foo ")
3126 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003127 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003128}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003129
Jooyung Han35155c42020-02-06 17:33:20 +09003130func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003131 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003132 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003133 apex {
3134 name: "myapex",
3135 key: "myapex.key",
3136 multilib: {
3137 both: {
3138 native_shared_libs: ["mylib"],
3139 binaries: ["mybin"],
3140 },
3141 },
3142 compile_multilib: "both",
3143 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003144 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003145 }
3146
3147 apex_key {
3148 name: "myapex.key",
3149 public_key: "testkey.avbpubkey",
3150 private_key: "testkey.pem",
3151 }
3152
3153 cc_library {
3154 name: "mylib",
3155 relative_install_path: "foo/bar",
3156 system_shared_libs: [],
3157 stl: "none",
3158 apex_available: [ "myapex" ],
3159 native_bridge_supported: true,
3160 }
3161
3162 cc_binary {
3163 name: "mybin",
3164 relative_install_path: "foo/bar",
3165 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003166 stl: "none",
3167 apex_available: [ "myapex" ],
3168 native_bridge_supported: true,
3169 compile_multilib: "both", // default is "first" for binary
3170 multilib: {
3171 lib64: {
3172 suffix: "64",
3173 },
3174 },
3175 }
3176 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003177 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003178 "bin/foo/bar/mybin",
3179 "bin/foo/bar/mybin64",
3180 "bin/arm/foo/bar/mybin",
3181 "bin/arm64/foo/bar/mybin64",
3182 "lib/foo/bar/mylib.so",
3183 "lib/arm/foo/bar/mylib.so",
3184 "lib64/foo/bar/mylib.so",
3185 "lib64/arm64/foo/bar/mylib.so",
3186 })
3187}
3188
Jooyung Han85d61762020-06-24 23:50:26 +09003189func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003190 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003191 result := android.GroupFixturePreparers(
3192 prepareForApexTest,
3193 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3194 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003195 apex {
3196 name: "myapex",
3197 key: "myapex.key",
3198 binaries: ["mybin"],
3199 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003200 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003201 }
3202 apex_key {
3203 name: "myapex.key",
3204 public_key: "testkey.avbpubkey",
3205 private_key: "testkey.pem",
3206 }
3207 cc_binary {
3208 name: "mybin",
3209 vendor: true,
3210 shared_libs: ["libfoo"],
3211 }
3212 cc_library {
3213 name: "libfoo",
3214 proprietary: true,
3215 }
3216 `)
3217
Jooyung Hana0503a52023-08-23 13:12:50 +09003218 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003219 "bin/mybin",
3220 "lib64/libfoo.so",
3221 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3222 "lib64/libc++.so",
3223 })
3224
Jooyung Hana0503a52023-08-23 13:12:50 +09003225 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003226 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003227 name := apexBundle.BaseModuleName()
3228 prefix := "TARGET_"
3229 var builder strings.Builder
3230 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003231 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003232 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003233 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003234
Jooyung Hana0503a52023-08-23 13:12:50 +09003235 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003236 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3237 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003238}
3239
Justin Yun13decfb2021-03-08 19:25:55 +09003240func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003241 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003242 ctx := testApex(t, `
3243 apex {
3244 name: "myapex",
3245 key: "myapex.key",
3246 updatable: false,
3247 product_specific: true,
3248 binaries: ["foo"],
3249 }
3250
3251 apex_key {
3252 name: "myapex.key",
3253 public_key: "testkey.avbpubkey",
3254 private_key: "testkey.pem",
3255 }
3256
3257 cc_binary {
3258 name: "foo",
3259 product_available: true,
3260 apex_available: ["myapex"],
3261 srcs: ["foo.cpp"],
3262 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003263 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003264
3265 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003266 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003267 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3268 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3269 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3270 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3271}
3272
Jooyung Han8e5685d2020-09-21 11:02:57 +09003273func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003274 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003275 testCases := []struct {
3276 name string
3277 additionalProp string
3278 }{
3279 {"system apex with prebuilt_firmware", ""},
3280 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3281 }
3282 for _, tc := range testCases {
3283 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003284 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003285 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003286 apex {
3287 name: "myapex",
3288 key: "myapex.key",
3289 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003290 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003291 `+tc.additionalProp+`
3292 }
3293 apex_key {
3294 name: "myapex.key",
3295 public_key: "testkey.avbpubkey",
3296 private_key: "testkey.pem",
3297 }
3298 prebuilt_firmware {
3299 name: "myfirmware",
3300 src: "myfirmware.bin",
3301 filename_from_src: true,
3302 `+tc.additionalProp+`
3303 }
3304 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003305 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003306 "etc/firmware/myfirmware.bin",
3307 })
3308 })
3309 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003310}
3311
Jooyung Hanefb184e2020-06-25 17:14:25 +09003312func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003313 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003314 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003315 apex {
3316 name: "myapex",
3317 key: "myapex.key",
3318 vendor: true,
3319 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003320 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003321 }
3322
3323 apex_key {
3324 name: "myapex.key",
3325 public_key: "testkey.avbpubkey",
3326 private_key: "testkey.pem",
3327 }
3328
3329 cc_library {
3330 name: "mylib",
3331 vendor_available: true,
3332 }
3333 `)
3334
Jooyung Hana0503a52023-08-23 13:12:50 +09003335 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003336 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003337 name := apexBundle.BaseModuleName()
3338 prefix := "TARGET_"
3339 var builder strings.Builder
3340 data.Custom(&builder, name, prefix, "", data)
3341 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003342 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 +09003343}
3344
Jooyung Han2ed99d02020-06-24 23:26:26 +09003345func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003346 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003347 apex {
3348 name: "myapex",
3349 key: "myapex.key",
3350 vintf_fragments: ["fragment.xml"],
3351 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003352 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003353 }
3354 apex_key {
3355 name: "myapex.key",
3356 public_key: "testkey.avbpubkey",
3357 private_key: "testkey.pem",
3358 }
3359 cc_binary {
3360 name: "mybin",
3361 }
3362 `)
3363
Jooyung Hana0503a52023-08-23 13:12:50 +09003364 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003365 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003366 name := apexBundle.BaseModuleName()
3367 prefix := "TARGET_"
3368 var builder strings.Builder
3369 data.Custom(&builder, name, prefix, "", data)
3370 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003371 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003372 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003373}
3374
Jiyong Park16e91a02018-12-20 18:18:08 +09003375func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003376 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003377 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003378 apex {
3379 name: "myapex",
3380 key: "myapex.key",
3381 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003382 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003383 }
3384
3385 apex_key {
3386 name: "myapex.key",
3387 public_key: "testkey.avbpubkey",
3388 private_key: "testkey.pem",
3389 }
3390
3391 cc_library {
3392 name: "mylib",
3393 srcs: ["mylib.cpp"],
3394 system_shared_libs: [],
3395 stl: "none",
3396 stubs: {
3397 versions: ["1", "2", "3"],
3398 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003399 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003400 }
3401
3402 cc_binary {
3403 name: "not_in_apex",
3404 srcs: ["mylib.cpp"],
3405 static_libs: ["mylib"],
3406 static_executable: true,
3407 system_shared_libs: [],
3408 stl: "none",
3409 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003410 `)
3411
Colin Cross7113d202019-11-20 16:39:12 -08003412 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003413
3414 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003415 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003416}
Jiyong Park9335a262018-12-24 11:31:58 +09003417
3418func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003419 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003420 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003421 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003422 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003423 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003424 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003425 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003426 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003427 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003428 }
3429
3430 cc_library {
3431 name: "mylib",
3432 srcs: ["mylib.cpp"],
3433 system_shared_libs: [],
3434 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003435 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003436 }
3437
3438 apex_key {
3439 name: "myapex.key",
3440 public_key: "testkey.avbpubkey",
3441 private_key: "testkey.pem",
3442 }
3443
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003444 android_app_certificate {
3445 name: "myapex.certificate",
3446 certificate: "testkey",
3447 }
3448
3449 android_app_certificate {
3450 name: "myapex.certificate.override",
3451 certificate: "testkey.override",
3452 }
3453
Jiyong Park9335a262018-12-24 11:31:58 +09003454 `)
3455
3456 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003457 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003458
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003459 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3460 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003461 "vendor/foo/devkeys/testkey.avbpubkey")
3462 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003463 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3464 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003465 "vendor/foo/devkeys/testkey.pem")
3466 }
3467
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003468 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003469 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003470 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003471 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003472 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003473 }
3474}
Jiyong Park58e364a2019-01-19 19:24:06 +09003475
Jooyung Hanf121a652019-12-17 14:30:11 +09003476func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003477 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003478 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003479 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003480 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003481 apex {
3482 name: "myapex",
3483 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003484 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003485 }
3486 apex_key {
3487 name: "myapex.key",
3488 public_key: "testkey.avbpubkey",
3489 private_key: "testkey.pem",
3490 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003491 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003492 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3493 if actual := rule.Args["certificates"]; actual != expected {
3494 t.Errorf("certificates should be %q, not %q", expected, actual)
3495 }
3496 })
3497 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003498 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003499 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003500 apex {
3501 name: "myapex_keytest",
3502 key: "myapex.key",
3503 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003504 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003505 }
3506 apex_key {
3507 name: "myapex.key",
3508 public_key: "testkey.avbpubkey",
3509 private_key: "testkey.pem",
3510 }
3511 android_app_certificate {
3512 name: "myapex.certificate.override",
3513 certificate: "testkey.override",
3514 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003515 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003516 expected := "testkey.override.x509.pem testkey.override.pk8"
3517 if actual := rule.Args["certificates"]; actual != expected {
3518 t.Errorf("certificates should be %q, not %q", expected, actual)
3519 }
3520 })
3521 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003522 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003523 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003524 apex {
3525 name: "myapex",
3526 key: "myapex.key",
3527 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003528 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003529 }
3530 apex_key {
3531 name: "myapex.key",
3532 public_key: "testkey.avbpubkey",
3533 private_key: "testkey.pem",
3534 }
3535 android_app_certificate {
3536 name: "myapex.certificate",
3537 certificate: "testkey",
3538 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003539 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003540 expected := "testkey.x509.pem testkey.pk8"
3541 if actual := rule.Args["certificates"]; actual != expected {
3542 t.Errorf("certificates should be %q, not %q", expected, actual)
3543 }
3544 })
3545 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003546 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003547 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003548 apex {
3549 name: "myapex_keytest",
3550 key: "myapex.key",
3551 file_contexts: ":myapex-file_contexts",
3552 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003553 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003554 }
3555 apex_key {
3556 name: "myapex.key",
3557 public_key: "testkey.avbpubkey",
3558 private_key: "testkey.pem",
3559 }
3560 android_app_certificate {
3561 name: "myapex.certificate.override",
3562 certificate: "testkey.override",
3563 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003564 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003565 expected := "testkey.override.x509.pem testkey.override.pk8"
3566 if actual := rule.Args["certificates"]; actual != expected {
3567 t.Errorf("certificates should be %q, not %q", expected, actual)
3568 }
3569 })
3570 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003571 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003572 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003573 apex {
3574 name: "myapex",
3575 key: "myapex.key",
3576 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003577 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003578 }
3579 apex_key {
3580 name: "myapex.key",
3581 public_key: "testkey.avbpubkey",
3582 private_key: "testkey.pem",
3583 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003584 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003585 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3586 if actual := rule.Args["certificates"]; actual != expected {
3587 t.Errorf("certificates should be %q, not %q", expected, actual)
3588 }
3589 })
3590 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003591 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003592 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003593 apex {
3594 name: "myapex_keytest",
3595 key: "myapex.key",
3596 file_contexts: ":myapex-file_contexts",
3597 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003598 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003599 }
3600 apex_key {
3601 name: "myapex.key",
3602 public_key: "testkey.avbpubkey",
3603 private_key: "testkey.pem",
3604 }
3605 android_app_certificate {
3606 name: "myapex.certificate.override",
3607 certificate: "testkey.override",
3608 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003609 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003610 expected := "testkey.override.x509.pem testkey.override.pk8"
3611 if actual := rule.Args["certificates"]; actual != expected {
3612 t.Errorf("certificates should be %q, not %q", expected, actual)
3613 }
3614 })
3615}
3616
Jiyong Park58e364a2019-01-19 19:24:06 +09003617func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003618 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003619 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003620 apex {
3621 name: "myapex",
3622 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003623 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003624 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003625 }
3626
3627 apex {
3628 name: "otherapex",
3629 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003630 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003631 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003632 }
3633
3634 apex_key {
3635 name: "myapex.key",
3636 public_key: "testkey.avbpubkey",
3637 private_key: "testkey.pem",
3638 }
3639
3640 cc_library {
3641 name: "mylib",
3642 srcs: ["mylib.cpp"],
3643 system_shared_libs: [],
3644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003645 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003646 "myapex",
3647 "otherapex",
3648 ],
Jooyung Han24282772020-03-21 23:20:55 +09003649 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003650 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003651 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003652 cc_library {
3653 name: "mylib2",
3654 srcs: ["mylib.cpp"],
3655 system_shared_libs: [],
3656 stl: "none",
3657 apex_available: [
3658 "myapex",
3659 "otherapex",
3660 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003661 static_libs: ["mylib3"],
3662 recovery_available: true,
3663 min_sdk_version: "29",
3664 }
3665 cc_library {
3666 name: "mylib3",
3667 srcs: ["mylib.cpp"],
3668 system_shared_libs: [],
3669 stl: "none",
3670 apex_available: [
3671 "myapex",
3672 "otherapex",
3673 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003674 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003675 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003676 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003677 `)
3678
Jooyung Hanc87a0592020-03-02 17:44:33 +09003679 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003680 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003681 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003682
Vinh Tranf9754732023-01-19 22:41:46 -05003683 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003684 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003685 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003686
Vinh Tranf9754732023-01-19 22:41:46 -05003687 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003688 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003689 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003690
Colin Crossaede88c2020-08-11 12:17:01 -07003691 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3692 // each variant defines additional macros to distinguish which apex variant it is built for
3693
3694 // non-APEX variant does not have __ANDROID_APEX__ defined
3695 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3696 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3697
Vinh Tranf9754732023-01-19 22:41:46 -05003698 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003699 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3700 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003701
Jooyung Hanc87a0592020-03-02 17:44:33 +09003702 // non-APEX variant does not have __ANDROID_APEX__ defined
3703 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3704 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3705
Vinh Tranf9754732023-01-19 22:41:46 -05003706 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003707 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003708 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003709}
Jiyong Park7e636d02019-01-28 16:16:54 +09003710
3711func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003712 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003713 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003714 apex {
3715 name: "myapex",
3716 key: "myapex.key",
3717 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003718 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003719 }
3720
3721 apex_key {
3722 name: "myapex.key",
3723 public_key: "testkey.avbpubkey",
3724 private_key: "testkey.pem",
3725 }
3726
3727 cc_library_headers {
3728 name: "mylib_headers",
3729 export_include_dirs: ["my_include"],
3730 system_shared_libs: [],
3731 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003732 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003733 }
3734
3735 cc_library {
3736 name: "mylib",
3737 srcs: ["mylib.cpp"],
3738 system_shared_libs: [],
3739 stl: "none",
3740 header_libs: ["mylib_headers"],
3741 export_header_lib_headers: ["mylib_headers"],
3742 stubs: {
3743 versions: ["1", "2", "3"],
3744 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003745 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003746 }
3747
3748 cc_library {
3749 name: "otherlib",
3750 srcs: ["mylib.cpp"],
3751 system_shared_libs: [],
3752 stl: "none",
3753 shared_libs: ["mylib"],
3754 }
3755 `)
3756
Colin Cross7113d202019-11-20 16:39:12 -08003757 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003758
3759 // Ensure that the include path of the header lib is exported to 'otherlib'
3760 ensureContains(t, cFlags, "-Imy_include")
3761}
Alex Light9670d332019-01-29 18:07:33 -08003762
Jiyong Park7cd10e32020-01-14 09:22:18 +09003763type fileInApex struct {
3764 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003765 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003766 isLink bool
3767}
3768
Jooyung Han1724d582022-12-21 10:17:44 +09003769func (f fileInApex) String() string {
3770 return f.src + ":" + f.path
3771}
3772
3773func (f fileInApex) match(expectation string) bool {
3774 parts := strings.Split(expectation, ":")
3775 if len(parts) == 1 {
3776 match, _ := path.Match(parts[0], f.path)
3777 return match
3778 }
3779 if len(parts) == 2 {
3780 matchSrc, _ := path.Match(parts[0], f.src)
3781 matchDst, _ := path.Match(parts[1], f.path)
3782 return matchSrc && matchDst
3783 }
3784 panic("invalid expected file specification: " + expectation)
3785}
3786
Jooyung Hana57af4a2020-01-23 05:36:59 +00003787func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003788 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003789 module := ctx.ModuleForTests(moduleName, variant)
3790 apexRule := module.MaybeRule("apexRule")
3791 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003792 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003793 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003794 for _, cmd := range strings.Split(copyCmds, "&&") {
3795 cmd = strings.TrimSpace(cmd)
3796 if cmd == "" {
3797 continue
3798 }
3799 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003800 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003801 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 switch terms[0] {
3803 case "mkdir":
3804 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003805 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003806 t.Fatal("copyCmds contains invalid cp command", cmd)
3807 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003808 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 isLink = false
3811 case "ln":
3812 if len(terms) != 3 && len(terms) != 4 {
3813 // ln LINK TARGET or ln -s LINK TARGET
3814 t.Fatal("copyCmds contains invalid ln command", cmd)
3815 }
3816 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003817 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003818 isLink = true
3819 default:
3820 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3821 }
3822 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003823 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003824 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003825 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003826 }
Jooyung Han1724d582022-12-21 10:17:44 +09003827 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003828 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003829 }
3830 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003831 return ret
3832}
3833
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003834func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003835 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003836 var failed bool
3837 var surplus []string
3838 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003839 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003840 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003841 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003842 if file.match(expected) {
3843 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003844 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003845 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003846 }
3847 }
Jooyung Han1724d582022-12-21 10:17:44 +09003848 if !matchFound {
3849 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003850 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003851 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003852
Jooyung Han31c470b2019-10-18 16:26:59 +09003853 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003854 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003855 t.Log("surplus files", surplus)
3856 failed = true
3857 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003858
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003859 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003860 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003861 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003862 if !filesMatched[expected] {
3863 missing = append(missing, expected)
3864 }
3865 }
3866 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003867 t.Log("missing files", missing)
3868 failed = true
3869 }
3870 if failed {
3871 t.Fail()
3872 }
3873}
3874
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003875func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3876 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3877}
3878
3879func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003880 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003881 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3882 if deapexer.Output != nil {
3883 outputs = append(outputs, deapexer.Output.String())
3884 }
3885 for _, output := range deapexer.ImplicitOutputs {
3886 outputs = append(outputs, output.String())
3887 }
3888 actualFiles := make([]fileInApex, 0, len(outputs))
3889 for _, output := range outputs {
3890 dir := "/deapexer/"
3891 pos := strings.LastIndex(output, dir)
3892 if pos == -1 {
3893 t.Fatal("Unknown deapexer output ", output)
3894 }
3895 path := output[pos+len(dir):]
3896 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3897 }
3898 assertFileListEquals(t, files, actualFiles)
3899}
3900
Jooyung Han39edb6c2019-11-06 16:53:07 +09003901func vndkLibrariesTxtFiles(vers ...string) (result string) {
3902 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003903 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003904 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003905 prebuilt_etc {
3906 name: "` + txt + `.libraries.` + v + `.txt",
3907 src: "dummy.txt",
3908 }
3909 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 }
3911 }
3912 return
3913}
3914
Jooyung Han344d5432019-08-23 11:17:39 +09003915func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003916 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003917 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003918 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003919 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003920 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003921 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003922 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003923 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003924 }
3925
3926 apex_key {
3927 name: "myapex.key",
3928 public_key: "testkey.avbpubkey",
3929 private_key: "testkey.pem",
3930 }
3931
Jooyung Han31c470b2019-10-18 16:26:59 +09003932 vndk_prebuilt_shared {
3933 name: "libvndk27",
3934 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003935 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003936 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003937 vndk: {
3938 enabled: true,
3939 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003940 target_arch: "arm64",
3941 arch: {
3942 arm: {
3943 srcs: ["libvndk27_arm.so"],
3944 },
3945 arm64: {
3946 srcs: ["libvndk27_arm64.so"],
3947 },
3948 },
Colin Cross2807f002021-03-02 10:15:29 -08003949 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003950 }
3951
3952 vndk_prebuilt_shared {
3953 name: "libvndk27",
3954 version: "27",
3955 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003956 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003957 vndk: {
3958 enabled: true,
3959 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003960 target_arch: "x86_64",
3961 arch: {
3962 x86: {
3963 srcs: ["libvndk27_x86.so"],
3964 },
3965 x86_64: {
3966 srcs: ["libvndk27_x86_64.so"],
3967 },
3968 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003969 }
3970 `+vndkLibrariesTxtFiles("27"),
3971 withFiles(map[string][]byte{
3972 "libvndk27_arm.so": nil,
3973 "libvndk27_arm64.so": nil,
3974 "libvndk27_x86.so": nil,
3975 "libvndk27_x86_64.so": nil,
3976 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003977
Jooyung Hana0503a52023-08-23 13:12:50 +09003978 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003979 "lib/libvndk27_arm.so",
3980 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003981 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003982 })
Jooyung Han344d5432019-08-23 11:17:39 +09003983}
3984
Jooyung Han90eee022019-10-01 20:02:42 +09003985func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003986 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003987 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003988 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003989 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003990 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003991 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003992 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003993 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003994 }
3995 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003996 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003997 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003998 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003999 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004000 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004001 }
4002 apex_key {
4003 name: "myapex.key",
4004 public_key: "testkey.avbpubkey",
4005 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004006 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004007
4008 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004009 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004010 apexManifestRule := module.Rule("apexManifestRule")
4011 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004012 }
4013
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004014 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004015 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004016}
4017
Jooyung Han344d5432019-08-23 11:17:39 +09004018func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004019 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004020 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004021 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004022 name: "com.android.vndk.v30",
4023 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004024 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004025 native_bridge_supported: true,
4026 }
4027
4028 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004029 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 public_key: "testkey.avbpubkey",
4031 private_key: "testkey.pem",
4032 }
4033
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004034 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004035 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004036 version: "30",
4037 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004038 srcs: ["mylib.cpp"],
4039 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004040 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004041 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004042 vndk: {
4043 enabled: true,
4044 },
Jooyung Han344d5432019-08-23 11:17:39 +09004045 }
4046 `)
4047}
4048
Jooyung Han31c470b2019-10-18 16:26:59 +09004049func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004050 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004051 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004053 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004054 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004055 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004056 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004057 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004058 }
4059
4060 apex_key {
4061 name: "myapex.key",
4062 public_key: "testkey.avbpubkey",
4063 private_key: "testkey.pem",
4064 }
4065
4066 vndk_prebuilt_shared {
4067 name: "libvndk27",
4068 version: "27",
4069 target_arch: "arm",
4070 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004071 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004072 vndk: {
4073 enabled: true,
4074 },
4075 arch: {
4076 arm: {
4077 srcs: ["libvndk27.so"],
4078 }
4079 },
4080 }
4081
4082 vndk_prebuilt_shared {
4083 name: "libvndk27",
4084 version: "27",
4085 target_arch: "arm",
4086 binder32bit: true,
4087 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004088 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004089 vndk: {
4090 enabled: true,
4091 },
4092 arch: {
4093 arm: {
4094 srcs: ["libvndk27binder32.so"],
4095 }
4096 },
Colin Cross2807f002021-03-02 10:15:29 -08004097 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004099 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004100 withFiles(map[string][]byte{
4101 "libvndk27.so": nil,
4102 "libvndk27binder32.so": nil,
4103 }),
4104 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004105 android.FixtureModifyConfig(func(config android.Config) {
4106 target := android.Target{
4107 Os: android.Android,
4108 Arch: android.Arch{
4109 ArchType: android.Arm,
4110 ArchVariant: "armv7-a-neon",
4111 Abi: []string{"armeabi-v7a"},
4112 },
4113 NativeBridge: android.NativeBridgeDisabled,
4114 NativeBridgeHostArchName: "",
4115 NativeBridgeRelativePath: "",
4116 }
4117 config.Targets[android.Android] = []android.Target{target}
4118 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004119 }),
4120 )
4121
Jooyung Hana0503a52023-08-23 13:12:50 +09004122 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004124 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 })
4126}
4127
Jooyung Hane1633032019-08-01 17:41:43 +09004128func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004129 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004130 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004131 apex {
4132 name: "myapex_nodep",
4133 key: "myapex.key",
4134 native_shared_libs: ["lib_nodep"],
4135 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004136 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004137 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004138 }
4139
4140 apex {
4141 name: "myapex_dep",
4142 key: "myapex.key",
4143 native_shared_libs: ["lib_dep"],
4144 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004145 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004146 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004147 }
4148
4149 apex {
4150 name: "myapex_provider",
4151 key: "myapex.key",
4152 native_shared_libs: ["libfoo"],
4153 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004154 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004155 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004156 }
4157
4158 apex {
4159 name: "myapex_selfcontained",
4160 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004161 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004162 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004163 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004164 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004165 }
4166
4167 apex_key {
4168 name: "myapex.key",
4169 public_key: "testkey.avbpubkey",
4170 private_key: "testkey.pem",
4171 }
4172
4173 cc_library {
4174 name: "lib_nodep",
4175 srcs: ["mylib.cpp"],
4176 system_shared_libs: [],
4177 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004178 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004179 }
4180
4181 cc_library {
4182 name: "lib_dep",
4183 srcs: ["mylib.cpp"],
4184 shared_libs: ["libfoo"],
4185 system_shared_libs: [],
4186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004187 apex_available: [
4188 "myapex_dep",
4189 "myapex_provider",
4190 "myapex_selfcontained",
4191 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004192 }
4193
4194 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004195 name: "lib_dep_on_bar",
4196 srcs: ["mylib.cpp"],
4197 shared_libs: ["libbar"],
4198 system_shared_libs: [],
4199 stl: "none",
4200 apex_available: [
4201 "myapex_selfcontained",
4202 ],
4203 }
4204
4205
4206 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004207 name: "libfoo",
4208 srcs: ["mytest.cpp"],
4209 stubs: {
4210 versions: ["1"],
4211 },
4212 system_shared_libs: [],
4213 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004214 apex_available: [
4215 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004216 ],
4217 }
4218
4219 cc_library {
4220 name: "libbar",
4221 srcs: ["mytest.cpp"],
4222 stubs: {
4223 versions: ["1"],
4224 },
4225 system_shared_libs: [],
4226 stl: "none",
4227 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004228 "myapex_selfcontained",
4229 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004230 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004231
Jooyung Hane1633032019-08-01 17:41:43 +09004232 `)
4233
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004234 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004235 var provideNativeLibs, requireNativeLibs []string
4236
Jooyung Hana0503a52023-08-23 13:12:50 +09004237 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004238 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4239 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004240 ensureListEmpty(t, provideNativeLibs)
4241 ensureListEmpty(t, requireNativeLibs)
4242
Jooyung Hana0503a52023-08-23 13:12:50 +09004243 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004244 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4245 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004246 ensureListEmpty(t, provideNativeLibs)
4247 ensureListContains(t, requireNativeLibs, "libfoo.so")
4248
Jooyung Hana0503a52023-08-23 13:12:50 +09004249 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004250 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4251 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004252 ensureListContains(t, provideNativeLibs, "libfoo.so")
4253 ensureListEmpty(t, requireNativeLibs)
4254
Jooyung Hana0503a52023-08-23 13:12:50 +09004255 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004256 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4257 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004258 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004259 ensureListEmpty(t, requireNativeLibs)
4260}
4261
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004262func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004263 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004264 ctx := testApex(t, `
4265 apex {
4266 name: "myapex",
4267 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004268 native_shared_libs: ["mylib"],
4269 updatable: false,
4270 }
4271
4272 apex_key {
4273 name: "myapex.key",
4274 public_key: "testkey.avbpubkey",
4275 private_key: "testkey.pem",
4276 }
4277
4278 cc_library {
4279 name: "mylib",
4280 srcs: ["mylib.cpp"],
4281 system_shared_libs: [],
4282 stl: "none",
4283 apex_available: [
4284 "//apex_available:platform",
4285 "myapex",
4286 ],
4287 }
4288 `, android.FixtureMergeEnv(map[string]string{
4289 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4290 }))
4291
Jooyung Hana0503a52023-08-23 13:12:50 +09004292 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004293 apexManifestRule := module.Rule("apexManifestRule")
4294 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4295}
4296
Vinh Tran8f5310f2022-10-07 18:16:47 -04004297func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004298 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004299 testCases := []struct {
4300 compileMultiLibProp string
4301 containedLibs []string
4302 notContainedLibs []string
4303 }{
4304 {
4305 containedLibs: []string{
4306 "image.apex/lib64/mylib.so",
4307 "image.apex/lib/mylib.so",
4308 },
4309 compileMultiLibProp: `compile_multilib: "both",`,
4310 },
4311 {
4312 containedLibs: []string{"image.apex/lib64/mylib.so"},
4313 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4314 compileMultiLibProp: `compile_multilib: "first",`,
4315 },
4316 {
4317 containedLibs: []string{"image.apex/lib64/mylib.so"},
4318 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4319 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4320 },
4321 {
4322 containedLibs: []string{"image.apex/lib64/mylib.so"},
4323 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4324 compileMultiLibProp: `compile_multilib: "64",`,
4325 },
4326 {
4327 containedLibs: []string{"image.apex/lib/mylib.so"},
4328 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4329 compileMultiLibProp: `compile_multilib: "32",`,
4330 },
4331 }
4332 for _, testCase := range testCases {
4333 ctx := testApex(t, fmt.Sprintf(`
4334 apex {
4335 name: "myapex",
4336 key: "myapex.key",
4337 %s
4338 native_shared_libs: ["mylib"],
4339 updatable: false,
4340 }
4341 apex_key {
4342 name: "myapex.key",
4343 public_key: "testkey.avbpubkey",
4344 private_key: "testkey.pem",
4345 }
4346 cc_library {
4347 name: "mylib",
4348 srcs: ["mylib.cpp"],
4349 apex_available: [
4350 "//apex_available:platform",
4351 "myapex",
4352 ],
4353 }
4354 `, testCase.compileMultiLibProp),
4355 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004356 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004357 apexRule := module.Rule("apexRule")
4358 copyCmds := apexRule.Args["copy_commands"]
4359 for _, containedLib := range testCase.containedLibs {
4360 ensureContains(t, copyCmds, containedLib)
4361 }
4362 for _, notContainedLib := range testCase.notContainedLibs {
4363 ensureNotContains(t, copyCmds, notContainedLib)
4364 }
4365 }
4366}
4367
Alex Light0851b882019-02-07 13:20:53 -08004368func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004369 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004370 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004371 apex {
4372 name: "myapex",
4373 key: "myapex.key",
4374 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004375 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004376 }
4377
4378 apex_key {
4379 name: "myapex.key",
4380 public_key: "testkey.avbpubkey",
4381 private_key: "testkey.pem",
4382 }
4383
4384 cc_library {
4385 name: "mylib_common",
4386 srcs: ["mylib.cpp"],
4387 system_shared_libs: [],
4388 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004389 apex_available: [
4390 "//apex_available:platform",
4391 "myapex",
4392 ],
Alex Light0851b882019-02-07 13:20:53 -08004393 }
4394 `)
4395
Jooyung Hana0503a52023-08-23 13:12:50 +09004396 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004397 apexRule := module.Rule("apexRule")
4398 copyCmds := apexRule.Args["copy_commands"]
4399
4400 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4401 t.Log("Apex was a test apex!")
4402 t.Fail()
4403 }
4404 // Ensure that main rule creates an output
4405 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4406
4407 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004408 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004409
4410 // Ensure that both direct and indirect deps are copied into apex
4411 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4412
Colin Cross7113d202019-11-20 16:39:12 -08004413 // Ensure that the platform variant ends with _shared
4414 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004415
Colin Cross56a83212020-09-15 18:30:11 -07004416 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004417 t.Log("Found mylib_common not in any apex!")
4418 t.Fail()
4419 }
4420}
4421
4422func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004423 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004424 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004425 apex_test {
4426 name: "myapex",
4427 key: "myapex.key",
4428 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004429 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004430 }
4431
4432 apex_key {
4433 name: "myapex.key",
4434 public_key: "testkey.avbpubkey",
4435 private_key: "testkey.pem",
4436 }
4437
4438 cc_library {
4439 name: "mylib_common_test",
4440 srcs: ["mylib.cpp"],
4441 system_shared_libs: [],
4442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004443 // TODO: remove //apex_available:platform
4444 apex_available: [
4445 "//apex_available:platform",
4446 "myapex",
4447 ],
Alex Light0851b882019-02-07 13:20:53 -08004448 }
4449 `)
4450
Jooyung Hana0503a52023-08-23 13:12:50 +09004451 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004452 apexRule := module.Rule("apexRule")
4453 copyCmds := apexRule.Args["copy_commands"]
4454
4455 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4456 t.Log("Apex was not a test apex!")
4457 t.Fail()
4458 }
4459 // Ensure that main rule creates an output
4460 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4461
4462 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004463 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004464
4465 // Ensure that both direct and indirect deps are copied into apex
4466 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4467
Colin Cross7113d202019-11-20 16:39:12 -08004468 // Ensure that the platform variant ends with _shared
4469 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004470}
4471
Jooyung Han85707de2023-12-01 14:21:13 +09004472func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004473 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004474 ctx := testApex(t, `
4475 apex {
4476 name: "myapex",
4477 key: "myapex.key",
4478 updatable: false,
4479 binaries: ["mybin"],
4480 }
4481 apex {
4482 name: "myvendorapex",
4483 key: "myapex.key",
4484 file_contexts: "myvendorapex_file_contexts",
4485 vendor: true,
4486 updatable: false,
4487 binaries: ["mybin"],
4488 }
4489 apex_key {
4490 name: "myapex.key",
4491 public_key: "testkey.avbpubkey",
4492 private_key: "testkey.pem",
4493 }
4494 cc_binary {
4495 name: "mybin",
4496 vendor_available: true,
4497 system_shared_libs: [],
4498 stl: "none",
4499 shared_libs: ["libz"],
4500 apex_available: ["//apex_available:anyapex"],
4501 }
4502 cc_library {
4503 name: "libz",
4504 vendor_available: true,
4505 system_shared_libs: [],
4506 stl: "none",
4507 stubs: {
4508 versions: ["28", "30"],
4509 },
4510 target: {
4511 vendor: {
4512 no_stubs: true,
4513 },
4514 },
4515 }
4516 `, withFiles(map[string][]byte{
4517 "myvendorapex_file_contexts": nil,
4518 }))
4519
4520 // libz provides stubs for core variant.
4521 {
4522 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4523 "bin/mybin",
4524 })
4525 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4526 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4527 }
4528 // libz doesn't provide stubs for vendor variant.
4529 {
4530 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4531 "bin/mybin",
4532 "lib64/libz.so",
4533 })
4534 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4535 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4536 }
4537}
4538
Alex Light9670d332019-01-29 18:07:33 -08004539func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004540 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004541 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004542 apex {
4543 name: "myapex",
4544 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004545 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004546 multilib: {
4547 first: {
4548 native_shared_libs: ["mylib_common"],
4549 }
4550 },
4551 target: {
4552 android: {
4553 multilib: {
4554 first: {
4555 native_shared_libs: ["mylib"],
4556 }
4557 }
4558 },
4559 host: {
4560 multilib: {
4561 first: {
4562 native_shared_libs: ["mylib2"],
4563 }
4564 }
4565 }
4566 }
4567 }
4568
4569 apex_key {
4570 name: "myapex.key",
4571 public_key: "testkey.avbpubkey",
4572 private_key: "testkey.pem",
4573 }
4574
4575 cc_library {
4576 name: "mylib",
4577 srcs: ["mylib.cpp"],
4578 system_shared_libs: [],
4579 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004580 // TODO: remove //apex_available:platform
4581 apex_available: [
4582 "//apex_available:platform",
4583 "myapex",
4584 ],
Alex Light9670d332019-01-29 18:07:33 -08004585 }
4586
4587 cc_library {
4588 name: "mylib_common",
4589 srcs: ["mylib.cpp"],
4590 system_shared_libs: [],
4591 stl: "none",
4592 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004593 // TODO: remove //apex_available:platform
4594 apex_available: [
4595 "//apex_available:platform",
4596 "myapex",
4597 ],
Alex Light9670d332019-01-29 18:07:33 -08004598 }
4599
4600 cc_library {
4601 name: "mylib2",
4602 srcs: ["mylib.cpp"],
4603 system_shared_libs: [],
4604 stl: "none",
4605 compile_multilib: "first",
4606 }
4607 `)
4608
Jooyung Hana0503a52023-08-23 13:12:50 +09004609 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004610 copyCmds := apexRule.Args["copy_commands"]
4611
4612 // Ensure that main rule creates an output
4613 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4614
4615 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004616 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4617 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4618 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004619
4620 // Ensure that both direct and indirect deps are copied into apex
4621 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4622 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4623 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4624
Colin Cross7113d202019-11-20 16:39:12 -08004625 // Ensure that the platform variant ends with _shared
4626 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4627 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4628 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004629}
Jiyong Park04480cf2019-02-06 00:16:29 +09004630
Jiyong Park59140302020-12-14 18:44:04 +09004631func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004632 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004633 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004634 apex {
4635 name: "myapex",
4636 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004637 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004638 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004639 arch: {
4640 arm64: {
4641 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004642 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004643 },
4644 x86_64: {
4645 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004646 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004647 },
4648 }
4649 }
4650
4651 apex_key {
4652 name: "myapex.key",
4653 public_key: "testkey.avbpubkey",
4654 private_key: "testkey.pem",
4655 }
4656
4657 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004658 name: "mylib.generic",
4659 srcs: ["mylib.cpp"],
4660 system_shared_libs: [],
4661 stl: "none",
4662 // TODO: remove //apex_available:platform
4663 apex_available: [
4664 "//apex_available:platform",
4665 "myapex",
4666 ],
4667 }
4668
4669 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004670 name: "mylib.arm64",
4671 srcs: ["mylib.cpp"],
4672 system_shared_libs: [],
4673 stl: "none",
4674 // TODO: remove //apex_available:platform
4675 apex_available: [
4676 "//apex_available:platform",
4677 "myapex",
4678 ],
4679 }
4680
4681 cc_library {
4682 name: "mylib.x64",
4683 srcs: ["mylib.cpp"],
4684 system_shared_libs: [],
4685 stl: "none",
4686 // TODO: remove //apex_available:platform
4687 apex_available: [
4688 "//apex_available:platform",
4689 "myapex",
4690 ],
4691 }
4692 `)
4693
Jooyung Hana0503a52023-08-23 13:12:50 +09004694 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004695 copyCmds := apexRule.Args["copy_commands"]
4696
4697 // Ensure that apex variant is created for the direct dep
4698 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004699 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004700 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4701
4702 // Ensure that both direct and indirect deps are copied into apex
4703 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4704 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4705}
4706
Jiyong Park04480cf2019-02-06 00:16:29 +09004707func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004708 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004709 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004710 apex {
4711 name: "myapex",
4712 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004713 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004714 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004715 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004716 }
4717
4718 apex_key {
4719 name: "myapex.key",
4720 public_key: "testkey.avbpubkey",
4721 private_key: "testkey.pem",
4722 }
4723
4724 sh_binary {
4725 name: "myscript",
4726 src: "mylib.cpp",
4727 filename: "myscript.sh",
4728 sub_dir: "script",
4729 }
4730 `)
4731
Jooyung Hana0503a52023-08-23 13:12:50 +09004732 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004733 copyCmds := apexRule.Args["copy_commands"]
4734
4735 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4736}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004737
Jooyung Han91df2082019-11-20 01:49:42 +09004738func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004739 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004740 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004741 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004742 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004743 {"", "system"},
4744 {"product_specific: true", "product"},
4745 {"soc_specific: true", "vendor"},
4746 {"proprietary: true", "vendor"},
4747 {"vendor: true", "vendor"},
4748 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004749 }
4750 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004751 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004752 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004753 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004754 apex {
4755 name: "myapex",
4756 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004757 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004758 `+tc.propName+`
4759 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004760
Jooyung Han91df2082019-11-20 01:49:42 +09004761 apex_key {
4762 name: "myapex.key",
4763 public_key: "testkey.avbpubkey",
4764 private_key: "testkey.pem",
4765 }
4766 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004767
Jooyung Hana0503a52023-08-23 13:12:50 +09004768 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004769 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004770 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004771 if actual != expected {
4772 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4773 }
Jooyung Han91df2082019-11-20 01:49:42 +09004774 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004775 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004776}
Jiyong Park67882562019-03-21 01:11:21 +09004777
Jooyung Han580eb4f2020-06-24 19:33:06 +09004778func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004779 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004780 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004781 apex {
4782 name: "myapex",
4783 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004784 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004785 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004786
Jooyung Han580eb4f2020-06-24 19:33:06 +09004787 apex_key {
4788 name: "myapex.key",
4789 public_key: "testkey.avbpubkey",
4790 private_key: "testkey.pem",
4791 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004792 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004793 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 rule := module.Output("file_contexts")
4795 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4796}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004797
Jooyung Han580eb4f2020-06-24 19:33:06 +09004798func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004799 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004800 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004801 apex {
4802 name: "myapex",
4803 key: "myapex.key",
4804 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004805 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004807
Jooyung Han580eb4f2020-06-24 19:33:06 +09004808 apex_key {
4809 name: "myapex.key",
4810 public_key: "testkey.avbpubkey",
4811 private_key: "testkey.pem",
4812 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004813 `, withFiles(map[string][]byte{
4814 "my_own_file_contexts": nil,
4815 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004816}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004817
Jooyung Han580eb4f2020-06-24 19:33:06 +09004818func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004819 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004820 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004821 apex {
4822 name: "myapex",
4823 key: "myapex.key",
4824 product_specific: true,
4825 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004826 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004827 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004828
Jooyung Han580eb4f2020-06-24 19:33:06 +09004829 apex_key {
4830 name: "myapex.key",
4831 public_key: "testkey.avbpubkey",
4832 private_key: "testkey.pem",
4833 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004834 `)
4835
Colin Cross1c460562021-02-16 17:55:47 -08004836 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004837 apex {
4838 name: "myapex",
4839 key: "myapex.key",
4840 product_specific: true,
4841 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004842 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004843 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004844
Jooyung Han580eb4f2020-06-24 19:33:06 +09004845 apex_key {
4846 name: "myapex.key",
4847 public_key: "testkey.avbpubkey",
4848 private_key: "testkey.pem",
4849 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004850 `, withFiles(map[string][]byte{
4851 "product_specific_file_contexts": nil,
4852 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004853 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 rule := module.Output("file_contexts")
4855 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4856}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004857
Jooyung Han580eb4f2020-06-24 19:33:06 +09004858func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004859 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004860 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004861 apex {
4862 name: "myapex",
4863 key: "myapex.key",
4864 product_specific: true,
4865 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004866 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004867 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004868
Jooyung Han580eb4f2020-06-24 19:33:06 +09004869 apex_key {
4870 name: "myapex.key",
4871 public_key: "testkey.avbpubkey",
4872 private_key: "testkey.pem",
4873 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004874
Jooyung Han580eb4f2020-06-24 19:33:06 +09004875 filegroup {
4876 name: "my-file-contexts",
4877 srcs: ["product_specific_file_contexts"],
4878 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004879 `, withFiles(map[string][]byte{
4880 "product_specific_file_contexts": nil,
4881 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004882 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004883 rule := module.Output("file_contexts")
4884 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004885}
4886
Jiyong Park67882562019-03-21 01:11:21 +09004887func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004888 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004889 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004890 apex_key {
4891 name: "myapex.key",
4892 public_key: ":my.avbpubkey",
4893 private_key: ":my.pem",
4894 product_specific: true,
4895 }
4896
4897 filegroup {
4898 name: "my.avbpubkey",
4899 srcs: ["testkey2.avbpubkey"],
4900 }
4901
4902 filegroup {
4903 name: "my.pem",
4904 srcs: ["testkey2.pem"],
4905 }
4906 `)
4907
4908 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4909 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004910 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004911 if actual_pubkey != expected_pubkey {
4912 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4913 }
4914 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004915 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004916 if actual_privkey != expected_privkey {
4917 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4918 }
4919}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004920
4921func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004922 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004923 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004924 prebuilt_apex {
4925 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004926 arch: {
4927 arm64: {
4928 src: "myapex-arm64.apex",
4929 },
4930 arm: {
4931 src: "myapex-arm.apex",
4932 },
4933 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004934 }
4935 `)
4936
Wei Li340ee8e2022-03-18 17:33:24 -07004937 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4938 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939
Jiyong Parkc95714e2019-03-29 14:23:10 +09004940 expectedInput := "myapex-arm64.apex"
4941 if prebuilt.inputApex.String() != expectedInput {
4942 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4943 }
Wei Li340ee8e2022-03-18 17:33:24 -07004944 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4945 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4946 rule := testingModule.Rule("genProvenanceMetaData")
4947 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4948 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4949 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4950 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004951
4952 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4953 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004954}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004955
Paul Duffinc0609c62021-03-01 17:27:16 +00004956func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004957 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004958 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004959 prebuilt_apex {
4960 name: "myapex",
4961 }
4962 `)
4963}
4964
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004965func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004967 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004968 prebuilt_apex {
4969 name: "myapex",
4970 src: "myapex-arm.apex",
4971 filename: "notmyapex.apex",
4972 }
4973 `)
4974
Wei Li340ee8e2022-03-18 17:33:24 -07004975 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4976 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004977
4978 expected := "notmyapex.apex"
4979 if p.installFilename != expected {
4980 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4981 }
Wei Li340ee8e2022-03-18 17:33:24 -07004982 rule := testingModule.Rule("genProvenanceMetaData")
4983 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4984 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4985 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4986 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004987}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004988
Samiul Islam7c02e262021-09-08 17:48:28 +01004989func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004990 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004991 testApex(t, `
4992 apex_set {
4993 name: "com.company.android.myapex",
4994 apex_name: "com.android.myapex",
4995 set: "company-myapex.apks",
4996 filename: "com.company.android.myapex.apex"
4997 }
4998 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4999
5000 testApex(t, `
5001 apex_set {
5002 name: "com.company.android.myapex",
5003 apex_name: "com.android.myapex",
5004 set: "company-myapex.apks",
5005 filename: "com.company.android.myapex.capex"
5006 }
5007 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5008
5009 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5010 apex_set {
5011 name: "com.company.android.myapex",
5012 apex_name: "com.android.myapex",
5013 set: "company-myapex.apks",
5014 filename: "some-random-suffix"
5015 }
5016 `)
5017}
5018
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005019func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005020 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005021 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005022 prebuilt_apex {
5023 name: "myapex.prebuilt",
5024 src: "myapex-arm.apex",
5025 overrides: [
5026 "myapex",
5027 ],
5028 }
5029 `)
5030
Wei Li340ee8e2022-03-18 17:33:24 -07005031 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5032 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005033
5034 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005035 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005036 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005037 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005038 }
Wei Li340ee8e2022-03-18 17:33:24 -07005039 rule := testingModule.Rule("genProvenanceMetaData")
5040 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5041 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5042 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5043 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005044}
5045
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005046func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005047 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005048 testApex(t, `
5049 prebuilt_apex {
5050 name: "com.company.android.myapex",
5051 apex_name: "com.android.myapex",
5052 src: "company-myapex-arm.apex",
5053 }
5054 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5055
5056 testApex(t, `
5057 apex_set {
5058 name: "com.company.android.myapex",
5059 apex_name: "com.android.myapex",
5060 set: "company-myapex.apks",
5061 }
5062 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5063}
5064
5065func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005066 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005067 _ = android.GroupFixturePreparers(
5068 java.PrepareForTestWithJavaDefaultModules,
5069 PrepareForTestWithApexBuildComponents,
5070 android.FixtureWithRootAndroidBp(`
5071 platform_bootclasspath {
5072 name: "platform-bootclasspath",
5073 fragments: [
5074 {
5075 apex: "com.android.art",
5076 module: "art-bootclasspath-fragment",
5077 },
5078 ],
5079 }
5080
5081 prebuilt_apex {
5082 name: "com.company.android.art",
5083 apex_name: "com.android.art",
5084 src: "com.company.android.art-arm.apex",
5085 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5086 }
5087
5088 prebuilt_bootclasspath_fragment {
5089 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005090 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005091 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005092 hidden_api: {
5093 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5094 metadata: "my-bootclasspath-fragment/metadata.csv",
5095 index: "my-bootclasspath-fragment/index.csv",
5096 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5097 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5098 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005099 }
5100
5101 java_import {
5102 name: "core-oj",
5103 jars: ["prebuilt.jar"],
5104 }
5105 `),
5106 ).RunTest(t)
5107}
5108
Spandan Das59a4a2b2024-01-09 21:35:56 +00005109// A minimal context object for use with DexJarBuildPath
5110type moduleErrorfTestCtx struct {
5111}
5112
5113func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5114}
5115
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005116func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005117 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005118 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005119 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005120 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5121 // is disabled.
5122 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005123
5124 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5125 // file creation.
5126 java.FixtureConfigureBootJars("platform:foo"),
5127 android.FixtureModifyMockFS(func(fs android.MockFS) {
5128 fs["platform/Android.bp"] = []byte(`
5129 java_library {
5130 name: "foo",
5131 srcs: ["Test.java"],
5132 compile_dex: true,
5133 }
5134 `)
5135 fs["platform/Test.java"] = nil
5136 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005137 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005138
Paul Duffin40a3f652021-07-19 13:11:24 +01005139 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005140 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005141 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005142 var rule android.TestingBuildParams
5143
5144 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5145 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005146 }
5147
Paul Duffin40a3f652021-07-19 13:11:24 +01005148 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5149 t.Helper()
5150 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5151 var rule android.TestingBuildParams
5152
5153 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5154 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5155 }
5156
Paul Duffin89f570a2021-06-16 01:42:33 +01005157 fragment := java.ApexVariantReference{
5158 Apex: proptools.StringPtr("myapex"),
5159 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5160 }
5161
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005162 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005163 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005164 bp := `
5165 prebuilt_apex {
5166 name: "myapex",
5167 arch: {
5168 arm64: {
5169 src: "myapex-arm64.apex",
5170 },
5171 arm: {
5172 src: "myapex-arm.apex",
5173 },
5174 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005175 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5176 }
5177
5178 prebuilt_bootclasspath_fragment {
5179 name: "my-bootclasspath-fragment",
5180 contents: ["libfoo", "libbar"],
5181 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005182 hidden_api: {
5183 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5184 metadata: "my-bootclasspath-fragment/metadata.csv",
5185 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005186 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5187 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5188 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005189 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005190 }
5191
Spandan Das52c01a12024-09-20 01:09:48 +00005192 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005193 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005194 public: {
5195 jars: ["libfoo.jar"],
5196 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005197 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005198 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005199 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005200 }
Paul Duffin37856732021-02-26 14:24:15 +00005201
5202 java_sdk_library_import {
5203 name: "libbar",
5204 public: {
5205 jars: ["libbar.jar"],
5206 },
5207 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005208 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005209 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005210 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005211 `
5212
Paul Duffin89f570a2021-06-16 01:42:33 +01005213 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005214
Paul Duffin537ea3d2021-05-14 10:38:00 +01005215 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005216 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005217 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005218 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005219 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005220 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 +01005221 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005222 })
5223
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005224 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005225 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005226 bp := `
5227 apex_set {
5228 name: "myapex",
5229 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005230 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005231 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5232 }
5233
Paul Duffin89f570a2021-06-16 01:42:33 +01005234 prebuilt_bootclasspath_fragment {
5235 name: "my-bootclasspath-fragment",
5236 contents: ["libfoo", "libbar"],
5237 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005238 hidden_api: {
5239 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5240 metadata: "my-bootclasspath-fragment/metadata.csv",
5241 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005242 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5243 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5244 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005245 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005246 }
5247
Liz Kammer2dc72442023-04-20 10:10:48 -04005248 prebuilt_systemserverclasspath_fragment {
5249 name: "my-systemserverclasspath-fragment",
5250 contents: ["libbaz"],
5251 apex_available: ["myapex"],
5252 }
5253
Spandan Das52c01a12024-09-20 01:09:48 +00005254 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005255 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005256 public: {
5257 jars: ["libfoo.jar"],
5258 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005259 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005260 shared_library: false,
5261 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005262 }
5263
Spandan Das52c01a12024-09-20 01:09:48 +00005264
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005265 java_sdk_library_import {
5266 name: "libbar",
5267 public: {
5268 jars: ["libbar.jar"],
5269 },
5270 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005271 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005272 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005273 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005274
5275 java_sdk_library_import {
5276 name: "libbaz",
5277 public: {
5278 jars: ["libbaz.jar"],
5279 },
5280 apex_available: ["myapex"],
5281 shared_library: false,
5282 permitted_packages: ["baz"],
5283 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005284 `
5285
Paul Duffin89f570a2021-06-16 01:42:33 +01005286 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005287
Paul Duffin537ea3d2021-05-14 10:38:00 +01005288 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005289 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005290 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005291 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005292 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005293 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 +01005294 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005295
5296 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5297
5298 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005299 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005300 "myjavalib.myapex",
5301 "libfoo.myapex",
5302 "libbar.myapex",
5303 "libbaz.myapex",
5304 }
5305 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5306 for i, e := range mkEntries {
5307 g := e.OverrideName
5308 if w := overrideNames[i]; w != g {
5309 t.Errorf("Expected override name %q, got %q", w, g)
5310 }
5311 }
5312
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005313 })
5314
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005315 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005316 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005317 bp := `
5318 prebuilt_apex {
5319 name: "myapex",
5320 arch: {
5321 arm64: {
5322 src: "myapex-arm64.apex",
5323 },
5324 arm: {
5325 src: "myapex-arm.apex",
5326 },
5327 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005328 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5329 }
5330
5331 prebuilt_bootclasspath_fragment {
5332 name: "my-bootclasspath-fragment",
5333 contents: ["libfoo", "libbar"],
5334 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005335 hidden_api: {
5336 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5337 metadata: "my-bootclasspath-fragment/metadata.csv",
5338 index: "my-bootclasspath-fragment/index.csv",
5339 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5340 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5341 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005342 }
5343
5344 java_import {
5345 name: "libfoo",
5346 jars: ["libfoo.jar"],
5347 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005348 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005349 }
5350
5351 java_library {
5352 name: "libfoo",
5353 srcs: ["foo/bar/MyClass.java"],
5354 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005355 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 }
Paul Duffin37856732021-02-26 14:24:15 +00005357
5358 java_sdk_library_import {
5359 name: "libbar",
5360 public: {
5361 jars: ["libbar.jar"],
5362 },
5363 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005364 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005365 }
5366
5367 java_sdk_library {
5368 name: "libbar",
5369 srcs: ["foo/bar/MyClass.java"],
5370 unsafe_ignore_missing_latest_api: true,
5371 apex_available: ["myapex"],
5372 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005373 `
5374
5375 // In this test the source (java_library) libfoo is active since the
5376 // prebuilt (java_import) defaults to prefer:false. However the
5377 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5378 // find the dex boot jar in it. We either need to disable the source libfoo
5379 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005380 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005381 // dexbootjar check is skipped if AllowMissingDependencies is true
5382 preparerAllowMissingDeps := android.GroupFixturePreparers(
5383 preparer,
5384 android.PrepareForTestWithAllowMissingDependencies,
5385 )
5386 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005387 })
5388
5389 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005390 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005391 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005392 apex {
5393 name: "myapex",
5394 key: "myapex.key",
5395 updatable: false,
5396 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5397 }
5398
5399 apex_key {
5400 name: "myapex.key",
5401 public_key: "testkey.avbpubkey",
5402 private_key: "testkey.pem",
5403 }
5404
5405 bootclasspath_fragment {
5406 name: "my-bootclasspath-fragment",
5407 contents: ["libfoo", "libbar"],
5408 apex_available: ["myapex"],
5409 hidden_api: {
5410 split_packages: ["*"],
5411 },
5412 }
5413
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005414 prebuilt_apex {
5415 name: "myapex",
5416 arch: {
5417 arm64: {
5418 src: "myapex-arm64.apex",
5419 },
5420 arm: {
5421 src: "myapex-arm.apex",
5422 },
5423 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005424 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5425 }
5426
5427 prebuilt_bootclasspath_fragment {
5428 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005429 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005430 contents: ["libfoo", "libbar"],
5431 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005432 hidden_api: {
5433 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5434 metadata: "my-bootclasspath-fragment/metadata.csv",
5435 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005436 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5437 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5438 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005439 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005440 }
5441
Spandan Das52c01a12024-09-20 01:09:48 +00005442 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005443 name: "libfoo",
5444 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005445 public: {
5446 jars: ["libfoo.jar"],
5447 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005449 shared_library: false,
5450 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 }
5452
5453 java_library {
5454 name: "libfoo",
5455 srcs: ["foo/bar/MyClass.java"],
5456 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005457 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005458 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 }
Paul Duffin37856732021-02-26 14:24:15 +00005460
5461 java_sdk_library_import {
5462 name: "libbar",
5463 prefer: true,
5464 public: {
5465 jars: ["libbar.jar"],
5466 },
5467 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005468 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005469 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005470 }
5471
5472 java_sdk_library {
5473 name: "libbar",
5474 srcs: ["foo/bar/MyClass.java"],
5475 unsafe_ignore_missing_latest_api: true,
5476 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005477 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005478 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005479 `
5480
Paul Duffin89f570a2021-06-16 01:42:33 +01005481 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005482
Paul Duffin537ea3d2021-05-14 10:38:00 +01005483 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005484 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005485 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005486 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005487 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005488 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 +01005489 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005490 })
5491
5492 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005493 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005494 bp := `
5495 apex {
5496 name: "myapex",
5497 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005498 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005499 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005500 }
5501
5502 apex_key {
5503 name: "myapex.key",
5504 public_key: "testkey.avbpubkey",
5505 private_key: "testkey.pem",
5506 }
5507
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005508 bootclasspath_fragment {
5509 name: "my-bootclasspath-fragment",
5510 contents: ["libfoo", "libbar"],
5511 apex_available: ["myapex"],
5512 hidden_api: {
5513 split_packages: ["*"],
5514 },
5515 }
5516
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005517 prebuilt_apex {
5518 name: "myapex",
5519 arch: {
5520 arm64: {
5521 src: "myapex-arm64.apex",
5522 },
5523 arm: {
5524 src: "myapex-arm.apex",
5525 },
5526 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005527 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5528 }
5529
5530 prebuilt_bootclasspath_fragment {
5531 name: "my-bootclasspath-fragment",
5532 contents: ["libfoo", "libbar"],
5533 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005534 hidden_api: {
5535 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5536 metadata: "my-bootclasspath-fragment/metadata.csv",
5537 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005538 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5539 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5540 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005541 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005542 }
5543
5544 java_import {
5545 name: "libfoo",
5546 jars: ["libfoo.jar"],
5547 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005548 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005549 }
5550
5551 java_library {
5552 name: "libfoo",
5553 srcs: ["foo/bar/MyClass.java"],
5554 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005555 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005556 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005557 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 }
Paul Duffin37856732021-02-26 14:24:15 +00005559
5560 java_sdk_library_import {
5561 name: "libbar",
5562 public: {
5563 jars: ["libbar.jar"],
5564 },
5565 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005566 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005567 }
5568
5569 java_sdk_library {
5570 name: "libbar",
5571 srcs: ["foo/bar/MyClass.java"],
5572 unsafe_ignore_missing_latest_api: true,
5573 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005574 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005575 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005576 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005577 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005578 `
5579
Paul Duffin89f570a2021-06-16 01:42:33 +01005580 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005581
Paul Duffin537ea3d2021-05-14 10:38:00 +01005582 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005583 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005584 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5585 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005586 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5587 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 +01005588 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005589 })
5590
5591 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005592 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005593 bp := `
5594 apex {
5595 name: "myapex",
5596 enabled: false,
5597 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005598 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005599 }
5600
5601 apex_key {
5602 name: "myapex.key",
5603 public_key: "testkey.avbpubkey",
5604 private_key: "testkey.pem",
5605 }
5606
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005607 bootclasspath_fragment {
5608 name: "my-bootclasspath-fragment",
5609 enabled: false,
5610 contents: ["libfoo", "libbar"],
5611 apex_available: ["myapex"],
5612 hidden_api: {
5613 split_packages: ["*"],
5614 },
5615 }
5616
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005617 prebuilt_apex {
5618 name: "myapex",
5619 arch: {
5620 arm64: {
5621 src: "myapex-arm64.apex",
5622 },
5623 arm: {
5624 src: "myapex-arm.apex",
5625 },
5626 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005627 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5628 }
5629
5630 prebuilt_bootclasspath_fragment {
5631 name: "my-bootclasspath-fragment",
5632 contents: ["libfoo", "libbar"],
5633 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005634 hidden_api: {
5635 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5636 metadata: "my-bootclasspath-fragment/metadata.csv",
5637 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005638 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5639 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5640 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005641 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 }
5643
5644 java_import {
5645 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005646 jars: ["libfoo.jar"],
5647 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005648 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005649 }
5650
5651 java_library {
5652 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005653 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005654 srcs: ["foo/bar/MyClass.java"],
5655 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005656 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005657 }
Paul Duffin37856732021-02-26 14:24:15 +00005658
5659 java_sdk_library_import {
5660 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005661 public: {
5662 jars: ["libbar.jar"],
5663 },
5664 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005665 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005666 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005667 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005668 }
5669
5670 java_sdk_library {
5671 name: "libbar",
5672 srcs: ["foo/bar/MyClass.java"],
5673 unsafe_ignore_missing_latest_api: true,
5674 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005675 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005676 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005677 `
Cole Fausta963b942024-04-11 17:43:00 -07005678 // This test disables libbar, which causes the ComponentDepsMutator to add
5679 // deps on libbar.stubs and other sub-modules that don't exist. We can
5680 // enable AllowMissingDependencies to work around that, but enabling that
5681 // causes extra checks for missing source files to dex_bootjars, so add those
5682 // to the mock fs as well.
5683 preparer2 := android.GroupFixturePreparers(
5684 preparer,
5685 android.PrepareForTestWithAllowMissingDependencies,
5686 android.FixtureMergeMockFs(map[string][]byte{
5687 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005688 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005689 }),
5690 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005691
Cole Fausta963b942024-04-11 17:43:00 -07005692 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005693
Paul Duffin537ea3d2021-05-14 10:38:00 +01005694 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005695 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005696 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005697 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005698 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005699 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 +01005700 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005701 })
Spandan Das3a392012024-01-17 18:26:27 +00005702
Spandan Dasf2c10572024-02-27 04:49:52 +00005703 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005704 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005705 bp := `
5706 // Source
5707 apex {
5708 name: "myapex",
5709 enabled: false,
5710 key: "myapex.key",
5711 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5712 }
5713
5714 apex_key {
5715 name: "myapex.key",
5716 public_key: "testkey.avbpubkey",
5717 private_key: "testkey.pem",
5718 }
5719
5720 // Prebuilt
5721 prebuilt_apex {
5722 name: "myapex.v1",
5723 source_apex_name: "myapex",
5724 arch: {
5725 arm64: {
5726 src: "myapex-arm64.apex",
5727 },
5728 arm: {
5729 src: "myapex-arm.apex",
5730 },
5731 },
5732 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5733 prefer: true,
5734 }
5735 prebuilt_apex {
5736 name: "myapex.v2",
5737 source_apex_name: "myapex",
5738 arch: {
5739 arm64: {
5740 src: "myapex-arm64.apex",
5741 },
5742 arm: {
5743 src: "myapex-arm.apex",
5744 },
5745 },
5746 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5747 prefer: true,
5748 }
5749
5750 prebuilt_bootclasspath_fragment {
5751 name: "my-bootclasspath-fragment",
5752 contents: ["libfoo", "libbar"],
5753 apex_available: ["myapex"],
5754 hidden_api: {
5755 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5756 metadata: "my-bootclasspath-fragment/metadata.csv",
5757 index: "my-bootclasspath-fragment/index.csv",
5758 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5759 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5760 },
5761 prefer: true,
5762 }
5763
5764 java_import {
5765 name: "libfoo",
5766 jars: ["libfoo.jar"],
5767 apex_available: ["myapex"],
5768 prefer: true,
5769 }
5770 java_import {
5771 name: "libbar",
5772 jars: ["libbar.jar"],
5773 apex_available: ["myapex"],
5774 prefer: true,
5775 }
5776 `
5777
Spandan Dasf2c10572024-02-27 04:49:52 +00005778 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 +00005779 })
5780
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005781}
5782
Roland Levillain630846d2019-06-26 12:48:34 +01005783func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005785 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005786 apex_test {
5787 name: "myapex",
5788 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005789 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005790 tests: [
5791 "mytest",
5792 ],
5793 }
5794
5795 apex_key {
5796 name: "myapex.key",
5797 public_key: "testkey.avbpubkey",
5798 private_key: "testkey.pem",
5799 }
5800
Liz Kammer1c14a212020-05-12 15:26:55 -07005801 filegroup {
5802 name: "fg",
5803 srcs: [
5804 "baz",
5805 "bar/baz"
5806 ],
5807 }
5808
Roland Levillain630846d2019-06-26 12:48:34 +01005809 cc_test {
5810 name: "mytest",
5811 gtest: false,
5812 srcs: ["mytest.cpp"],
5813 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005814 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005815 system_shared_libs: [],
5816 static_executable: true,
5817 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005818 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005819 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005820
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005821 cc_library {
5822 name: "mylib",
5823 srcs: ["mylib.cpp"],
5824 system_shared_libs: [],
5825 stl: "none",
5826 }
5827
Liz Kammer5bd365f2020-05-27 15:15:11 -07005828 filegroup {
5829 name: "fg2",
5830 srcs: [
5831 "testdata/baz"
5832 ],
5833 }
Roland Levillain630846d2019-06-26 12:48:34 +01005834 `)
5835
Jooyung Hana0503a52023-08-23 13:12:50 +09005836 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005837 copyCmds := apexRule.Args["copy_commands"]
5838
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005839 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005840 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005841 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005842
Liz Kammer1c14a212020-05-12 15:26:55 -07005843 //Ensure that test data are copied into apex.
5844 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5845 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5846
Roland Levillainf89cd092019-07-29 16:22:59 +01005847 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005848 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005849 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005850 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005851 prefix := "TARGET_"
5852 var builder strings.Builder
5853 data.Custom(&builder, name, prefix, "", data)
5854 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005855 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005856 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005857}
5858
Jooyung Hand48f3c32019-08-23 11:18:57 +09005859func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005860 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005861 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5862 apex {
5863 name: "myapex",
5864 key: "myapex.key",
5865 native_shared_libs: ["libfoo"],
5866 }
5867
5868 apex_key {
5869 name: "myapex.key",
5870 public_key: "testkey.avbpubkey",
5871 private_key: "testkey.pem",
5872 }
5873
5874 cc_library {
5875 name: "libfoo",
5876 stl: "none",
5877 system_shared_libs: [],
5878 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005879 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005880 }
5881 `)
5882 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5883 apex {
5884 name: "myapex",
5885 key: "myapex.key",
5886 java_libs: ["myjar"],
5887 }
5888
5889 apex_key {
5890 name: "myapex.key",
5891 public_key: "testkey.avbpubkey",
5892 private_key: "testkey.pem",
5893 }
5894
5895 java_library {
5896 name: "myjar",
5897 srcs: ["foo/bar/MyClass.java"],
5898 sdk_version: "none",
5899 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005900 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005901 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005902 }
5903 `)
5904}
5905
Bill Peckhama41a6962021-01-11 10:58:54 -08005906func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005907 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005908 apex {
5909 name: "myapex",
5910 key: "myapex.key",
5911 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005912 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005913 }
5914
5915 apex_key {
5916 name: "myapex.key",
5917 public_key: "testkey.avbpubkey",
5918 private_key: "testkey.pem",
5919 }
5920
5921 java_import {
5922 name: "myjavaimport",
5923 apex_available: ["myapex"],
5924 jars: ["my.jar"],
5925 compile_dex: true,
5926 }
5927 `)
5928
Jooyung Hana0503a52023-08-23 13:12:50 +09005929 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005930 apexRule := module.Rule("apexRule")
5931 copyCmds := apexRule.Args["copy_commands"]
5932 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5933}
5934
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005935func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005936 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005937 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005938 apex {
5939 name: "myapex",
5940 key: "myapex.key",
5941 apps: [
5942 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005943 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005945 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005946 }
5947
5948 apex_key {
5949 name: "myapex.key",
5950 public_key: "testkey.avbpubkey",
5951 private_key: "testkey.pem",
5952 }
5953
5954 android_app {
5955 name: "AppFoo",
5956 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005957 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005958 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005959 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005960 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005962 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005963 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005964
5965 android_app {
5966 name: "AppFooPriv",
5967 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005968 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005969 system_modules: "none",
5970 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005971 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005972 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005973 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005974 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005975
5976 cc_library_shared {
5977 name: "libjni",
5978 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005979 shared_libs: ["libfoo"],
5980 stl: "none",
5981 system_shared_libs: [],
5982 apex_available: [ "myapex" ],
5983 sdk_version: "current",
5984 }
5985
5986 cc_library_shared {
5987 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005988 stl: "none",
5989 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005990 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005991 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005992 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005993 `)
5994
Jooyung Hana0503a52023-08-23 13:12:50 +09005995 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005996 apexRule := module.Rule("apexRule")
5997 copyCmds := apexRule.Args["copy_commands"]
5998
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005999 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6000 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006001 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006002
Colin Crossaede88c2020-08-11 12:17:01 -07006003 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006004 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006005 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006006 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006007 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006008 // JNI libraries including transitive deps are
6009 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006010 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006011 // ... embedded inside APK (jnilibs.zip)
6012 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6013 // ... and not directly inside the APEX
6014 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6015 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006016
6017 apexBundle := module.Module().(*apexBundle)
6018 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6019 var builder strings.Builder
6020 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6021 androidMk := builder.String()
6022 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6023 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6024 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6025 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6026 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6027 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 +01006028}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006029
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006030func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006031 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006032 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6033 for _, id := range invalidBuildIds {
6034 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6035 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6036 variables.BuildId = proptools.StringPtr(id)
6037 })
6038 testApexError(t, message, `apex {
6039 name: "myapex",
6040 key: "myapex.key",
6041 apps: ["AppFooPrebuilt"],
6042 updatable: false,
6043 }
6044
6045 apex_key {
6046 name: "myapex.key",
6047 public_key: "testkey.avbpubkey",
6048 private_key: "testkey.pem",
6049 }
6050
6051 android_app_import {
6052 name: "AppFooPrebuilt",
6053 apk: "PrebuiltAppFoo.apk",
6054 presigned: true,
6055 apex_available: ["myapex"],
6056 }
6057 `, fixture)
6058 }
6059}
6060
Dario Frenicde2a032019-10-27 00:29:22 +01006061func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006062 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006063 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006064 apex {
6065 name: "myapex",
6066 key: "myapex.key",
6067 apps: [
6068 "AppFooPrebuilt",
6069 "AppFooPrivPrebuilt",
6070 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006071 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006072 }
6073
6074 apex_key {
6075 name: "myapex.key",
6076 public_key: "testkey.avbpubkey",
6077 private_key: "testkey.pem",
6078 }
6079
6080 android_app_import {
6081 name: "AppFooPrebuilt",
6082 apk: "PrebuiltAppFoo.apk",
6083 presigned: true,
6084 dex_preopt: {
6085 enabled: false,
6086 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006087 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006088 }
6089
6090 android_app_import {
6091 name: "AppFooPrivPrebuilt",
6092 apk: "PrebuiltAppFooPriv.apk",
6093 privileged: true,
6094 presigned: true,
6095 dex_preopt: {
6096 enabled: false,
6097 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006098 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006099 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006100 }
6101 `)
6102
Jooyung Hana0503a52023-08-23 13:12:50 +09006103 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006104 apexRule := module.Rule("apexRule")
6105 copyCmds := apexRule.Args["copy_commands"]
6106
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006107 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6108 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006109}
6110
6111func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006112 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006113 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006114 apex {
6115 name: "myapex",
6116 key: "myapex.key",
6117 apps: [
6118 "AppFoo",
6119 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006120 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006121 }
6122
6123 apex_key {
6124 name: "myapex.key",
6125 public_key: "testkey.avbpubkey",
6126 private_key: "testkey.pem",
6127 }
6128
6129 android_app {
6130 name: "AppFoo",
6131 srcs: ["foo/bar/MyClass.java"],
6132 sdk_version: "none",
6133 system_modules: "none",
6134 apex_available: [ "myapex" ],
6135 }
6136
6137 android_app_import {
6138 name: "AppFoo",
6139 apk: "AppFooPrebuilt.apk",
6140 filename: "AppFooPrebuilt.apk",
6141 presigned: true,
6142 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006143 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006144 }
6145 `, withFiles(map[string][]byte{
6146 "AppFooPrebuilt.apk": nil,
6147 }))
6148
Jooyung Hana0503a52023-08-23 13:12:50 +09006149 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006150 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006151 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006152}
6153
Dario Freni6f3937c2019-12-20 22:58:03 +00006154func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006155 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006156 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006157 apex {
6158 name: "myapex",
6159 key: "myapex.key",
6160 apps: [
6161 "TesterHelpAppFoo",
6162 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006163 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006164 }
6165
6166 apex_key {
6167 name: "myapex.key",
6168 public_key: "testkey.avbpubkey",
6169 private_key: "testkey.pem",
6170 }
6171
6172 android_test_helper_app {
6173 name: "TesterHelpAppFoo",
6174 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006175 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006176 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006177 }
6178
6179 `)
6180
Jooyung Hana0503a52023-08-23 13:12:50 +09006181 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006182 apexRule := module.Rule("apexRule")
6183 copyCmds := apexRule.Args["copy_commands"]
6184
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006185 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006186}
6187
Jooyung Han18020ea2019-11-13 10:50:48 +09006188func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006189 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006190 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006191 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006192 apex {
6193 name: "myapex",
6194 key: "myapex.key",
6195 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006196 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006197 }
6198
6199 apex_key {
6200 name: "myapex.key",
6201 public_key: "testkey.avbpubkey",
6202 private_key: "testkey.pem",
6203 }
6204
6205 apex {
6206 name: "otherapex",
6207 key: "myapex.key",
6208 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006209 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006210 }
6211
6212 cc_defaults {
6213 name: "libfoo-defaults",
6214 apex_available: ["otherapex"],
6215 }
6216
6217 cc_library {
6218 name: "libfoo",
6219 defaults: ["libfoo-defaults"],
6220 stl: "none",
6221 system_shared_libs: [],
6222 }`)
6223}
6224
Paul Duffine52e66f2020-03-30 17:54:29 +01006225func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006226 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006227 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006228 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006229 apex {
6230 name: "myapex",
6231 key: "myapex.key",
6232 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006233 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006234 }
6235
6236 apex_key {
6237 name: "myapex.key",
6238 public_key: "testkey.avbpubkey",
6239 private_key: "testkey.pem",
6240 }
6241
6242 apex {
6243 name: "otherapex",
6244 key: "otherapex.key",
6245 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006246 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006247 }
6248
6249 apex_key {
6250 name: "otherapex.key",
6251 public_key: "testkey.avbpubkey",
6252 private_key: "testkey.pem",
6253 }
6254
6255 cc_library {
6256 name: "libfoo",
6257 stl: "none",
6258 system_shared_libs: [],
6259 apex_available: ["otherapex"],
6260 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006261
6262 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6263 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6264 testApex(t, `
6265 apex {
6266 name: "com.sdv.myapex",
6267 key: "myapex.key",
6268 native_shared_libs: ["libfoo"],
6269 updatable: false,
6270 product_specific: true,
6271 }
6272
6273 apex_key {
6274 name: "myapex.key",
6275 public_key: "testkey.avbpubkey",
6276 private_key: "testkey.pem",
6277 }
6278
6279 apex {
6280 name: "com.any.otherapex",
6281 key: "otherapex.key",
6282 native_shared_libs: ["libfoo"],
6283 updatable: false,
6284 }
6285
6286 apex_key {
6287 name: "otherapex.key",
6288 public_key: "testkey.avbpubkey",
6289 private_key: "testkey.pem",
6290 }
6291
6292 cc_library {
6293 name: "libfoo",
6294 stl: "none",
6295 system_shared_libs: [],
6296 apex_available: ["com.any.otherapex"],
6297 product_specific: true,
6298 }`,
6299 android.FixtureMergeMockFs(android.MockFS{
6300 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6301 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6302 }))
6303
6304 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6305 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6306 apex {
6307 name: "com.sdv.myapex",
6308 key: "myapex.key",
6309 native_shared_libs: ["libfoo"],
6310 updatable: false,
6311 }
6312
6313 apex_key {
6314 name: "myapex.key",
6315 public_key: "testkey.avbpubkey",
6316 private_key: "testkey.pem",
6317 }
6318
6319 apex {
6320 name: "com.any.otherapex",
6321 key: "otherapex.key",
6322 native_shared_libs: ["libfoo"],
6323 updatable: false,
6324 }
6325
6326 apex_key {
6327 name: "otherapex.key",
6328 public_key: "testkey.avbpubkey",
6329 private_key: "testkey.pem",
6330 }
6331
6332 cc_library {
6333 name: "libfoo",
6334 stl: "none",
6335 system_shared_libs: [],
6336 apex_available: ["com.any.otherapex"],
6337 }`,
6338 android.FixtureMergeMockFs(android.MockFS{
6339 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6340 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6341 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006342}
Jiyong Park127b40b2019-09-30 16:04:35 +09006343
Paul Duffine52e66f2020-03-30 17:54:29 +01006344func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006345 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006346 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006347 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006348.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006349.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006350.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006351.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006352.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006353.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006354 apex {
6355 name: "myapex",
6356 key: "myapex.key",
6357 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006358 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006359 }
6360
6361 apex_key {
6362 name: "myapex.key",
6363 public_key: "testkey.avbpubkey",
6364 private_key: "testkey.pem",
6365 }
6366
Jiyong Park127b40b2019-09-30 16:04:35 +09006367 cc_library {
6368 name: "libfoo",
6369 stl: "none",
6370 shared_libs: ["libbar"],
6371 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006372 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006373 }
6374
6375 cc_library {
6376 name: "libbar",
6377 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006378 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006379 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006380 apex_available: ["myapex"],
6381 }
6382
6383 cc_library {
6384 name: "libbaz",
6385 stl: "none",
6386 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006387 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006388
6389 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6390 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6391 testApex(t, `
6392 apex {
6393 name: "com.sdv.myapex",
6394 key: "myapex.key",
6395 native_shared_libs: ["libfoo"],
6396 updatable: false,
6397 product_specific: true,
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 product_specific: true,
6413 }
6414
6415 cc_library {
6416 name: "libbar",
6417 stl: "none",
6418 shared_libs: ["libbaz"],
6419 system_shared_libs: [],
6420 apex_available: ["com.sdv.myapex"],
6421 product_specific: true,
6422 }
6423
6424 cc_library {
6425 name: "libbaz",
6426 stl: "none",
6427 system_shared_libs: [],
6428 product_specific: true,
6429 }`,
6430 android.FixtureMergeMockFs(android.MockFS{
6431 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6432 }))
6433
6434 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6435 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6436 apex {
6437 name: "com.sdv.myapex",
6438 key: "myapex.key",
6439 native_shared_libs: ["libfoo"],
6440 updatable: false,
6441 }
6442
6443 apex_key {
6444 name: "myapex.key",
6445 public_key: "testkey.avbpubkey",
6446 private_key: "testkey.pem",
6447 }
6448
6449 cc_library {
6450 name: "libfoo",
6451 stl: "none",
6452 shared_libs: ["libbar"],
6453 system_shared_libs: [],
6454 apex_available: ["com.sdv.myapex"],
6455 }
6456
6457 cc_library {
6458 name: "libbar",
6459 stl: "none",
6460 shared_libs: ["libbaz"],
6461 system_shared_libs: [],
6462 apex_available: ["com.sdv.myapex"],
6463 }
6464
6465 cc_library {
6466 name: "libbaz",
6467 stl: "none",
6468 system_shared_libs: [],
6469 }`,
6470 android.FixtureMergeMockFs(android.MockFS{
6471 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6472 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006473}
Jiyong Park127b40b2019-09-30 16:04:35 +09006474
Liz Kammer5f108fa2023-05-11 14:33:17 -04006475func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006476 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006477 testApex(t, `
6478 apex {
6479 name: "myapex",
6480 key: "myapex.key",
6481 native_shared_libs: ["libfoo"],
6482 updatable: false,
6483 }
6484
6485 apex_key {
6486 name: "myapex.key",
6487 public_key: "testkey.avbpubkey",
6488 private_key: "testkey.pem",
6489 }
6490
6491 cc_library {
6492 name: "libfoo",
6493 stl: "none",
6494 static_libs: ["libbar"],
6495 system_shared_libs: [],
6496 apex_available: ["myapex"],
6497 }
6498
6499 cc_library {
6500 name: "libbar",
6501 stl: "none",
6502 shared_libs: ["libbaz"],
6503 system_shared_libs: [],
6504 apex_available: ["myapex"],
6505 }
6506
6507 cc_library {
6508 name: "libbaz",
6509 stl: "none",
6510 system_shared_libs: [],
6511 }`)
6512
6513 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6514 apex {
6515 name: "myapex",
6516 key: "myapex.key",
6517 native_shared_libs: ["libfoo"],
6518 updatable: false,
6519 }
6520
6521 apex_key {
6522 name: "myapex.key",
6523 public_key: "testkey.avbpubkey",
6524 private_key: "testkey.pem",
6525 }
6526
6527 cc_library {
6528 name: "libfoo",
6529 stl: "none",
6530 static_libs: ["libbar"],
6531 system_shared_libs: [],
6532 apex_available: ["myapex"],
6533 }
6534
6535 cc_library {
6536 name: "libbar",
6537 stl: "none",
6538 system_shared_libs: [],
6539 }`)
6540}
6541
Paul Duffine52e66f2020-03-30 17:54:29 +01006542func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006543 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006544 testApexError(t, "\"otherapex\" is not a valid module name", `
6545 apex {
6546 name: "myapex",
6547 key: "myapex.key",
6548 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006549 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006550 }
6551
6552 apex_key {
6553 name: "myapex.key",
6554 public_key: "testkey.avbpubkey",
6555 private_key: "testkey.pem",
6556 }
6557
6558 cc_library {
6559 name: "libfoo",
6560 stl: "none",
6561 system_shared_libs: [],
6562 apex_available: ["otherapex"],
6563 }`)
6564
Paul Duffine52e66f2020-03-30 17:54:29 +01006565 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006566 apex {
6567 name: "myapex",
6568 key: "myapex.key",
6569 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006570 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006571 }
6572
6573 apex_key {
6574 name: "myapex.key",
6575 public_key: "testkey.avbpubkey",
6576 private_key: "testkey.pem",
6577 }
6578
6579 cc_library {
6580 name: "libfoo",
6581 stl: "none",
6582 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006583 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006584 apex_available: ["myapex"],
6585 }
6586
6587 cc_library {
6588 name: "libbar",
6589 stl: "none",
6590 system_shared_libs: [],
6591 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006592 }
6593
6594 cc_library {
6595 name: "libbaz",
6596 stl: "none",
6597 system_shared_libs: [],
6598 stubs: {
6599 versions: ["10", "20", "30"],
6600 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006601 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006602}
Jiyong Park127b40b2019-09-30 16:04:35 +09006603
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006604func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006605 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006606 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006607 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006608 testApexError(t, "expected an integer between 0-9; got -1", `
6609 apex {
6610 name: "myapex",
6611 key: "myapex.key",
6612 apex_available_name: "com.android.foo",
6613 variant_version: "-1",
6614 updatable: false,
6615 }
6616 apex_key {
6617 name: "myapex.key",
6618 public_key: "testkey.avbpubkey",
6619 private_key: "testkey.pem",
6620 }
6621 `)
6622 })
6623
6624 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006625 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006626 testApexError(t, "expected an integer between 0-9; got 10", `
6627 apex {
6628 name: "myapex",
6629 key: "myapex.key",
6630 apex_available_name: "com.android.foo",
6631 variant_version: "10",
6632 updatable: false,
6633 }
6634 apex_key {
6635 name: "myapex.key",
6636 public_key: "testkey.avbpubkey",
6637 private_key: "testkey.pem",
6638 }
6639 `)
6640 })
6641}
6642
6643func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006644 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006645 context := android.GroupFixturePreparers(
6646 android.PrepareForIntegrationTestWithAndroid,
6647 PrepareForTestWithApexBuildComponents,
6648 android.FixtureMergeMockFs(android.MockFS{
6649 "system/sepolicy/apex/foo-file_contexts": nil,
6650 "system/sepolicy/apex/bar-file_contexts": nil,
6651 }),
6652 )
6653 result := context.RunTestWithBp(t, `
6654 apex {
6655 name: "foo",
6656 key: "myapex.key",
6657 apex_available_name: "com.android.foo",
6658 variant_version: "0",
6659 updatable: false,
6660 }
6661 apex {
6662 name: "bar",
6663 key: "myapex.key",
6664 apex_available_name: "com.android.foo",
6665 variant_version: "3",
6666 updatable: false,
6667 }
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006673 override_apex {
6674 name: "myoverrideapex",
6675 base: "bar",
6676 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006677 `)
6678
Jooyung Hana0503a52023-08-23 13:12:50 +09006679 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006680 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006681 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6682 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6683 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6684 }
6685
Jooyung Hana0503a52023-08-23 13:12:50 +09006686 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006687 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006688 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6689 barActualDefaultVersion := barManifestRule.Args["default_version"]
6690 if barActualDefaultVersion != barExpectedDefaultVersion {
6691 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6692 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006693
Spandan Das50801e22024-05-13 18:29:45 +00006694 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006695 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6696 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6697 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6698 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006699}
6700
Sam Delmericoca816532023-06-02 14:09:50 -04006701func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006702 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006703 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006704 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006705 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6706 apex {
6707 name: "myapex_sminus",
6708 key: "myapex.key",
6709 apps: ["AppFoo"],
6710 apex_available_name: "myapex",
6711 updatable: false,
6712 }
6713 apex {
6714 name: "myapex",
6715 key: "myapex.key",
6716 apps: ["AppFoo"],
6717 updatable: false,
6718 }
6719 apex_key {
6720 name: "myapex.key",
6721 public_key: "testkey.avbpubkey",
6722 private_key: "testkey.pem",
6723 }
6724 android_app {
6725 name: "AppFoo",
6726 srcs: ["foo/bar/MyClass.java"],
6727 sdk_version: "none",
6728 system_modules: "none",
6729 apex_available: [ "myapex_sminus" ],
6730 }`,
6731 android.FixtureMergeMockFs(android.MockFS{
6732 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6733 }),
6734 )
6735 })
6736
6737 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006738 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006739 testApex(t, `
6740 apex {
6741 name: "myapex_sminus",
6742 key: "myapex.key",
6743 apps: ["AppFoo"],
6744 apex_available_name: "myapex",
6745 updatable: false,
6746 }
6747 apex {
6748 name: "myapex",
6749 key: "myapex.key",
6750 apps: ["AppFoo"],
6751 updatable: false,
6752 }
6753 apex_key {
6754 name: "myapex.key",
6755 public_key: "testkey.avbpubkey",
6756 private_key: "testkey.pem",
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 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006772 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006773 testApex(t, `
6774 override_apex {
6775 name: "myoverrideapex_sminus",
6776 base: "myapex_sminus",
6777 key: "myapex.key",
6778 apps: ["AppFooOverride"],
6779 }
6780 override_apex {
6781 name: "myoverrideapex",
6782 base: "myapex",
6783 key: "myapex.key",
6784 apps: ["AppFooOverride"],
6785 }
6786 apex {
6787 name: "myapex_sminus",
6788 key: "myapex.key",
6789 apps: ["AppFoo"],
6790 apex_available_name: "myapex",
6791 updatable: false,
6792 }
6793 apex {
6794 name: "myapex",
6795 key: "myapex.key",
6796 apps: ["AppFoo"],
6797 updatable: false,
6798 }
6799 apex_key {
6800 name: "myapex.key",
6801 public_key: "testkey.avbpubkey",
6802 private_key: "testkey.pem",
6803 }
6804 android_app {
6805 name: "AppFooOverride",
6806 srcs: ["foo/bar/MyClass.java"],
6807 sdk_version: "none",
6808 system_modules: "none",
6809 apex_available: [ "myapex" ],
6810 }
6811 android_app {
6812 name: "AppFoo",
6813 srcs: ["foo/bar/MyClass.java"],
6814 sdk_version: "none",
6815 system_modules: "none",
6816 apex_available: [ "myapex" ],
6817 }`,
6818 android.FixtureMergeMockFs(android.MockFS{
6819 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6820 }),
6821 )
6822 })
6823}
6824
6825func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006826 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006827 context := android.GroupFixturePreparers(
6828 android.PrepareForIntegrationTestWithAndroid,
6829 PrepareForTestWithApexBuildComponents,
6830 java.PrepareForTestWithDexpreopt,
6831 android.FixtureMergeMockFs(android.MockFS{
6832 "system/sepolicy/apex/myapex-file_contexts": nil,
6833 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6834 }),
6835 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6836 variables.BuildId = proptools.StringPtr("buildid")
6837 }),
6838 )
6839 context.RunTestWithBp(t, `
6840 override_apex {
6841 name: "myoverrideapex_sminus",
6842 base: "myapex_sminus",
6843 }
6844 override_apex {
6845 name: "myoverrideapex",
6846 base: "myapex",
6847 }
6848 apex {
6849 name: "myapex",
6850 key: "myapex.key",
6851 apps: ["AppFoo"],
6852 updatable: false,
6853 }
6854 apex {
6855 name: "myapex_sminus",
6856 apex_available_name: "myapex",
6857 key: "myapex.key",
6858 apps: ["AppFoo_sminus"],
6859 updatable: false,
6860 }
6861 apex_key {
6862 name: "myapex.key",
6863 public_key: "testkey.avbpubkey",
6864 private_key: "testkey.pem",
6865 }
6866 android_app {
6867 name: "AppFoo",
6868 srcs: ["foo/bar/MyClass.java"],
6869 sdk_version: "none",
6870 system_modules: "none",
6871 apex_available: [ "myapex" ],
6872 }
6873 android_app {
6874 name: "AppFoo_sminus",
6875 srcs: ["foo/bar/MyClass.java"],
6876 sdk_version: "none",
6877 min_sdk_version: "29",
6878 system_modules: "none",
6879 apex_available: [ "myapex" ],
6880 }`)
6881}
6882
Jiyong Park89e850a2020-04-07 16:37:39 +09006883func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006885 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006886 apex {
6887 name: "myapex",
6888 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006889 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006890 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006891 }
6892
6893 apex_key {
6894 name: "myapex.key",
6895 public_key: "testkey.avbpubkey",
6896 private_key: "testkey.pem",
6897 }
6898
6899 cc_library {
6900 name: "libfoo",
6901 stl: "none",
6902 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006903 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006904 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006905 }
6906
6907 cc_library {
6908 name: "libfoo2",
6909 stl: "none",
6910 system_shared_libs: [],
6911 shared_libs: ["libbaz"],
6912 apex_available: ["//apex_available:platform"],
6913 }
6914
6915 cc_library {
6916 name: "libbar",
6917 stl: "none",
6918 system_shared_libs: [],
6919 apex_available: ["myapex"],
6920 }
6921
6922 cc_library {
6923 name: "libbaz",
6924 stl: "none",
6925 system_shared_libs: [],
6926 apex_available: ["myapex"],
6927 stubs: {
6928 versions: ["1"],
6929 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006930 }`)
6931
Jiyong Park89e850a2020-04-07 16:37:39 +09006932 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6933 // because it depends on libbar which isn't available to platform
6934 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6935 if libfoo.NotAvailableForPlatform() != true {
6936 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6937 }
6938
6939 // libfoo2 however can be available to platform because it depends on libbaz which provides
6940 // stubs
6941 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6942 if libfoo2.NotAvailableForPlatform() == true {
6943 t.Errorf("%q should be available to platform", libfoo2.String())
6944 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006945}
Jiyong Parka90ca002019-10-07 15:47:24 +09006946
Paul Duffine52e66f2020-03-30 17:54:29 +01006947func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006948 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006949 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006950 apex {
6951 name: "myapex",
6952 key: "myapex.key",
6953 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006954 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006955 }
6956
6957 apex_key {
6958 name: "myapex.key",
6959 public_key: "testkey.avbpubkey",
6960 private_key: "testkey.pem",
6961 }
6962
6963 cc_library {
6964 name: "libfoo",
6965 stl: "none",
6966 system_shared_libs: [],
6967 apex_available: ["myapex"],
6968 static: {
6969 apex_available: ["//apex_available:platform"],
6970 },
6971 }`)
6972
Jiyong Park89e850a2020-04-07 16:37:39 +09006973 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6974 if libfooShared.NotAvailableForPlatform() != true {
6975 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6976 }
6977 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6978 if libfooStatic.NotAvailableForPlatform() != false {
6979 t.Errorf("%q should be available to platform", libfooStatic.String())
6980 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006981}
6982
Jooyung Han9a419e22024-08-16 17:14:21 +09006983func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006984 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006985
6986 for _, tc := range []struct {
6987 name string
6988 apexAvailable string
6989 expectedError string
6990 }{
6991 {
6992 name: "prefix matches correctly",
6993 apexAvailable: "com.foo.*",
6994 },
6995 {
6996 name: "prefix doesn't match",
6997 apexAvailable: "com.bar.*",
6998 expectedError: `Consider .* "com.foo\.\*"`,
6999 },
7000 {
7001 name: "short prefix",
7002 apexAvailable: "com.*",
7003 expectedError: "requires two or more components",
7004 },
7005 {
7006 name: "wildcard not in the end",
7007 apexAvailable: "com.*.foo",
7008 expectedError: "should end with .*",
7009 },
7010 {
7011 name: "wildcard in the middle",
7012 apexAvailable: "com.foo*.*",
7013 expectedError: "not allowed in the middle",
7014 },
7015 {
7016 name: "hint with prefix pattern",
7017 apexAvailable: "//apex_available:platform",
7018 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7019 },
7020 } {
7021 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007022 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007023 errorHandler := android.FixtureExpectsNoErrors
7024 if tc.expectedError != "" {
7025 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7026 }
7027 context := android.GroupFixturePreparers(
7028 prepareForApexTest,
7029 android.FixtureMergeMockFs(android.MockFS{
7030 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7031 }),
7032 ).ExtendWithErrorHandler(errorHandler)
7033
7034 context.RunTestWithBp(t, `
7035 apex {
7036 name: "com.foo.bar",
7037 key: "myapex.key",
7038 native_shared_libs: ["libfoo"],
7039 updatable: false,
7040 }
7041
7042 apex_key {
7043 name: "myapex.key",
7044 public_key: "testkey.avbpubkey",
7045 private_key: "testkey.pem",
7046 }
7047
7048 cc_library {
7049 name: "libfoo",
7050 stl: "none",
7051 system_shared_libs: [],
7052 apex_available: ["`+tc.apexAvailable+`"],
7053 }`)
7054 })
7055 }
7056 testApexError(t, `Consider adding "com.foo" to`, `
7057 apex {
7058 name: "com.foo", // too short for a partner apex
7059 key: "myapex.key",
7060 native_shared_libs: ["libfoo"],
7061 updatable: false,
7062 }
7063
7064 apex_key {
7065 name: "myapex.key",
7066 public_key: "testkey.avbpubkey",
7067 private_key: "testkey.pem",
7068 }
7069
7070 cc_library {
7071 name: "libfoo",
7072 stl: "none",
7073 system_shared_libs: [],
7074 }
7075 `)
7076}
7077
Jiyong Park5d790c32019-11-15 18:40:32 +09007078func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007079 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007080 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007081 apex {
7082 name: "myapex",
7083 key: "myapex.key",
7084 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007085 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007086 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007087 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007088 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007089 }
7090
7091 override_apex {
7092 name: "override_myapex",
7093 base: "myapex",
7094 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007095 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007096 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007097 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007098 compile_multilib: "first",
7099 multilib: {
7100 lib32: {
7101 native_shared_libs: ["mylib32"],
7102 },
7103 lib64: {
7104 native_shared_libs: ["mylib64"],
7105 },
7106 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007107 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007108 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007109 key: "mynewapex.key",
7110 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007111 }
7112
7113 apex_key {
7114 name: "myapex.key",
7115 public_key: "testkey.avbpubkey",
7116 private_key: "testkey.pem",
7117 }
7118
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007119 apex_key {
7120 name: "mynewapex.key",
7121 public_key: "testkey2.avbpubkey",
7122 private_key: "testkey2.pem",
7123 }
7124
7125 android_app_certificate {
7126 name: "myapex.certificate",
7127 certificate: "testkey",
7128 }
7129
Jiyong Park5d790c32019-11-15 18:40:32 +09007130 android_app {
7131 name: "app",
7132 srcs: ["foo/bar/MyClass.java"],
7133 package_name: "foo",
7134 sdk_version: "none",
7135 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007136 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007137 }
7138
7139 override_android_app {
7140 name: "override_app",
7141 base: "app",
7142 package_name: "bar",
7143 }
markchien7c803b82021-08-26 22:10:06 +08007144
7145 bpf {
7146 name: "bpf",
7147 srcs: ["bpf.c"],
7148 }
7149
7150 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007151 name: "overrideBpf",
7152 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007153 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007154
7155 prebuilt_etc {
7156 name: "myetc",
7157 src: "myprebuilt",
7158 }
7159
7160 prebuilt_etc {
7161 name: "override_myetc",
7162 src: "override_myprebuilt",
7163 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007164
7165 cc_library {
7166 name: "mylib32",
7167 apex_available: [ "myapex" ],
7168 }
7169
7170 cc_library {
7171 name: "mylib64",
7172 apex_available: [ "myapex" ],
7173 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007174 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007175
Jooyung Hana0503a52023-08-23 13:12:50 +09007176 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007177 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007178 if originalVariant.GetOverriddenBy() != "" {
7179 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7180 }
7181 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7182 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7183 }
7184
Spandan Das50801e22024-05-13 18:29:45 +00007185 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007186 apexRule := module.Rule("apexRule")
7187 copyCmds := apexRule.Args["copy_commands"]
7188
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007189 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7190 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007191
markchien7c803b82021-08-26 22:10:06 +08007192 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007193 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007194
Daniel Norman5a3ce132021-08-26 15:44:43 -07007195 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7196 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7197
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007198 apexBundle := module.Module().(*apexBundle)
7199 name := apexBundle.Name()
7200 if name != "override_myapex" {
7201 t.Errorf("name should be \"override_myapex\", but was %q", name)
7202 }
7203
Baligh Uddin004d7172020-02-19 21:29:28 -08007204 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7205 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7206 }
7207
Jiyong Park20bacab2020-03-03 11:45:41 +09007208 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007209 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007210 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7211
7212 signApkRule := module.Rule("signapk")
7213 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007214
Colin Crossaa255532020-07-03 13:18:24 -07007215 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007216 var builder strings.Builder
7217 data.Custom(&builder, name, "TARGET_", "", data)
7218 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007219 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7220 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007221 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007222 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007223 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007224 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007225 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007226 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007227}
7228
Albert Martineefabcf2022-03-21 20:11:16 +00007229func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007230 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007231 // Override from 29 to 31
7232 minSdkOverride31 := "31"
7233 ctx := testApex(t, `
7234 apex {
7235 name: "myapex",
7236 key: "myapex.key",
7237 native_shared_libs: ["mylib"],
7238 updatable: true,
7239 min_sdk_version: "29"
7240 }
7241
7242 override_apex {
7243 name: "override_myapex",
7244 base: "myapex",
7245 logging_parent: "com.foo.bar",
7246 package_name: "test.overridden.package"
7247 }
7248
7249 apex_key {
7250 name: "myapex.key",
7251 public_key: "testkey.avbpubkey",
7252 private_key: "testkey.pem",
7253 }
7254
7255 cc_library {
7256 name: "mylib",
7257 srcs: ["mylib.cpp"],
7258 runtime_libs: ["libbar"],
7259 system_shared_libs: [],
7260 stl: "none",
7261 apex_available: [ "myapex" ],
7262 min_sdk_version: "apex_inherit"
7263 }
7264
7265 cc_library {
7266 name: "libbar",
7267 srcs: ["mylib.cpp"],
7268 system_shared_libs: [],
7269 stl: "none",
7270 apex_available: [ "myapex" ],
7271 min_sdk_version: "apex_inherit"
7272 }
7273
7274 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7275
Jooyung Hana0503a52023-08-23 13:12:50 +09007276 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007277 copyCmds := apexRule.Args["copy_commands"]
7278
7279 // Ensure that direct non-stubs dep is always included
7280 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7281
7282 // Ensure that runtime_libs dep in included
7283 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7284
7285 // Ensure libraries target overridden min_sdk_version value
7286 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7287}
7288
7289func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007290 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007291 // Attempt to override from 31 to 29, should be a NOOP
7292 minSdkOverride29 := "29"
7293 ctx := testApex(t, `
7294 apex {
7295 name: "myapex",
7296 key: "myapex.key",
7297 native_shared_libs: ["mylib"],
7298 updatable: true,
7299 min_sdk_version: "31"
7300 }
7301
7302 override_apex {
7303 name: "override_myapex",
7304 base: "myapex",
7305 logging_parent: "com.foo.bar",
7306 package_name: "test.overridden.package"
7307 }
7308
7309 apex_key {
7310 name: "myapex.key",
7311 public_key: "testkey.avbpubkey",
7312 private_key: "testkey.pem",
7313 }
7314
7315 cc_library {
7316 name: "mylib",
7317 srcs: ["mylib.cpp"],
7318 runtime_libs: ["libbar"],
7319 system_shared_libs: [],
7320 stl: "none",
7321 apex_available: [ "myapex" ],
7322 min_sdk_version: "apex_inherit"
7323 }
7324
7325 cc_library {
7326 name: "libbar",
7327 srcs: ["mylib.cpp"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 min_sdk_version: "apex_inherit"
7332 }
7333
7334 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7335
Jooyung Hana0503a52023-08-23 13:12:50 +09007336 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007337 copyCmds := apexRule.Args["copy_commands"]
7338
7339 // Ensure that direct non-stubs dep is always included
7340 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7341
7342 // Ensure that runtime_libs dep in included
7343 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7344
7345 // Ensure libraries target the original min_sdk_version value rather than the overridden
7346 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7347}
7348
Jooyung Han214bf372019-11-12 13:03:50 +09007349func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007350 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007351 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007352 apex {
7353 name: "myapex",
7354 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007355 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007356 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007357 }
7358
7359 apex_key {
7360 name: "myapex.key",
7361 public_key: "testkey.avbpubkey",
7362 private_key: "testkey.pem",
7363 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007364
7365 cc_library {
7366 name: "mylib",
7367 srcs: ["mylib.cpp"],
7368 stl: "libc++",
7369 system_shared_libs: [],
7370 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007371 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007372 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007373 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007374
Jooyung Hana0503a52023-08-23 13:12:50 +09007375 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007376 args := module.Rule("apexRule").Args
7377 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007378 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007379
7380 // The copies of the libraries in the apex should have one more dependency than
7381 // the ones outside the apex, namely the unwinder. Ideally we should check
7382 // the dependency names directly here but for some reason the names are blank in
7383 // this test.
7384 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007385 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007386 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7387 if len(apexImplicits) != len(nonApexImplicits)+1 {
7388 t.Errorf("%q missing unwinder dep", lib)
7389 }
7390 }
Jooyung Han214bf372019-11-12 13:03:50 +09007391}
7392
Paul Duffine05480a2021-03-08 15:07:14 +00007393var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007394 "api/current.txt": nil,
7395 "api/removed.txt": nil,
7396 "api/system-current.txt": nil,
7397 "api/system-removed.txt": nil,
7398 "api/test-current.txt": nil,
7399 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007400
Anton Hanssondff2c782020-12-21 17:10:01 +00007401 "100/public/api/foo.txt": nil,
7402 "100/public/api/foo-removed.txt": nil,
7403 "100/system/api/foo.txt": nil,
7404 "100/system/api/foo-removed.txt": nil,
7405
Paul Duffineedc5d52020-06-12 17:46:39 +01007406 // For java_sdk_library_import
7407 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007408}
7409
Jooyung Han58f26ab2019-12-18 15:34:32 +09007410func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007411 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007412 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007413 apex {
7414 name: "myapex",
7415 key: "myapex.key",
7416 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007417 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007418 }
7419
7420 apex_key {
7421 name: "myapex.key",
7422 public_key: "testkey.avbpubkey",
7423 private_key: "testkey.pem",
7424 }
7425
7426 java_sdk_library {
7427 name: "foo",
7428 srcs: ["a.java"],
7429 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007430 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007431 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007432
7433 prebuilt_apis {
7434 name: "sdk",
7435 api_dirs: ["100"],
7436 }
Paul Duffin9b879592020-05-26 13:21:35 +01007437 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007438
7439 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007440 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007441 "javalib/foo.jar",
7442 "etc/permissions/foo.xml",
7443 })
7444 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007445 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7446 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7447 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007448}
7449
Spandan Das3ee19692024-06-19 04:47:40 +00007450func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007451 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007452 ctx := testApex(t, `
7453 override_apex {
7454 name: "mycompanyapex",
7455 base: "myapex",
7456 }
7457 apex {
7458 name: "myapex",
7459 key: "myapex.key",
7460 java_libs: ["foo"],
7461 updatable: false,
7462 }
7463
7464 apex_key {
7465 name: "myapex.key",
7466 public_key: "testkey.avbpubkey",
7467 private_key: "testkey.pem",
7468 }
7469
7470 java_sdk_library {
7471 name: "foo",
7472 srcs: ["a.java"],
7473 api_packages: ["foo"],
7474 apex_available: [ "myapex" ],
7475 }
7476
7477 prebuilt_apis {
7478 name: "sdk",
7479 api_dirs: ["100"],
7480 }
7481 `, withFiles(filesForSdkLibrary))
7482
7483 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7484 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7485 // (com.android.foo), the filepath should not contain override apex name.
7486 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7487 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7488 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7489}
7490
Paul Duffin9b879592020-05-26 13:21:35 +01007491func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007492 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007493 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007494 apex {
7495 name: "myapex",
7496 key: "myapex.key",
7497 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007498 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007499 }
7500
7501 apex_key {
7502 name: "myapex.key",
7503 public_key: "testkey.avbpubkey",
7504 private_key: "testkey.pem",
7505 }
7506
7507 java_sdk_library {
7508 name: "foo",
7509 srcs: ["a.java"],
7510 api_packages: ["foo"],
7511 apex_available: ["myapex"],
7512 sdk_version: "none",
7513 system_modules: "none",
7514 }
7515
7516 java_library {
7517 name: "bar",
7518 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007519 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007520 apex_available: ["myapex"],
7521 sdk_version: "none",
7522 system_modules: "none",
7523 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007524
7525 prebuilt_apis {
7526 name: "sdk",
7527 api_dirs: ["100"],
7528 }
Paul Duffin9b879592020-05-26 13:21:35 +01007529 `, withFiles(filesForSdkLibrary))
7530
7531 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007532 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007533 "javalib/bar.jar",
7534 "javalib/foo.jar",
7535 "etc/permissions/foo.xml",
7536 })
7537
7538 // The bar library should depend on the implementation jar.
7539 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007540 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007541 t.Errorf("expected %q, found %#q", expected, actual)
7542 }
7543}
7544
7545func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007546 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007547 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007548 apex {
7549 name: "myapex",
7550 key: "myapex.key",
7551 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007552 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007553 }
7554
7555 apex_key {
7556 name: "myapex.key",
7557 public_key: "testkey.avbpubkey",
7558 private_key: "testkey.pem",
7559 }
7560
7561 java_sdk_library {
7562 name: "foo",
7563 srcs: ["a.java"],
7564 api_packages: ["foo"],
7565 apex_available: ["myapex"],
7566 sdk_version: "none",
7567 system_modules: "none",
7568 }
7569
7570 java_library {
7571 name: "bar",
7572 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007573 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007574 sdk_version: "none",
7575 system_modules: "none",
7576 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007577
7578 prebuilt_apis {
7579 name: "sdk",
7580 api_dirs: ["100"],
7581 }
Paul Duffin9b879592020-05-26 13:21:35 +01007582 `, withFiles(filesForSdkLibrary))
7583
7584 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007585 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007586 "javalib/foo.jar",
7587 "etc/permissions/foo.xml",
7588 })
7589
7590 // The bar library should depend on the stubs jar.
7591 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007592 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007593 t.Errorf("expected %q, found %#q", expected, actual)
7594 }
7595}
7596
Paul Duffineedc5d52020-06-12 17:46:39 +01007597func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007598 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007599 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007600 prebuilt_apis {
7601 name: "sdk",
7602 api_dirs: ["100"],
7603 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007604 withFiles(map[string][]byte{
7605 "apex/a.java": nil,
7606 "apex/apex_manifest.json": nil,
7607 "apex/Android.bp": []byte(`
7608 package {
7609 default_visibility: ["//visibility:private"],
7610 }
7611
7612 apex {
7613 name: "myapex",
7614 key: "myapex.key",
7615 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007616 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007617 }
7618
7619 apex_key {
7620 name: "myapex.key",
7621 public_key: "testkey.avbpubkey",
7622 private_key: "testkey.pem",
7623 }
7624
7625 java_library {
7626 name: "bar",
7627 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007628 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007629 apex_available: ["myapex"],
7630 sdk_version: "none",
7631 system_modules: "none",
7632 }
7633`),
7634 "source/a.java": nil,
7635 "source/api/current.txt": nil,
7636 "source/api/removed.txt": nil,
7637 "source/Android.bp": []byte(`
7638 package {
7639 default_visibility: ["//visibility:private"],
7640 }
7641
7642 java_sdk_library {
7643 name: "foo",
7644 visibility: ["//apex"],
7645 srcs: ["a.java"],
7646 api_packages: ["foo"],
7647 apex_available: ["myapex"],
7648 sdk_version: "none",
7649 system_modules: "none",
7650 public: {
7651 enabled: true,
7652 },
7653 }
7654`),
7655 "prebuilt/a.jar": nil,
7656 "prebuilt/Android.bp": []byte(`
7657 package {
7658 default_visibility: ["//visibility:private"],
7659 }
7660
7661 java_sdk_library_import {
7662 name: "foo",
7663 visibility: ["//apex", "//source"],
7664 apex_available: ["myapex"],
7665 prefer: true,
7666 public: {
7667 jars: ["a.jar"],
7668 },
7669 }
7670`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007671 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007672 )
7673
7674 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007675 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007676 "javalib/bar.jar",
7677 "javalib/foo.jar",
7678 "etc/permissions/foo.xml",
7679 })
7680
7681 // The bar library should depend on the implementation jar.
7682 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007683 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007684 t.Errorf("expected %q, found %#q", expected, actual)
7685 }
7686}
7687
7688func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007689 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007690 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7691 apex {
7692 name: "myapex",
7693 key: "myapex.key",
7694 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007695 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007696 }
7697
7698 apex_key {
7699 name: "myapex.key",
7700 public_key: "testkey.avbpubkey",
7701 private_key: "testkey.pem",
7702 }
7703
7704 java_sdk_library_import {
7705 name: "foo",
7706 apex_available: ["myapex"],
7707 prefer: true,
7708 public: {
7709 jars: ["a.jar"],
7710 },
7711 }
7712
7713 `, withFiles(filesForSdkLibrary))
7714}
7715
atrost6e126252020-01-27 17:01:16 +00007716func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007717 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007718 result := android.GroupFixturePreparers(
7719 prepareForApexTest,
7720 java.PrepareForTestWithPlatformCompatConfig,
7721 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007722 apex {
7723 name: "myapex",
7724 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007725 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007726 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007727 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007728 }
7729
7730 apex_key {
7731 name: "myapex.key",
7732 public_key: "testkey.avbpubkey",
7733 private_key: "testkey.pem",
7734 }
7735
7736 platform_compat_config {
7737 name: "myjar-platform-compat-config",
7738 src: ":myjar",
7739 }
7740
7741 java_library {
7742 name: "myjar",
7743 srcs: ["foo/bar/MyClass.java"],
7744 sdk_version: "none",
7745 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007746 apex_available: [ "myapex" ],
7747 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007748
7749 // Make sure that a preferred prebuilt does not affect the apex contents.
7750 prebuilt_platform_compat_config {
7751 name: "myjar-platform-compat-config",
7752 metadata: "compat-config/metadata.xml",
7753 prefer: true,
7754 }
atrost6e126252020-01-27 17:01:16 +00007755 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007756 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007757 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007758 "etc/compatconfig/myjar-platform-compat-config.xml",
7759 "javalib/myjar.jar",
7760 })
7761}
7762
Jooyung Han862c0d62022-12-21 10:15:37 +09007763func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007764 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007765 android.GroupFixturePreparers(
7766 android.PrepareForTestWithAndroidBuildComponents,
7767 PrepareForTestWithApexBuildComponents,
7768 prepareForTestWithMyapex,
7769 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7770 ).
7771 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7772 RunTestWithBp(t, `
7773 apex {
7774 name: "myapex",
7775 key: "myapex.key",
7776 prebuilts: ["foo", "bar"],
7777 updatable: false,
7778 }
7779
7780 apex_key {
7781 name: "myapex.key",
7782 public_key: "testkey.avbpubkey",
7783 private_key: "testkey.pem",
7784 }
7785
7786 prebuilt_etc {
7787 name: "foo",
7788 src: "myprebuilt",
7789 filename_from_src: true,
7790 }
7791
7792 prebuilt_etc {
7793 name: "bar",
7794 src: "myprebuilt",
7795 filename_from_src: true,
7796 }
7797 `)
7798}
7799
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007800func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007801 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007802 bp := `
7803 apex {
7804 name: "myapex",
7805 key: "myapex.key",
7806 native_shared_libs: ["libfoo"],
7807 updatable: false,
7808 unwanted_transitive_deps: ["libbar"],
7809 }
7810
7811 apex_key {
7812 name: "myapex.key",
7813 public_key: "testkey.avbpubkey",
7814 private_key: "testkey.pem",
7815 }
7816
7817 cc_library {
7818 name: "libfoo",
7819 srcs: ["foo.cpp"],
7820 shared_libs: ["libbar"],
7821 apex_available: ["myapex"],
7822 }
7823
7824 cc_library {
7825 name: "libbar",
7826 srcs: ["bar.cpp"],
7827 apex_available: ["myapex"],
7828 }`
7829 ctx := testApex(t, bp)
7830 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7831 "*/libc++.so",
7832 "*/libfoo.so",
7833 // not libbar.so
7834 })
7835}
7836
Jiyong Park479321d2019-12-16 11:47:12 +09007837func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007838 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007839 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7840 apex {
7841 name: "myapex",
7842 key: "myapex.key",
7843 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007844 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007845 }
7846
7847 apex_key {
7848 name: "myapex.key",
7849 public_key: "testkey.avbpubkey",
7850 private_key: "testkey.pem",
7851 }
7852
7853 java_library {
7854 name: "myjar",
7855 srcs: ["foo/bar/MyClass.java"],
7856 sdk_version: "none",
7857 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007858 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007859 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007860 }
7861 `)
7862}
7863
Jiyong Park7afd1072019-12-30 16:56:33 +09007864func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007865 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007866 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007867 apex {
7868 name: "myapex",
7869 key: "myapex.key",
7870 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007871 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007872 }
7873
7874 apex_key {
7875 name: "myapex.key",
7876 public_key: "testkey.avbpubkey",
7877 private_key: "testkey.pem",
7878 }
7879
7880 cc_library {
7881 name: "mylib",
7882 srcs: ["mylib.cpp"],
7883 system_shared_libs: [],
7884 stl: "none",
7885 required: ["a", "b"],
7886 host_required: ["c", "d"],
7887 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007888 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007889 }
7890 `)
7891
Jooyung Hana0503a52023-08-23 13:12:50 +09007892 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007893 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007894 name := apexBundle.BaseModuleName()
7895 prefix := "TARGET_"
7896 var builder strings.Builder
7897 data.Custom(&builder, name, prefix, "", data)
7898 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007899 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007900 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7901 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007902}
7903
Jiyong Park7cd10e32020-01-14 09:22:18 +09007904func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007905 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007906 bp := `
7907 apex {
7908 name: "myapex",
7909 key: "myapex.key",
7910 native_shared_libs: ["mylib"],
7911 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007912 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007913 }
7914
Jiyong Park9d677202020-02-19 16:29:35 +09007915 apex {
7916 name: "myapex.updatable",
7917 key: "myapex.key",
7918 native_shared_libs: ["mylib"],
7919 java_libs: ["myjar"],
7920 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007921 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007922 }
7923
Jiyong Park7cd10e32020-01-14 09:22:18 +09007924 apex_key {
7925 name: "myapex.key",
7926 public_key: "testkey.avbpubkey",
7927 private_key: "testkey.pem",
7928 }
7929
7930 cc_library {
7931 name: "mylib",
7932 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007933 shared_libs: [
7934 "myotherlib",
7935 "myotherlib_ext",
7936 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007937 system_shared_libs: [],
7938 stl: "none",
7939 apex_available: [
7940 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007941 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007942 "//apex_available:platform",
7943 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007944 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007945 }
7946
7947 cc_library {
7948 name: "myotherlib",
7949 srcs: ["mylib.cpp"],
7950 system_shared_libs: [],
7951 stl: "none",
7952 apex_available: [
7953 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007954 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007955 "//apex_available:platform",
7956 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007957 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007958 }
7959
Jiyong Parkce243632023-02-17 18:22:25 +09007960 cc_library {
7961 name: "myotherlib_ext",
7962 srcs: ["mylib.cpp"],
7963 system_shared_libs: [],
7964 system_ext_specific: true,
7965 stl: "none",
7966 apex_available: [
7967 "myapex",
7968 "myapex.updatable",
7969 "//apex_available:platform",
7970 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007971 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007972 }
7973
Jiyong Park7cd10e32020-01-14 09:22:18 +09007974 java_library {
7975 name: "myjar",
7976 srcs: ["foo/bar/MyClass.java"],
7977 sdk_version: "none",
7978 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007979 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007980 apex_available: [
7981 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007982 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007983 "//apex_available:platform",
7984 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007985 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007986 }
7987
7988 java_library {
7989 name: "myotherjar",
7990 srcs: ["foo/bar/MyClass.java"],
7991 sdk_version: "none",
7992 system_modules: "none",
7993 apex_available: [
7994 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007995 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007996 "//apex_available:platform",
7997 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007998 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007999 }
8000 `
8001
8002 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8003 for _, f := range files {
8004 if f.path == file {
8005 if f.isLink {
8006 t.Errorf("%q is not a real file", file)
8007 }
8008 return
8009 }
8010 }
8011 t.Errorf("%q is not found", file)
8012 }
8013
Jiyong Parkce243632023-02-17 18:22:25 +09008014 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008015 for _, f := range files {
8016 if f.path == file {
8017 if !f.isLink {
8018 t.Errorf("%q is not a symlink", file)
8019 }
Jiyong Parkce243632023-02-17 18:22:25 +09008020 if f.src != target {
8021 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8022 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008023 return
8024 }
8025 }
8026 t.Errorf("%q is not found", file)
8027 }
8028
Jiyong Park9d677202020-02-19 16:29:35 +09008029 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8030 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008031 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008032 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008033 ensureRealfileExists(t, files, "javalib/myjar.jar")
8034 ensureRealfileExists(t, files, "lib64/mylib.so")
8035 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008036 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008037
Jooyung Hana0503a52023-08-23 13:12:50 +09008038 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008039 ensureRealfileExists(t, files, "javalib/myjar.jar")
8040 ensureRealfileExists(t, files, "lib64/mylib.so")
8041 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008042 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008043
8044 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008045 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008046 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008047 ensureRealfileExists(t, files, "javalib/myjar.jar")
8048 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008049 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8050 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008051
Jooyung Hana0503a52023-08-23 13:12:50 +09008052 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008053 ensureRealfileExists(t, files, "javalib/myjar.jar")
8054 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008055 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8056 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008057}
8058
Yo Chiange8128052020-07-23 20:09:18 +08008059func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008060 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008061 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008062 apex {
8063 name: "myapex",
8064 key: "myapex.key",
8065 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008066 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008067 }
8068
8069 apex_key {
8070 name: "myapex.key",
8071 public_key: "testkey.avbpubkey",
8072 private_key: "testkey.pem",
8073 }
8074
8075 cc_library_shared {
8076 name: "mylib",
8077 srcs: ["mylib.cpp"],
8078 shared_libs: ["myotherlib"],
8079 system_shared_libs: [],
8080 stl: "none",
8081 apex_available: [
8082 "myapex",
8083 "//apex_available:platform",
8084 ],
8085 }
8086
8087 cc_prebuilt_library_shared {
8088 name: "myotherlib",
8089 srcs: ["prebuilt.so"],
8090 system_shared_libs: [],
8091 stl: "none",
8092 apex_available: [
8093 "myapex",
8094 "//apex_available:platform",
8095 ],
8096 }
8097 `)
8098
Jooyung Hana0503a52023-08-23 13:12:50 +09008099 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008100 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008101 var builder strings.Builder
8102 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8103 androidMk := builder.String()
8104 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008105 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008106 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8107 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8108 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008109 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008110}
8111
Jooyung Han643adc42020-02-27 13:50:06 +09008112func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008113 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008114 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008118 binaries: ["mybin"],
8119 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008120 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008121 }
8122
8123 apex_key {
8124 name: "myapex.key",
8125 public_key: "testkey.avbpubkey",
8126 private_key: "testkey.pem",
8127 }
8128
8129 cc_library {
8130 name: "mylib",
8131 srcs: ["mylib.cpp"],
8132 shared_libs: ["mylib2"],
8133 system_shared_libs: [],
8134 stl: "none",
8135 apex_available: [ "myapex" ],
8136 }
8137
8138 cc_library {
8139 name: "mylib2",
8140 srcs: ["mylib.cpp"],
8141 system_shared_libs: [],
8142 stl: "none",
8143 apex_available: [ "myapex" ],
8144 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008145
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008146 // Used as both a JNI library and a regular shared library.
8147 cc_library {
8148 name: "mylib3",
8149 srcs: ["mylib.cpp"],
8150 system_shared_libs: [],
8151 stl: "none",
8152 apex_available: [ "myapex" ],
8153 }
8154
8155 cc_binary {
8156 name: "mybin",
8157 srcs: ["mybin.cpp"],
8158 shared_libs: ["mylib3"],
8159 system_shared_libs: [],
8160 stl: "none",
8161 apex_available: [ "myapex" ],
8162 }
8163
Jiyong Park34d5c332022-02-24 18:02:44 +09008164 rust_ffi_shared {
8165 name: "libfoo.rust",
8166 crate_name: "foo",
8167 srcs: ["foo.rs"],
8168 shared_libs: ["libfoo.shared_from_rust"],
8169 prefer_rlib: true,
8170 apex_available: ["myapex"],
8171 }
8172
8173 cc_library_shared {
8174 name: "libfoo.shared_from_rust",
8175 srcs: ["mylib.cpp"],
8176 system_shared_libs: [],
8177 stl: "none",
8178 stubs: {
8179 versions: ["10", "11", "12"],
8180 },
8181 }
8182
Jooyung Han643adc42020-02-27 13:50:06 +09008183 `)
8184
Jooyung Hana0503a52023-08-23 13:12:50 +09008185 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008186 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008187 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008188 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008189 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008190 "lib64/mylib.so",
8191 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008192 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008193 "lib64/libfoo.rust.so",
8194 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8195 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008196 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008197
8198 // b/220397949
8199 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008200}
8201
Jooyung Han49f67012020-04-17 13:43:10 +09008202func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008203 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008204 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008205 apex {
8206 name: "myapex",
8207 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008208 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008209 }
8210 apex_key {
8211 name: "myapex.key",
8212 public_key: "testkey.avbpubkey",
8213 private_key: "testkey.pem",
8214 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008215 `,
8216 android.FixtureModifyConfig(func(config android.Config) {
8217 delete(config.Targets, android.Android)
8218 config.AndroidCommonTarget = android.Target{}
8219 }),
8220 )
Jooyung Han49f67012020-04-17 13:43:10 +09008221
8222 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8223 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8224 }
8225}
8226
Jiyong Parkbd159612020-02-28 15:22:21 +09008227func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008228 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008229 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008230 apex {
8231 name: "myapex",
8232 key: "myapex.key",
8233 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008234 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008235 }
8236
8237 apex_key {
8238 name: "myapex.key",
8239 public_key: "testkey.avbpubkey",
8240 private_key: "testkey.pem",
8241 }
8242
8243 android_app {
8244 name: "AppFoo",
8245 srcs: ["foo/bar/MyClass.java"],
8246 sdk_version: "none",
8247 system_modules: "none",
8248 apex_available: [ "myapex" ],
8249 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008250 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008251
Jooyung Hana0503a52023-08-23 13:12:50 +09008252 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008253 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008254
8255 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008256 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 +09008257}
8258
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008259func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008260 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008261 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008262 apex {
8263 name: "myapex",
8264 key: "myapex.key",
8265 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008266 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008267 }
8268
8269 apex_key {
8270 name: "myapex.key",
8271 public_key: "testkey.avbpubkey",
8272 private_key: "testkey.pem",
8273 }
8274
8275 android_app_set {
8276 name: "AppSet",
8277 set: "AppSet.apks",
8278 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008279 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008280 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008281 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008282 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8283 s := mod.Rule("apexRule").Args["copy_commands"]
8284 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008285 if len(copyCmds) != 4 {
8286 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008287 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008288 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8289 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008290 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8291 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008292
8293 // Ensure that canned_fs_config has an entry for the app set zip file
8294 generateFsRule := mod.Rule("generateFsConfig")
8295 cmd := generateFsRule.RuleParams.Command
8296 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008297}
8298
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008299func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008300 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008301 apex_set {
8302 name: "myapex",
8303 filename: "foo_v2.apex",
8304 sanitized: {
8305 none: { set: "myapex.apks", },
8306 hwaddress: { set: "myapex.hwasan.apks", },
8307 },
Paul Duffin24704672021-04-06 16:09:30 +01008308 }
8309 `
8310 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008311
Paul Duffin24704672021-04-06 16:09:30 +01008312 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008313 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008314
Spandan Das9d6e2092024-09-21 02:50:00 +00008315 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008316 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008317
Paul Duffin24704672021-04-06 16:09:30 +01008318 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8319
8320 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008321 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8322 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008323
8324 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008325}
8326
Pranav Guptaeba03b02022-09-27 00:27:08 +00008327func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008328 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008329 ctx := testApex(t, `
8330 apex_set {
8331 name: "myapex",
8332 set: ":myapex_apks_file",
8333 }
8334
8335 filegroup {
8336 name: "myapex_apks_file",
8337 srcs: ["myapex.apks"],
8338 }
8339 `)
8340
Spandan Das9d6e2092024-09-21 02:50:00 +00008341 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008342
8343 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008344 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008345 extractedApex := m.Output(extractorOutput)
8346
8347 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8348}
8349
Paul Duffin89f570a2021-06-16 01:42:33 +01008350func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008351 t.Helper()
8352
Paul Duffin55607122021-03-30 23:32:51 +01008353 fs := android.MockFS{
8354 "a.java": nil,
8355 "a.jar": nil,
8356 "apex_manifest.json": nil,
8357 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008358 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008359 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8360 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8361 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008362 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008363 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008364
Paul Duffin55607122021-03-30 23:32:51 +01008365 errorHandler := android.FixtureExpectsNoErrors
8366 if errmsg != "" {
8367 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008368 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008369
Paul Duffin55607122021-03-30 23:32:51 +01008370 result := android.GroupFixturePreparers(
8371 cc.PrepareForTestWithCcDefaultModules,
8372 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008373 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008374 java.PrepareForTestWithJavaSdkLibraryFiles,
8375 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008376 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008377 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008378 android.FixtureModifyMockFS(func(fs android.MockFS) {
8379 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8380 insert := ""
8381 for _, fragment := range fragments {
8382 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8383 }
8384 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8385 platform_bootclasspath {
8386 name: "platform-bootclasspath",
8387 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008388 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008389 %s
8390 ],
8391 }
8392 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008393 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008394 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008395 // Dexpreopt for boot jars requires the ART boot image profile.
8396 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8397 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008398 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008399 ).
8400 ExtendWithErrorHandler(errorHandler).
8401 RunTestWithBp(t, bp)
8402
8403 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008404}
8405
Jooyung Han548640b2020-04-27 12:10:30 +09008406func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008407 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008408 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8409 apex {
8410 name: "myapex",
8411 key: "myapex.key",
8412 updatable: true,
8413 }
8414
8415 apex_key {
8416 name: "myapex.key",
8417 public_key: "testkey.avbpubkey",
8418 private_key: "testkey.pem",
8419 }
8420 `)
8421}
8422
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008423func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008424 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008425 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8426 apex {
8427 name: "myapex",
8428 key: "myapex.key",
8429 }
8430
8431 apex_key {
8432 name: "myapex.key",
8433 public_key: "testkey.avbpubkey",
8434 private_key: "testkey.pem",
8435 }
8436 `)
8437}
8438
satayevb98371c2021-06-15 16:49:50 +01008439func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008440 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008441 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8442 apex {
8443 name: "myapex",
8444 key: "myapex.key",
8445 systemserverclasspath_fragments: [
8446 "mysystemserverclasspathfragment",
8447 ],
8448 min_sdk_version: "29",
8449 updatable: true,
8450 }
8451
8452 apex_key {
8453 name: "myapex.key",
8454 public_key: "testkey.avbpubkey",
8455 private_key: "testkey.pem",
8456 }
8457
8458 java_library {
8459 name: "foo",
8460 srcs: ["b.java"],
8461 min_sdk_version: "29",
8462 installable: true,
8463 apex_available: [
8464 "myapex",
8465 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008466 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008467 }
8468
8469 systemserverclasspath_fragment {
8470 name: "mysystemserverclasspathfragment",
8471 generate_classpaths_proto: false,
8472 contents: [
8473 "foo",
8474 ],
8475 apex_available: [
8476 "myapex",
8477 ],
8478 }
satayevabcd5972021-08-06 17:49:46 +01008479 `,
8480 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8481 )
satayevb98371c2021-06-15 16:49:50 +01008482}
8483
Paul Duffin064b70c2020-11-02 17:32:38 +00008484func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008485 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008486 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008487 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008488 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008489 fragment := java.ApexVariantReference{
8490 Apex: proptools.StringPtr("myapex"),
8491 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8492 }
8493
Paul Duffin064b70c2020-11-02 17:32:38 +00008494 testDexpreoptWithApexes(t, `
8495 prebuilt_apex {
8496 name: "myapex" ,
8497 arch: {
8498 arm64: {
8499 src: "myapex-arm64.apex",
8500 },
8501 arm: {
8502 src: "myapex-arm.apex",
8503 },
8504 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008505 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8506 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008507
Paul Duffin89f570a2021-06-16 01:42:33 +01008508 prebuilt_bootclasspath_fragment {
8509 name: "my-bootclasspath-fragment",
8510 contents: ["libfoo"],
8511 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008512 hidden_api: {
8513 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8514 metadata: "my-bootclasspath-fragment/metadata.csv",
8515 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008516 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8517 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8518 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008519 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008520 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008521
Spandan Das52c01a12024-09-20 01:09:48 +00008522 java_sdk_library_import {
8523 name: "libfoo",
8524 prefer: true,
8525 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008526 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008527 },
8528 apex_available: ["myapex"],
8529 shared_library: false,
8530 permitted_packages: ["libfoo"],
8531 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008532 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008533 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008534}
8535
Spandan Dasf14e2542021-11-12 00:01:37 +00008536func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008537 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008538 bp += `
8539 apex_key {
8540 name: "myapex.key",
8541 public_key: "testkey.avbpubkey",
8542 private_key: "testkey.pem",
8543 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008544 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008545 "lib1/src/A.java": nil,
8546 "lib2/src/B.java": nil,
8547 "system/sepolicy/apex/myapex-file_contexts": nil,
8548 }
8549
Paul Duffin45338f02021-03-30 23:07:52 +01008550 errorHandler := android.FixtureExpectsNoErrors
8551 if errmsg != "" {
8552 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008553 }
Colin Crossae8600b2020-10-29 17:09:13 -07008554
Paul Duffin45338f02021-03-30 23:07:52 +01008555 android.GroupFixturePreparers(
8556 android.PrepareForTestWithAndroidBuildComponents,
8557 java.PrepareForTestWithJavaBuildComponents,
8558 PrepareForTestWithApexBuildComponents,
8559 android.PrepareForTestWithNeverallowRules(rules),
8560 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008561 apexBootJars := make([]string, 0, len(bootJars))
8562 for _, apexBootJar := range bootJars {
8563 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008564 }
satayevd604b212021-07-21 14:23:52 +01008565 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008566 }),
8567 fs.AddToFixture(),
8568 ).
8569 ExtendWithErrorHandler(errorHandler).
8570 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008571}
8572
8573func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008574 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008575 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008576 name string
8577 expectedError string
8578 bp string
8579 bootJars []string
8580 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008581 }{
8582
8583 {
8584 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8585 expectedError: "",
8586 bp: `
8587 java_library {
8588 name: "bcp_lib1",
8589 srcs: ["lib1/src/*.java"],
8590 permitted_packages: ["foo.bar"],
8591 apex_available: ["myapex"],
8592 sdk_version: "none",
8593 system_modules: "none",
8594 }
8595 java_library {
8596 name: "nonbcp_lib2",
8597 srcs: ["lib2/src/*.java"],
8598 apex_available: ["myapex"],
8599 permitted_packages: ["a.b"],
8600 sdk_version: "none",
8601 system_modules: "none",
8602 }
8603 apex {
8604 name: "myapex",
8605 key: "myapex.key",
8606 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008607 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008608 }`,
8609 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008610 bcpPermittedPackages: map[string][]string{
8611 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008612 "foo.bar",
8613 },
8614 },
8615 },
8616 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008617 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008618 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 +01008619 bp: `
8620 java_library {
8621 name: "bcp_lib1",
8622 srcs: ["lib1/src/*.java"],
8623 apex_available: ["myapex"],
8624 permitted_packages: ["foo.bar"],
8625 sdk_version: "none",
8626 system_modules: "none",
8627 }
8628 java_library {
8629 name: "bcp_lib2",
8630 srcs: ["lib2/src/*.java"],
8631 apex_available: ["myapex"],
8632 permitted_packages: ["foo.bar", "bar.baz"],
8633 sdk_version: "none",
8634 system_modules: "none",
8635 }
8636 apex {
8637 name: "myapex",
8638 key: "myapex.key",
8639 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008640 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008641 }
8642 `,
8643 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008644 bcpPermittedPackages: map[string][]string{
8645 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008646 "foo.bar",
8647 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008648 "bcp_lib2": []string{
8649 "foo.bar",
8650 },
8651 },
8652 },
8653 {
8654 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8655 expectedError: "",
8656 bp: `
8657 java_library {
8658 name: "bcp_lib_restricted",
8659 srcs: ["lib1/src/*.java"],
8660 apex_available: ["myapex"],
8661 permitted_packages: ["foo.bar"],
8662 sdk_version: "none",
8663 min_sdk_version: "29",
8664 system_modules: "none",
8665 }
8666 java_library {
8667 name: "bcp_lib_unrestricted",
8668 srcs: ["lib2/src/*.java"],
8669 apex_available: ["myapex"],
8670 permitted_packages: ["foo.bar", "bar.baz"],
8671 sdk_version: "none",
8672 min_sdk_version: "29",
8673 system_modules: "none",
8674 }
8675 apex {
8676 name: "myapex",
8677 key: "myapex.key",
8678 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8679 updatable: true,
8680 min_sdk_version: "29",
8681 }
8682 `,
8683 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8684 bcpPermittedPackages: map[string][]string{
8685 "bcp_lib1_non_updateable": []string{
8686 "foo.bar",
8687 },
8688 // 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 +01008689 },
8690 },
8691 }
8692 for _, tc := range testcases {
8693 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008694 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008695 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8696 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008697 })
8698 }
8699}
8700
Jiyong Park62304bb2020-04-13 16:19:48 +09008701func TestTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008702 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008703 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008704 apex {
8705 name: "myapex",
8706 key: "myapex.key",
8707 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008708 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008709 }
8710
8711 apex_key {
8712 name: "myapex.key",
8713 public_key: "testkey.avbpubkey",
8714 private_key: "testkey.pem",
8715 }
8716
8717 cc_library {
8718 name: "mylib",
8719 srcs: ["mylib.cpp"],
8720 system_shared_libs: [],
8721 stl: "none",
8722 stubs: {
8723 versions: ["1"],
8724 },
8725 apex_available: ["myapex"],
8726 }
8727
8728 cc_library {
8729 name: "myprivlib",
8730 srcs: ["mylib.cpp"],
8731 system_shared_libs: [],
8732 stl: "none",
8733 apex_available: ["myapex"],
8734 }
8735
8736
8737 cc_test {
8738 name: "mytest",
8739 gtest: false,
8740 srcs: ["mylib.cpp"],
8741 system_shared_libs: [],
8742 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008743 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008744 test_for: ["myapex"]
8745 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008746
8747 cc_library {
8748 name: "mytestlib",
8749 srcs: ["mylib.cpp"],
8750 system_shared_libs: [],
8751 shared_libs: ["mylib", "myprivlib"],
8752 stl: "none",
8753 test_for: ["myapex"],
8754 }
8755
8756 cc_benchmark {
8757 name: "mybench",
8758 srcs: ["mylib.cpp"],
8759 system_shared_libs: [],
8760 shared_libs: ["mylib", "myprivlib"],
8761 stl: "none",
8762 test_for: ["myapex"],
8763 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008764 `)
8765
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008766 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008767 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008768 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8769 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8770 }
8771
8772 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008773 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008774 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8775 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8776 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8777}
Jiyong Park46a512f2020-12-04 18:02:13 +09008778
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008779func TestIndirectTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008780 t.Parallel()
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008781 ctx := testApex(t, `
8782 apex {
8783 name: "myapex",
8784 key: "myapex.key",
8785 native_shared_libs: ["mylib", "myprivlib"],
8786 updatable: false,
8787 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008788
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008789 apex_key {
8790 name: "myapex.key",
8791 public_key: "testkey.avbpubkey",
8792 private_key: "testkey.pem",
8793 }
8794
8795 cc_library {
8796 name: "mylib",
8797 srcs: ["mylib.cpp"],
8798 system_shared_libs: [],
8799 stl: "none",
8800 stubs: {
8801 versions: ["1"],
8802 },
8803 apex_available: ["myapex"],
8804 }
8805
8806 cc_library {
8807 name: "myprivlib",
8808 srcs: ["mylib.cpp"],
8809 system_shared_libs: [],
8810 stl: "none",
8811 shared_libs: ["mylib"],
8812 apex_available: ["myapex"],
8813 }
8814
8815 cc_library {
8816 name: "mytestlib",
8817 srcs: ["mylib.cpp"],
8818 system_shared_libs: [],
8819 shared_libs: ["myprivlib"],
8820 stl: "none",
8821 test_for: ["myapex"],
8822 }
8823 `)
8824
8825 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008826 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008827 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8828 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8829 }
8830
8831 // The platform variant of mytestlib links to the platform variant of the
8832 // internal myprivlib.
8833 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8834
8835 // The platform variant of myprivlib links to the platform variant of mylib
8836 // and bypasses its stubs.
8837 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 +09008838}
8839
Martin Stjernholmec009002021-03-27 15:18:31 +00008840func TestTestForForLibInOtherApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008841 t.Parallel()
Martin Stjernholmec009002021-03-27 15:18:31 +00008842 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8843 _ = testApex(t, `
8844 apex {
8845 name: "com.android.art",
8846 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008847 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008848 updatable: false,
8849 }
8850
8851 apex {
8852 name: "com.android.art.debug",
8853 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008854 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008855 updatable: false,
8856 }
8857
8858 apex_key {
8859 name: "myapex.key",
8860 public_key: "testkey.avbpubkey",
8861 private_key: "testkey.pem",
8862 }
8863
8864 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008865 name: "libnativebridge",
8866 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008867 system_shared_libs: [],
8868 stl: "none",
8869 stubs: {
8870 versions: ["1"],
8871 },
8872 apex_available: ["com.android.art", "com.android.art.debug"],
8873 }
8874
8875 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008876 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008877 srcs: ["mylib.cpp"],
8878 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008879 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008880 stl: "none",
8881 apex_available: ["com.android.art.debug"],
8882 test_for: ["com.android.art"],
8883 }
8884 `,
8885 android.MockFS{
8886 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8887 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8888 }.AddToFixture())
8889}
8890
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008891// TODO(jungjw): Move this to proptools
8892func intPtr(i int) *int {
8893 return &i
8894}
8895
8896func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008898 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008899 apex_set {
8900 name: "myapex",
8901 set: "myapex.apks",
8902 filename: "foo_v2.apex",
8903 overrides: ["foo"],
8904 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008905 `,
8906 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8907 variables.Platform_sdk_version = intPtr(30)
8908 }),
8909 android.FixtureModifyConfig(func(config android.Config) {
8910 config.Targets[android.Android] = []android.Target{
8911 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8912 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8913 }
8914 }),
8915 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008916
Spandan Das9d6e2092024-09-21 02:50:00 +00008917 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008918
8919 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008920 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008921 actual := extractedApex.Args["abis"]
8922 expected := "ARMEABI_V7A,ARM64_V8A"
8923 if actual != expected {
8924 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8925 }
8926 actual = extractedApex.Args["sdk-version"]
8927 expected = "30"
8928 if actual != expected {
8929 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8930 }
8931
Paul Duffin6717d882021-06-15 19:09:41 +01008932 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008933 a := m.Module().(*ApexSet)
8934 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008935 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008936 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8937 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8938 }
8939}
8940
Anton Hansson805e0a52022-11-25 14:06:46 +00008941func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008942 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008943 ctx := testApex(t, `
8944 apex_set {
8945 name: "myapex",
8946 set: "myapex.apks",
8947 filename: "foo_v2.apex",
8948 overrides: ["foo"],
8949 }
8950 `,
8951 android.FixtureModifyConfig(func(config android.Config) {
8952 config.Targets[android.Android] = []android.Target{
8953 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8954 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8955 }
8956 }),
8957 )
8958
Spandan Das9d6e2092024-09-21 02:50:00 +00008959 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008960
8961 // Check extract_apks tool parameters. No native bridge arch expected
8962 extractedApex := m.Output("extracted/myapex.apks")
8963 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8964}
8965
Jiyong Park7d95a512020-05-10 15:16:24 +09008966func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008967 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008968 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8969 apex {
8970 name: "myapex",
8971 key: "myapex.key",
8972 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008973 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008974 }
8975
8976 apex_key {
8977 name: "myapex.key",
8978 public_key: "testkey.avbpubkey",
8979 private_key: "testkey.pem",
8980 }
8981
8982 cc_library {
8983 name: "mylib",
8984 srcs: ["mylib.cpp"],
8985 static_libs: ["otherlib"],
8986 system_shared_libs: [],
8987 stl: "none",
8988 apex_available: [ "myapex" ],
8989 }
8990
8991 cc_library {
8992 name: "otherlib",
8993 srcs: ["mylib.cpp"],
8994 system_shared_libs: [],
8995 stl: "none",
8996 stubs: {
8997 versions: ["1", "2", "3"],
8998 },
8999 apex_available: [ "myapex" ],
9000 }
9001 `)
9002}
9003
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009004func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009005 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009006 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009007 apex {
9008 name: "myapex",
9009 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009010 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009011 custom_sign_tool: "sign_myapex",
9012 }
9013
9014 apex_key {
9015 name: "myapex.key",
9016 public_key: "testkey.avbpubkey",
9017 private_key: "testkey.pem",
9018 }
9019 `)
9020
Jooyung Han286957d2023-10-30 16:17:56 +09009021 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009022 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009023 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 +09009024}
9025
9026func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009027 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009028 ctx := testApex(t, `
9029 apex {
9030 name: "myapex",
9031 key: "myapex.key",
9032 updatable: false,
9033 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009034 }
9035
9036 apex_key {
9037 name: "myapex.key",
9038 public_key: "testkey.avbpubkey",
9039 private_key: "testkey.pem",
9040 }
9041
9042 prebuilt_apex {
9043 name: "myapex",
9044 prefer: true,
9045 arch: {
9046 arm64: {
9047 src: "myapex-arm64.apex",
9048 },
9049 arm: {
9050 src: "myapex-arm.apex",
9051 },
9052 },
9053 }
9054
9055 apex_set {
9056 name: "myapex_set",
9057 set: "myapex.apks",
9058 filename: "myapex_set.apex",
9059 overrides: ["myapex"],
9060 }
9061 `)
9062
Colin Crossf61d03d2023-11-02 16:56:39 -07009063 content := android.ContentFromFileRuleForTests(t, ctx,
9064 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009065 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 -07009066 content = android.ContentFromFileRuleForTests(t, ctx,
9067 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009068 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 +09009069}
9070
Jooyung Han938b5932020-06-20 12:47:47 +09009071func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009072 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009073 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009074 apex {
9075 name: "myapex",
9076 key: "myapex.key",
9077 apps: ["app"],
9078 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009079 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009080 }
9081
9082 apex_key {
9083 name: "myapex.key",
9084 public_key: "testkey.avbpubkey",
9085 private_key: "testkey.pem",
9086 }
9087
9088 android_app {
9089 name: "app",
9090 srcs: ["foo/bar/MyClass.java"],
9091 package_name: "foo",
9092 sdk_version: "none",
9093 system_modules: "none",
9094 apex_available: [ "myapex" ],
9095 }
9096 `, withFiles(map[string][]byte{
9097 "sub/Android.bp": []byte(`
9098 override_apex {
9099 name: "override_myapex",
9100 base: "myapex",
9101 apps: ["override_app"],
9102 allowed_files: ":allowed",
9103 }
9104 // Overridable "path" property should be referenced indirectly
9105 filegroup {
9106 name: "allowed",
9107 srcs: ["allowed.txt"],
9108 }
9109 override_android_app {
9110 name: "override_app",
9111 base: "app",
9112 package_name: "bar",
9113 }
9114 `),
9115 }))
9116
Jooyung Hana0503a52023-08-23 13:12:50 +09009117 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009118 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9119 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9120 }
9121
Spandan Das50801e22024-05-13 18:29:45 +00009122 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009123 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9124 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9125 }
9126}
9127
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009128func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009129 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009130 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009131 apex {
9132 name: "myapex",
9133 key: "myapex.key",
9134 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009135 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009136 }
9137
9138 apex_key {
9139 name: "myapex.key",
9140 public_key: "testkey.avbpubkey",
9141 private_key: "testkey.pem",
9142 }
9143
9144 cc_library {
9145 name: "mylib",
9146 srcs: ["mylib.cpp"],
9147 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009148 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009149 },
9150 apex_available: ["myapex"],
9151 }
9152
9153 cc_prebuilt_library_shared {
9154 name: "mylib",
9155 prefer: false,
9156 srcs: ["prebuilt.so"],
9157 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009158 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009159 },
9160 apex_available: ["myapex"],
9161 }
9162 `)
9163}
9164
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009165func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009166 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009167 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009168 apex {
9169 name: "myapex",
9170 key: "myapex.key",
9171 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009172 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009173 }
9174 apex_key {
9175 name: "myapex.key",
9176 public_key: "testkey.avbpubkey",
9177 private_key: "testkey.pem",
9178 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009179 `,
9180 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9181 variables.CompressedApex = proptools.BoolPtr(true)
9182 }),
9183 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009184
Jooyung Hana0503a52023-08-23 13:12:50 +09009185 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009186 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9187
Jooyung Hana0503a52023-08-23 13:12:50 +09009188 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009189 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9190
9191 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009192 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009193 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9194
9195 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009196 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009197 var builder strings.Builder
9198 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9199 androidMk := builder.String()
9200 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9201}
9202
Jooyung Han26ec8482024-07-31 15:04:05 +09009203func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009204 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009205 for _, compressionEnabled := range []bool{true, false} {
9206 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009207 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009208 ctx := testApex(t, `
9209 apex_set {
9210 name: "com.company.android.myapex",
9211 apex_name: "com.android.myapex",
9212 set: "company-myapex.apks",
9213 }
9214 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9215 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9216 }),
9217 )
9218
9219 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9220 if compressionEnabled {
9221 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9222 } else {
9223 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9224 }
9225 })
9226 }
9227}
9228
Martin Stjernholm2856c662020-12-02 15:03:42 +00009229func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009230 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009231 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009232 apex {
9233 name: "myapex",
9234 key: "myapex.key",
9235 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009236 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009237 }
9238
9239 apex_key {
9240 name: "myapex.key",
9241 public_key: "testkey.avbpubkey",
9242 private_key: "testkey.pem",
9243 }
9244
9245 cc_library {
9246 name: "mylib",
9247 srcs: ["mylib.cpp"],
9248 apex_available: ["myapex"],
9249 shared_libs: ["otherlib"],
9250 system_shared_libs: [],
9251 }
9252
9253 cc_library {
9254 name: "otherlib",
9255 srcs: ["mylib.cpp"],
9256 stubs: {
9257 versions: ["current"],
9258 },
9259 }
9260
9261 cc_prebuilt_library_shared {
9262 name: "otherlib",
9263 prefer: true,
9264 srcs: ["prebuilt.so"],
9265 stubs: {
9266 versions: ["current"],
9267 },
9268 }
9269 `)
9270
Jooyung Hana0503a52023-08-23 13:12:50 +09009271 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009272 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009273 var builder strings.Builder
9274 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9275 androidMk := builder.String()
9276
9277 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9278 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009279 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009280}
9281
Jiyong Parke3867542020-12-03 17:28:25 +09009282func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009283 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009284 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009285 apex {
9286 name: "myapex",
9287 key: "myapex.key",
9288 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009289 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009290 }
9291
9292 apex_key {
9293 name: "myapex.key",
9294 public_key: "testkey.avbpubkey",
9295 private_key: "testkey.pem",
9296 }
9297
9298 cc_library {
9299 name: "mylib",
9300 srcs: ["mylib.cpp"],
9301 system_shared_libs: [],
9302 stl: "none",
9303 apex_available: ["myapex"],
9304 shared_libs: ["mylib2"],
9305 target: {
9306 apex: {
9307 exclude_shared_libs: ["mylib2"],
9308 },
9309 },
9310 }
9311
9312 cc_library {
9313 name: "mylib2",
9314 srcs: ["mylib.cpp"],
9315 system_shared_libs: [],
9316 stl: "none",
9317 }
9318 `)
9319
9320 // Check if mylib is linked to mylib2 for the non-apex target
9321 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9322 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9323
9324 // Make sure that the link doesn't occur for the apex target
9325 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9326 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9327
9328 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009329 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009330 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9331}
9332
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009333func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009334 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009335 bpBase := `
9336 apex {
9337 name: "myapex",
9338 key: "myapex.key",
9339 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009340 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009341 }
9342 apex_key {
9343 name: "myapex.key",
9344 public_key: "testkey.avbpubkey",
9345 private_key: "testkey.pem",
9346 }
9347 cc_library {
9348 name: "mylib",
9349 srcs: ["mylib.cpp"],
9350 apex_available: ["myapex"],
9351 shared_libs: ["stublib"],
9352 system_shared_libs: [],
9353 }
9354 apex {
9355 name: "otherapex",
9356 enabled: %s,
9357 key: "myapex.key",
9358 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009359 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009360 }
9361 `
9362
9363 stublibSourceBp := `
9364 cc_library {
9365 name: "stublib",
9366 srcs: ["mylib.cpp"],
9367 apex_available: ["otherapex"],
9368 system_shared_libs: [],
9369 stl: "none",
9370 stubs: {
9371 versions: ["1"],
9372 },
9373 }
9374 `
9375
9376 stublibPrebuiltBp := `
9377 cc_prebuilt_library_shared {
9378 name: "stublib",
9379 srcs: ["prebuilt.so"],
9380 apex_available: ["otherapex"],
9381 stubs: {
9382 versions: ["1"],
9383 },
9384 %s
9385 }
9386 `
9387
9388 tests := []struct {
9389 name string
9390 stublibBp string
9391 usePrebuilt bool
9392 modNames []string // Modules to collect AndroidMkEntries for
9393 otherApexEnabled []string
9394 }{
9395 {
9396 name: "only_source",
9397 stublibBp: stublibSourceBp,
9398 usePrebuilt: false,
9399 modNames: []string{"stublib"},
9400 otherApexEnabled: []string{"true", "false"},
9401 },
9402 {
9403 name: "source_preferred",
9404 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9405 usePrebuilt: false,
9406 modNames: []string{"stublib", "prebuilt_stublib"},
9407 otherApexEnabled: []string{"true", "false"},
9408 },
9409 {
9410 name: "prebuilt_preferred",
9411 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9412 usePrebuilt: true,
9413 modNames: []string{"stublib", "prebuilt_stublib"},
9414 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9415 },
9416 {
9417 name: "only_prebuilt",
9418 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9419 usePrebuilt: true,
9420 modNames: []string{"stublib"},
9421 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9422 },
9423 }
9424
9425 for _, test := range tests {
9426 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009427 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009428 for _, otherApexEnabled := range test.otherApexEnabled {
9429 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009430 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009431 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009432
9433 type modAndMkEntries struct {
9434 mod *cc.Module
Priyanka Advani (xWF)37e67942024-10-17 18:58:08 +00009435 mkEntries android.AndroidMkEntries
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009436 }
9437 entries := []*modAndMkEntries{}
9438
9439 // Gather shared lib modules that are installable
9440 for _, modName := range test.modNames {
9441 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9442 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9443 continue
9444 }
9445 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009446 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009447 continue
9448 }
Priyanka Advani (xWF)37e67942024-10-17 18:58:08 +00009449 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009450 if ent.Disabled {
9451 continue
9452 }
9453 entries = append(entries, &modAndMkEntries{
9454 mod: mod,
9455 mkEntries: ent,
9456 })
9457 }
9458 }
9459 }
9460
9461 var entry *modAndMkEntries = nil
9462 for _, ent := range entries {
9463 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9464 if entry != nil {
9465 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9466 } else {
9467 entry = ent
9468 }
9469 }
9470 }
9471
9472 if entry == nil {
9473 t.Errorf("AndroidMk entry for \"stublib\" missing")
9474 } else {
9475 isPrebuilt := entry.mod.Prebuilt() != nil
9476 if isPrebuilt != test.usePrebuilt {
9477 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9478 }
9479 if !entry.mod.IsStubs() {
9480 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9481 }
9482 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9483 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9484 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009485 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009486 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009487 if !android.InList(expected, cflags) {
9488 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9489 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009490 }
9491 })
9492 }
9493 })
9494 }
9495}
9496
Colin Crossc33e5212021-05-25 18:16:02 -07009497func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009498 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009499 bp := `
9500 apex {
9501 name: "myapex",
9502 key: "myapex.key",
9503 java_libs: ["mylib"],
9504 bootclasspath_fragments: ["mybootclasspathfragment"],
9505 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9506 updatable: false,
9507 }
9508
9509 apex_key {
9510 name: "myapex.key",
9511 public_key: "testkey.avbpubkey",
9512 private_key: "testkey.pem",
9513 }
9514
9515 java_library {
9516 name: "mylib",
9517 srcs: ["mylib.java"],
9518 apex_available: ["myapex"],
9519 compile_dex: true,
9520 }
9521
9522 bootclasspath_fragment {
9523 name: "mybootclasspathfragment",
9524 contents: ["mybootclasspathlib"],
9525 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009526 hidden_api: {
9527 split_packages: ["*"],
9528 },
Colin Crossc33e5212021-05-25 18:16:02 -07009529 }
9530
9531 java_library {
9532 name: "mybootclasspathlib",
9533 srcs: ["mybootclasspathlib.java"],
9534 apex_available: ["myapex"],
9535 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009536 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009537 }
9538
9539 systemserverclasspath_fragment {
9540 name: "mysystemserverclasspathfragment",
9541 contents: ["mysystemserverclasspathlib"],
9542 apex_available: ["myapex"],
9543 }
9544
9545 java_library {
9546 name: "mysystemserverclasspathlib",
9547 srcs: ["mysystemserverclasspathlib.java"],
9548 apex_available: ["myapex"],
9549 compile_dex: true,
9550 }
9551 `
9552
9553 result := android.GroupFixturePreparers(
9554 PrepareForTestWithApexBuildComponents,
9555 prepareForTestWithMyapex,
9556 java.PrepareForTestWithJavaDefaultModules,
9557 android.PrepareForTestWithAndroidBuildComponents,
9558 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009559 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9560 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009561 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009562 ).RunTest(t)
9563
9564 // Make sure jacoco ran on both mylib and mybootclasspathlib
9565 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9566 t.Errorf("Failed to find jacoco rule for mylib")
9567 }
9568 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9569 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9570 }
9571 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9572 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9573 }
9574}
9575
Jiyong Park192600a2021-08-03 07:52:17 +00009576func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009577 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009578 testApexError(t, `executable mybin is static`, `
9579 apex {
9580 name: "myapex",
9581 key: "myapex.key",
9582 binaries: ["mybin"],
9583 min_sdk_version: "29",
9584 }
9585
9586 apex_key {
9587 name: "myapex.key",
9588 public_key: "testkey.avbpubkey",
9589 private_key: "testkey.pem",
9590 }
9591
9592 cc_binary {
9593 name: "mybin",
9594 srcs: ["mylib.cpp"],
9595 relative_install_path: "foo/bar",
9596 static_executable: true,
9597 system_shared_libs: [],
9598 stl: "none",
9599 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009600 min_sdk_version: "29",
9601 }
9602 `)
9603
9604 testApexError(t, `executable mybin.rust is static`, `
9605 apex {
9606 name: "myapex",
9607 key: "myapex.key",
9608 binaries: ["mybin.rust"],
9609 min_sdk_version: "29",
9610 }
9611
9612 apex_key {
9613 name: "myapex.key",
9614 public_key: "testkey.avbpubkey",
9615 private_key: "testkey.pem",
9616 }
9617
9618 rust_binary {
9619 name: "mybin.rust",
9620 srcs: ["foo.rs"],
9621 static_executable: true,
9622 apex_available: ["myapex"],
9623 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009624 }
9625 `)
9626}
9627
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009628func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009629 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009630 ctx := testApex(t, `
9631 apex {
9632 name: "myapex",
9633 key: "myapex.key",
9634 updatable: false,
9635 java_libs: ["foo"],
9636 }
9637
9638 apex_key {
9639 name: "myapex.key",
9640 public_key: "testkey.avbpubkey",
9641 private_key: "testkey.pem",
9642 }
9643
9644 java_library {
9645 name: "foo",
9646 srcs: ["foo.java"],
9647 apex_available: ["myapex"],
9648 installable: true,
9649 }
9650 `,
9651 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9652 )
9653
Jooyung Hana0503a52023-08-23 13:12:50 +09009654 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009655 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9656 var builder strings.Builder
9657 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9658 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009659 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 +00009660}
9661
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009662func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009663 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009664 ctx := testApex(t, `
9665 apex {
9666 name: "myapex",
9667 key: "myapex.key",
9668 updatable: false,
9669 java_libs: ["foo"],
9670 required: ["otherapex"],
9671 }
9672
9673 apex {
9674 name: "otherapex",
9675 key: "myapex.key",
9676 updatable: false,
9677 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009678 }
9679
9680 apex_key {
9681 name: "myapex.key",
9682 public_key: "testkey.avbpubkey",
9683 private_key: "testkey.pem",
9684 }
9685
9686 java_library {
9687 name: "foo",
9688 srcs: ["foo.java"],
9689 apex_available: ["myapex", "otherapex"],
9690 installable: true,
9691 }
9692 `)
9693
Jooyung Hana0503a52023-08-23 13:12:50 +09009694 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009695 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9696 var builder strings.Builder
9697 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9698 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009699 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009700}
9701
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009702func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009703 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009704 ctx := testApex(t, `
9705 apex {
9706 name: "myapex",
9707 key: "myapex.key",
9708 updatable: false,
9709 }
9710
9711 apex_key {
9712 name: "myapex.key",
9713 public_key: "testkey.avbpubkey",
9714 private_key: "testkey.pem",
9715 }
9716 `)
9717
Jooyung Hana0503a52023-08-23 13:12:50 +09009718 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009719 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009720 data := android.AndroidMkDataForTest(t, ctx, bundle)
9721 var builder strings.Builder
9722 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9723 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009724 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009725}
9726
Jooyung Hana6d36672022-02-24 13:58:07 +09009727func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009728 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009729 for _, tc := range []struct {
9730 name string
9731 ref string
9732 expected_data []string
9733 }{
9734 {
9735 name: "test_using_output",
9736 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009737 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009738 },
9739 {
9740 name: "test_using_apex",
9741 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009742 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009743 },
9744 } {
9745 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009746 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009747 ctx := testApex(t, `
9748 apex {
9749 name: "myapex",
9750 key: "myapex.key",
9751 compressible: true,
9752 updatable: false,
9753 }
9754
9755 apex_key {
9756 name: "myapex.key",
9757 public_key: "testkey.avbpubkey",
9758 private_key: "testkey.pem",
9759 }
9760
9761 java_test {
9762 name: "`+tc.name+`",
9763 srcs: ["a.java"],
9764 data: ["`+tc.ref+`"],
9765 }
9766 `,
9767 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9768 variables.CompressedApex = proptools.BoolPtr(true)
9769 }))
9770 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9771 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9772 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9773 })
9774 }
9775}
9776
satayev758968a2021-12-06 11:42:40 +00009777func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009778 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009779 preparer := android.GroupFixturePreparers(
9780 PrepareForTestWithApexBuildComponents,
9781 prepareForTestWithMyapex,
9782 java.PrepareForTestWithJavaSdkLibraryFiles,
9783 java.PrepareForTestWithJavaDefaultModules,
9784 android.PrepareForTestWithAndroidBuildComponents,
9785 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9786 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9787 )
9788
9789 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9790 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009791 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009792 preparer.RunTestWithBp(t, `
9793 apex {
9794 name: "myapex",
9795 key: "myapex.key",
9796 bootclasspath_fragments: ["mybootclasspathfragment"],
9797 min_sdk_version: "30",
9798 updatable: false,
9799 }
9800
9801 apex_key {
9802 name: "myapex.key",
9803 public_key: "testkey.avbpubkey",
9804 private_key: "testkey.pem",
9805 }
9806
9807 bootclasspath_fragment {
9808 name: "mybootclasspathfragment",
9809 contents: ["mybootclasspathlib"],
9810 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009811 hidden_api: {
9812 split_packages: ["*"],
9813 },
satayev758968a2021-12-06 11:42:40 +00009814 }
9815
9816 java_sdk_library {
9817 name: "mybootclasspathlib",
9818 srcs: ["mybootclasspathlib.java"],
9819 apex_available: ["myapex"],
9820 compile_dex: true,
9821 unsafe_ignore_missing_latest_api: true,
9822 min_sdk_version: "31",
9823 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009824 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009825 }
9826
9827 java_library {
9828 name: "util",
9829 srcs: ["a.java"],
9830 apex_available: ["myapex"],
9831 min_sdk_version: "31",
9832 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009833 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009834 }
9835
9836 java_library {
9837 name: "another_util",
9838 srcs: ["a.java"],
9839 min_sdk_version: "31",
9840 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009841 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009842 }
9843 `)
9844 })
9845
9846 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9847 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009848 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009849 preparer.RunTestWithBp(t, `
9850 apex {
9851 name: "myapex",
9852 key: "myapex.key",
9853 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9854 min_sdk_version: "30",
9855 updatable: false,
9856 }
9857
9858 apex_key {
9859 name: "myapex.key",
9860 public_key: "testkey.avbpubkey",
9861 private_key: "testkey.pem",
9862 }
9863
9864 systemserverclasspath_fragment {
9865 name: "mysystemserverclasspathfragment",
9866 contents: ["mysystemserverclasspathlib"],
9867 apex_available: ["myapex"],
9868 }
9869
9870 java_sdk_library {
9871 name: "mysystemserverclasspathlib",
9872 srcs: ["mysystemserverclasspathlib.java"],
9873 apex_available: ["myapex"],
9874 compile_dex: true,
9875 min_sdk_version: "32",
9876 unsafe_ignore_missing_latest_api: true,
9877 static_libs: ["util"],
9878 }
9879
9880 java_library {
9881 name: "util",
9882 srcs: ["a.java"],
9883 apex_available: ["myapex"],
9884 min_sdk_version: "31",
9885 static_libs: ["another_util"],
9886 }
9887
9888 java_library {
9889 name: "another_util",
9890 srcs: ["a.java"],
9891 min_sdk_version: "31",
9892 apex_available: ["myapex"],
9893 }
9894 `)
9895 })
9896
9897 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009898 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009899 preparer.
satayev758968a2021-12-06 11:42:40 +00009900 RunTestWithBp(t, `
9901 apex {
9902 name: "myapex",
9903 key: "myapex.key",
9904 bootclasspath_fragments: ["mybootclasspathfragment"],
9905 min_sdk_version: "30",
9906 updatable: false,
9907 }
9908
9909 apex_key {
9910 name: "myapex.key",
9911 public_key: "testkey.avbpubkey",
9912 private_key: "testkey.pem",
9913 }
9914
9915 bootclasspath_fragment {
9916 name: "mybootclasspathfragment",
9917 contents: ["mybootclasspathlib"],
9918 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009919 hidden_api: {
9920 split_packages: ["*"],
9921 },
satayev758968a2021-12-06 11:42:40 +00009922 }
9923
9924 java_sdk_library {
9925 name: "mybootclasspathlib",
9926 srcs: ["mybootclasspathlib.java"],
9927 apex_available: ["myapex"],
9928 compile_dex: true,
9929 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009930 sdk_version: "current",
9931 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009932 }
9933 `)
9934 })
9935
9936 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009937 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009938 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9939 RunTestWithBp(t, `
9940 apex {
9941 name: "myapex",
9942 key: "myapex.key",
9943 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9944 min_sdk_version: "30",
9945 updatable: false,
9946 }
9947
9948 apex_key {
9949 name: "myapex.key",
9950 public_key: "testkey.avbpubkey",
9951 private_key: "testkey.pem",
9952 }
9953
9954 systemserverclasspath_fragment {
9955 name: "mysystemserverclasspathfragment",
9956 contents: ["mysystemserverclasspathlib"],
9957 apex_available: ["myapex"],
9958 }
9959
9960 java_sdk_library {
9961 name: "mysystemserverclasspathlib",
9962 srcs: ["mysystemserverclasspathlib.java"],
9963 apex_available: ["myapex"],
9964 compile_dex: true,
9965 unsafe_ignore_missing_latest_api: true,
9966 }
9967 `)
9968 })
9969}
9970
Jiakai Zhang6decef92022-01-12 17:56:19 +00009971// Verifies that the APEX depends on all the Make modules in the list.
9972func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9973 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9974 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009975 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009976 }
9977}
9978
9979// Verifies that the APEX does not depend on any of the Make modules in the list.
9980func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9981 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9982 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009983 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009984 }
9985}
9986
Cole Faust24e25c02024-01-19 14:12:17 -08009987func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009988 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009989 bpTemplate := `
9990 apex {
9991 name: "myapex",
9992 key: "myapex.key",
9993 java_libs: ["myjavalib"],
9994 updatable: %v,
9995 min_sdk_version: "29",
9996 }
9997 apex_key {
9998 name: "myapex.key",
9999 }
10000 java_library {
10001 name: "myjavalib",
10002 srcs: ["MyClass.java"],
10003 apex_available: [ "myapex" ],
10004 lint: {
10005 strict_updatability_linting: %v,
10006 %s
10007 },
10008 sdk_version: "current",
10009 min_sdk_version: "29",
10010 }
10011 `
10012 fs := android.MockFS{
10013 "lint-baseline.xml": nil,
10014 }
10015
10016 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010017 testCaseName string
10018 apexUpdatable bool
10019 javaStrictUpdtabilityLint bool
10020 lintFileExists bool
10021 disallowedFlagExpectedOnApex bool
10022 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010023 }{
10024 {
Colin Cross87427352024-09-25 15:41:19 -070010025 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10026 apexUpdatable: true,
10027 javaStrictUpdtabilityLint: true,
10028 lintFileExists: false,
10029 disallowedFlagExpectedOnApex: false,
10030 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010031 },
10032 {
Colin Cross87427352024-09-25 15:41:19 -070010033 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10034 apexUpdatable: false,
10035 javaStrictUpdtabilityLint: false,
10036 lintFileExists: true,
10037 disallowedFlagExpectedOnApex: false,
10038 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010039 },
10040 {
Colin Cross87427352024-09-25 15:41:19 -070010041 testCaseName: "non-updatable apex respects strict updatability of javalib",
10042 apexUpdatable: false,
10043 javaStrictUpdtabilityLint: true,
10044 lintFileExists: true,
10045 disallowedFlagExpectedOnApex: false,
10046 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010047 },
10048 {
Colin Cross87427352024-09-25 15:41:19 -070010049 testCaseName: "updatable apex checks strict updatability of javalib",
10050 apexUpdatable: true,
10051 javaStrictUpdtabilityLint: false,
10052 lintFileExists: true,
10053 disallowedFlagExpectedOnApex: true,
10054 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010055 },
10056 }
10057
10058 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010059 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010060 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010061 fixtures := []android.FixturePreparer{}
10062 baselineProperty := ""
10063 if testCase.lintFileExists {
10064 fixtures = append(fixtures, fs.AddToFixture())
10065 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10066 }
10067 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010068
Colin Cross87427352024-09-25 15:41:19 -070010069 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010070
Colin Cross87427352024-09-25 15:41:19 -070010071 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10072 if expectStrictUpdatability {
10073 if m.Rule == nil {
10074 t.Errorf("expected strict updatability check rule on %s", name)
10075 } else {
10076 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10077 m.RuleParams.Command, "--disallowed_issues NewApi")
10078 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10079 m.Inputs.Strings(), "lint-baseline.xml")
10080 }
10081 } else {
10082 if m.Rule != nil {
10083 t.Errorf("expected no strict updatability check rule on %s", name)
10084 }
10085 }
10086 }
10087
10088 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10089 apex := result.ModuleForTests("myapex", "android_common_myapex")
10090 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10091 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10092
10093 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10094 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10095 })
Cole Faust24e25c02024-01-19 14:12:17 -080010096 }
10097}
10098
Cole Faust24e25c02024-01-19 14:12:17 -080010099// checks transtive deps of an apex coming from bootclasspath_fragment
10100func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010101 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010102 bp := `
10103 apex {
10104 name: "myapex",
10105 key: "myapex.key",
10106 bootclasspath_fragments: ["mybootclasspathfragment"],
10107 updatable: true,
10108 min_sdk_version: "29",
10109 }
10110 apex_key {
10111 name: "myapex.key",
10112 }
10113 bootclasspath_fragment {
10114 name: "mybootclasspathfragment",
10115 contents: ["myjavalib"],
10116 apex_available: ["myapex"],
10117 hidden_api: {
10118 split_packages: ["*"],
10119 },
10120 }
10121 java_library {
10122 name: "myjavalib",
10123 srcs: ["MyClass.java"],
10124 apex_available: [ "myapex" ],
10125 sdk_version: "current",
10126 min_sdk_version: "29",
10127 compile_dex: true,
10128 lint: {
10129 baseline_filename: "lint-baseline.xml",
10130 }
10131 }
10132 `
10133 fs := android.MockFS{
10134 "lint-baseline.xml": nil,
10135 }
10136
10137 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010138 apex := result.ModuleForTests("myapex", "android_common_myapex")
10139 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10140 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10141 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10142 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10143 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010144}
Spandan Das66773252022-01-15 00:23:18 +000010145
Jihoon Kang784c0052024-06-25 22:15:39 +000010146func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010147 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010148 bp := `
10149 apex {
10150 name: "myapex",
10151 key: "myapex.key",
10152 bootclasspath_fragments: ["mybootclasspathfragment"],
10153 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010154 java_libs: [
10155 "jacocoagent",
10156 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010157 }
10158 apex_key {
10159 name: "myapex.key",
10160 }
10161 bootclasspath_fragment {
10162 name: "mybootclasspathfragment",
10163 contents: ["foo"],
10164 apex_available: ["myapex"],
10165 hidden_api: {
10166 split_packages: ["*"],
10167 },
10168 }
10169 java_sdk_library {
10170 name: "foo",
10171 srcs: ["MyClass.java"],
10172 apex_available: [ "myapex" ],
10173 sdk_version: "current",
10174 min_sdk_version: "29",
10175 compile_dex: true,
10176 }
10177 `
10178 fs := android.MockFS{
10179 "lint-baseline.xml": nil,
10180 }
10181
10182 result := android.GroupFixturePreparers(
10183 prepareForApexTest,
10184 java.PrepareForTestWithJavaSdkLibraryFiles,
10185 java.PrepareForTestWithJacocoInstrumentation,
10186 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010187 android.FixtureMergeMockFs(fs),
10188 ).RunTestWithBp(t, bp)
10189
10190 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10191 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10192 android.AssertStringDoesContain(t,
10193 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10194 lintReportInputs, "foo.impl")
10195}
10196
Spandan Das42e89502022-05-06 22:12:55 +000010197// updatable apexes should propagate updatable=true to its apps
10198func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010199 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010200 bp := `
10201 apex {
10202 name: "myapex",
10203 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010204 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010205 apps: [
10206 "myapp",
10207 ],
10208 min_sdk_version: "30",
10209 }
10210 apex_key {
10211 name: "myapex.key",
10212 }
10213 android_app {
10214 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010215 apex_available: [
10216 "myapex",
10217 ],
10218 sdk_version: "current",
10219 min_sdk_version: "30",
10220 }
10221 `
Colin Cross99939e92024-10-01 16:02:46 -070010222 _ = android.GroupFixturePreparers(
10223 prepareForApexTest,
10224 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10225 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010226}
10227
Dennis Shend4f5d932023-01-31 20:27:21 +000010228func TestTrimmedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010229 t.Parallel()
Dennis Shend4f5d932023-01-31 20:27:21 +000010230 bp := `
10231 apex {
10232 name: "myapex",
10233 key: "myapex.key",
10234 native_shared_libs: ["libfoo","libbaz"],
10235 min_sdk_version: "29",
10236 trim_against: "mydcla",
10237 }
10238 apex {
10239 name: "mydcla",
10240 key: "myapex.key",
10241 native_shared_libs: ["libfoo","libbar"],
10242 min_sdk_version: "29",
10243 file_contexts: ":myapex-file_contexts",
10244 dynamic_common_lib_apex: true,
10245 }
10246 apex_key {
10247 name: "myapex.key",
10248 }
10249 cc_library {
10250 name: "libfoo",
10251 shared_libs: ["libc"],
10252 apex_available: ["myapex","mydcla"],
10253 min_sdk_version: "29",
10254 }
10255 cc_library {
10256 name: "libbar",
10257 shared_libs: ["libc"],
10258 apex_available: ["myapex","mydcla"],
10259 min_sdk_version: "29",
10260 }
10261 cc_library {
10262 name: "libbaz",
10263 shared_libs: ["libc"],
10264 apex_available: ["myapex","mydcla"],
10265 min_sdk_version: "29",
10266 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010267 `
10268 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010269 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010270 apexRule := module.MaybeRule("apexRule")
10271 if apexRule.Rule == nil {
10272 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10273 }
10274
10275 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010276 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010277 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10278 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10279 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10280 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10281}
Jingwen Chendea7a642023-03-28 11:30:50 +000010282
10283func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010284 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010285 ctx := testApex(t, `
10286 apex {
10287 name: "myapex",
10288 key: "myapex.key",
10289 updatable: false,
10290 }
10291
10292 apex_key {
10293 name: "myapex.key",
10294 public_key: "testkey.avbpubkey",
10295 private_key: "testkey.pem",
10296 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010297 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010298 generateFsRule := mod.Rule("generateFsConfig")
10299 cmd := generateFsRule.RuleParams.Command
10300
10301 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10302}
10303
10304func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010305 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010306 ctx := testApex(t, `
10307 apex {
10308 name: "myapex",
10309 key: "myapex.key",
10310 canned_fs_config: "my_config",
10311 updatable: false,
10312 }
10313
10314 apex_key {
10315 name: "myapex.key",
10316 public_key: "testkey.avbpubkey",
10317 private_key: "testkey.pem",
10318 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010319 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010320 generateFsRule := mod.Rule("generateFsConfig")
10321 cmd := generateFsRule.RuleParams.Command
10322
10323 // Ensure that canned_fs_config has "cat my_config" at the end
10324 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10325}
Spandan Das20fce2d2023-04-12 17:21:39 +000010326
10327func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010328 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010329 testCases := []struct {
10330 desc string
10331 hasStubs bool
10332 apexAvailable string
10333 expectedError string
10334 }{
10335 {
10336 desc: "non-stub library can have multiple apex_available",
10337 hasStubs: false,
10338 apexAvailable: `["myapex", "otherapex"]`,
10339 },
10340 {
10341 desc: "stub library should not be available to anyapex",
10342 hasStubs: true,
10343 apexAvailable: `["//apex_available:anyapex"]`,
10344 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10345 },
10346 {
10347 desc: "stub library should not be available to multiple apexes",
10348 hasStubs: true,
10349 apexAvailable: `["myapex", "otherapex"]`,
10350 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10351 },
10352 {
10353 desc: "stub library can be available to a core apex and a test apex",
10354 hasStubs: true,
10355 apexAvailable: `["myapex", "test_myapex"]`,
10356 },
10357 }
10358 bpTemplate := `
10359 cc_library {
10360 name: "libfoo",
10361 %v
10362 apex_available: %v,
10363 }
10364 apex {
10365 name: "myapex",
10366 key: "apex.key",
10367 updatable: false,
10368 native_shared_libs: ["libfoo"],
10369 }
10370 apex {
10371 name: "otherapex",
10372 key: "apex.key",
10373 updatable: false,
10374 }
10375 apex_test {
10376 name: "test_myapex",
10377 key: "apex.key",
10378 updatable: false,
10379 native_shared_libs: ["libfoo"],
10380 }
10381 apex_key {
10382 name: "apex.key",
10383 }
10384 `
10385 for _, tc := range testCases {
10386 stubs := ""
10387 if tc.hasStubs {
10388 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10389 }
10390 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10391 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10392 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10393 })
10394 if tc.expectedError == "" {
10395 testApex(t, bp, mockFsFixturePreparer)
10396 } else {
10397 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10398 }
10399 }
10400}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010401
10402func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010403 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010404 context := android.GroupFixturePreparers(
10405 android.PrepareForIntegrationTestWithAndroid,
10406 cc.PrepareForIntegrationTestWithCc,
10407 PrepareForTestWithApexBuildComponents,
10408 prepareForTestWithMyapex,
10409 filesystem.PrepareForTestWithFilesystemBuildComponents,
10410 )
10411 result := context.RunTestWithBp(t, `
10412 android_system_image {
10413 name: "myfilesystem",
10414 deps: [
10415 "libfoo",
10416 ],
10417 linker_config_src: "linker.config.json",
10418 }
10419
10420 cc_library {
10421 name: "libfoo",
10422 shared_libs: [
10423 "libbar",
10424 ],
10425 stl: "none",
10426 }
10427
10428 cc_library {
10429 name: "libbar",
10430 stl: "none",
10431 apex_available: ["myapex"],
10432 }
10433
10434 apex {
10435 name: "myapex",
10436 native_shared_libs: ["libbar"],
10437 key: "myapex.key",
10438 updatable: false,
10439 }
10440
10441 apex_key {
10442 name: "myapex.key",
10443 public_key: "testkey.avbpubkey",
10444 private_key: "testkey.pem",
10445 }
10446 `)
10447
Cole Faust3b806d32024-03-11 15:15:03 -070010448 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010449 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10450 inputs.Strings(),
10451 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10452}
Yu Liueae7b362023-11-16 17:05:47 -080010453
10454var apex_default_bp = `
10455 apex_key {
10456 name: "myapex.key",
10457 public_key: "testkey.avbpubkey",
10458 private_key: "testkey.pem",
10459 }
10460
10461 filegroup {
10462 name: "myapex.manifest",
10463 srcs: ["apex_manifest.json"],
10464 }
10465
10466 filegroup {
10467 name: "myapex.androidmanifest",
10468 srcs: ["AndroidManifest.xml"],
10469 }
10470`
10471
10472func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010473 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010474 ctx := testApex(t, apex_default_bp+`
10475 apex {
10476 name: "myapex",
10477 manifest: ":myapex.manifest",
10478 androidManifest: ":myapex.androidmanifest",
10479 key: "myapex.key",
10480 java_libs: [
10481 "my_java_library_foo",
10482 "my_java_library_bar",
10483 ],
10484 updatable: false,
10485 }
10486
10487 java_library {
10488 name: "my_java_library_foo",
10489 srcs: ["foo/bar/MyClass.java"],
10490 sdk_version: "none",
10491 system_modules: "none",
10492 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010493 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010494 "myapex",
10495 ],
10496 }
10497
10498 java_library {
10499 name: "my_java_library_bar",
10500 srcs: ["foo/bar/MyClass.java"],
10501 sdk_version: "none",
10502 system_modules: "none",
10503 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010504 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010505 "myapex",
10506 ],
10507 }
10508
10509 aconfig_declarations {
10510 name: "my_aconfig_declarations_foo",
10511 package: "com.example.package",
10512 container: "myapex",
10513 srcs: ["foo.aconfig"],
10514 }
10515
10516 java_aconfig_library {
10517 name: "my_java_aconfig_library_foo",
10518 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010519 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010520 "myapex",
10521 ],
10522 }
10523
10524 aconfig_declarations {
10525 name: "my_aconfig_declarations_bar",
10526 package: "com.example.package",
10527 container: "myapex",
10528 srcs: ["bar.aconfig"],
10529 }
10530
10531 java_aconfig_library {
10532 name: "my_java_aconfig_library_bar",
10533 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010534 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010535 "myapex",
10536 ],
10537 }
10538 `)
10539
10540 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10541 s := mod.Rule("apexRule").Args["copy_commands"]
10542 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010543 if len(copyCmds) != 14 {
10544 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010545 }
10546
Jooyung Hana3fddf42024-09-03 13:22:21 +090010547 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10548 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10549 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10550 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010551 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010552
Yu Liubba555e2024-02-17 00:36:42 +000010553 inputs := []string{
10554 "my_aconfig_declarations_foo/intermediate.pb",
10555 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010556 }
Yu Liubba555e2024-02-17 00:36:42 +000010557 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10558 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10559 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10560 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010561 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010562}
10563
10564func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010565 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010566 ctx := testApex(t, apex_default_bp+`
10567 apex {
10568 name: "myapex",
10569 manifest: ":myapex.manifest",
10570 androidManifest: ":myapex.androidmanifest",
10571 key: "myapex.key",
10572 java_libs: [
10573 "my_java_library_foo",
10574 ],
10575 native_shared_libs: [
10576 "my_cc_library_bar",
10577 ],
10578 binaries: [
10579 "my_cc_binary_baz",
10580 ],
10581 updatable: false,
10582 }
10583
10584 java_library {
10585 name: "my_java_library_foo",
10586 srcs: ["foo/bar/MyClass.java"],
10587 sdk_version: "none",
10588 system_modules: "none",
10589 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010590 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010591 "myapex",
10592 ],
10593 }
10594
10595 cc_library {
10596 name: "my_cc_library_bar",
10597 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010598 static_libs: [
10599 "my_cc_aconfig_library_bar",
10600 "my_cc_aconfig_library_baz",
10601 ],
Yu Liueae7b362023-11-16 17:05:47 -080010602 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010603 "myapex",
10604 ],
10605 }
10606
10607 cc_binary {
10608 name: "my_cc_binary_baz",
10609 srcs: ["foo/bar/MyClass.cc"],
10610 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010611 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010612 "myapex",
10613 ],
10614 }
10615
10616 aconfig_declarations {
10617 name: "my_aconfig_declarations_foo",
10618 package: "com.example.package",
10619 container: "myapex",
10620 srcs: ["foo.aconfig"],
10621 }
10622
10623 java_aconfig_library {
10624 name: "my_java_aconfig_library_foo",
10625 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010626 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010627 "myapex",
10628 ],
10629 }
10630
10631 aconfig_declarations {
10632 name: "my_aconfig_declarations_bar",
10633 package: "com.example.package",
10634 container: "myapex",
10635 srcs: ["bar.aconfig"],
10636 }
10637
10638 cc_aconfig_library {
10639 name: "my_cc_aconfig_library_bar",
10640 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010641 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010642 "myapex",
10643 ],
10644 }
10645
10646 aconfig_declarations {
10647 name: "my_aconfig_declarations_baz",
10648 package: "com.example.package",
10649 container: "myapex",
10650 srcs: ["baz.aconfig"],
10651 }
10652
10653 cc_aconfig_library {
10654 name: "my_cc_aconfig_library_baz",
10655 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010656 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010657 "myapex",
10658 ],
10659 }
10660
10661 cc_library {
10662 name: "server_configurable_flags",
10663 srcs: ["server_configurable_flags.cc"],
10664 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010665 cc_library {
10666 name: "libbase",
10667 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010668 apex_available: [
10669 "myapex",
10670 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010671 }
10672 cc_library {
10673 name: "libaconfig_storage_read_api_cc",
10674 srcs: ["libaconfig_storage_read_api_cc.cc"],
10675 }
Yu Liueae7b362023-11-16 17:05:47 -080010676 `)
10677
10678 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10679 s := mod.Rule("apexRule").Args["copy_commands"]
10680 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010681 if len(copyCmds) != 18 {
10682 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010683 }
10684
Jooyung Hana3fddf42024-09-03 13:22:21 +090010685 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10686 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10687 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10688 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010689 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010690
Yu Liubba555e2024-02-17 00:36:42 +000010691 inputs := []string{
10692 "my_aconfig_declarations_foo/intermediate.pb",
10693 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10694 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010695 }
Yu Liubba555e2024-02-17 00:36:42 +000010696 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10697 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10698 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10699 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010700 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010701}
10702
Yu Liucec0e412023-11-30 16:45:50 -080010703func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010704 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010705 ctx := testApex(t, apex_default_bp+`
10706 apex {
10707 name: "myapex",
10708 manifest: ":myapex.manifest",
10709 androidManifest: ":myapex.androidmanifest",
10710 key: "myapex.key",
10711 native_shared_libs: [
10712 "libmy_rust_library",
10713 ],
10714 binaries: [
10715 "my_rust_binary",
10716 ],
10717 rust_dyn_libs: [
10718 "libmy_rust_dylib",
10719 ],
10720 updatable: false,
10721 }
10722
10723 rust_library {
10724 name: "libflags_rust", // test mock
10725 crate_name: "flags_rust",
10726 srcs: ["lib.rs"],
10727 apex_available: [
10728 "myapex",
10729 ],
10730 }
10731
10732 rust_library {
10733 name: "liblazy_static", // test mock
10734 crate_name: "lazy_static",
10735 srcs: ["src/lib.rs"],
10736 apex_available: [
10737 "myapex",
10738 ],
10739 }
10740
Ted Bauer02d475c2024-03-27 20:56:26 +000010741 rust_library {
10742 name: "libaconfig_storage_read_api", // test mock
10743 crate_name: "aconfig_storage_read_api",
10744 srcs: ["src/lib.rs"],
10745 apex_available: [
10746 "myapex",
10747 ],
10748 }
10749
Ted Bauer6ef40db2024-03-29 14:04:10 +000010750 rust_library {
10751 name: "liblogger", // test mock
10752 crate_name: "logger",
10753 srcs: ["src/lib.rs"],
10754 apex_available: [
10755 "myapex",
10756 ],
10757 }
10758
10759 rust_library {
10760 name: "liblog_rust", // test mock
10761 crate_name: "log_rust",
10762 srcs: ["src/lib.rs"],
10763 apex_available: [
10764 "myapex",
10765 ],
10766 }
10767
Yu Liucec0e412023-11-30 16:45:50 -080010768 rust_ffi_shared {
10769 name: "libmy_rust_library",
10770 srcs: ["src/lib.rs"],
10771 rustlibs: ["libmy_rust_aconfig_library_foo"],
10772 crate_name: "my_rust_library",
10773 apex_available: [
10774 "myapex",
10775 ],
10776 }
10777
10778 rust_library_dylib {
10779 name: "libmy_rust_dylib",
10780 srcs: ["foo/bar/MyClass.rs"],
10781 rustlibs: ["libmy_rust_aconfig_library_bar"],
10782 crate_name: "my_rust_dylib",
10783 apex_available: [
10784 "myapex",
10785 ],
10786 }
10787
10788 rust_binary {
10789 name: "my_rust_binary",
10790 srcs: ["foo/bar/MyClass.rs"],
10791 rustlibs: [
10792 "libmy_rust_aconfig_library_baz",
10793 "libmy_rust_dylib",
10794 ],
10795 apex_available: [
10796 "myapex",
10797 ],
10798 }
10799
10800 aconfig_declarations {
10801 name: "my_aconfig_declarations_foo",
10802 package: "com.example.package",
10803 container: "myapex",
10804 srcs: ["foo.aconfig"],
10805 }
10806
10807 aconfig_declarations {
10808 name: "my_aconfig_declarations_bar",
10809 package: "com.example.package",
10810 container: "myapex",
10811 srcs: ["bar.aconfig"],
10812 }
10813
10814 aconfig_declarations {
10815 name: "my_aconfig_declarations_baz",
10816 package: "com.example.package",
10817 container: "myapex",
10818 srcs: ["baz.aconfig"],
10819 }
10820
10821 rust_aconfig_library {
10822 name: "libmy_rust_aconfig_library_foo",
10823 aconfig_declarations: "my_aconfig_declarations_foo",
10824 crate_name: "my_rust_aconfig_library_foo",
10825 apex_available: [
10826 "myapex",
10827 ],
10828 }
10829
10830 rust_aconfig_library {
10831 name: "libmy_rust_aconfig_library_bar",
10832 aconfig_declarations: "my_aconfig_declarations_bar",
10833 crate_name: "my_rust_aconfig_library_bar",
10834 apex_available: [
10835 "myapex",
10836 ],
10837 }
10838
10839 rust_aconfig_library {
10840 name: "libmy_rust_aconfig_library_baz",
10841 aconfig_declarations: "my_aconfig_declarations_baz",
10842 crate_name: "my_rust_aconfig_library_baz",
10843 apex_available: [
10844 "myapex",
10845 ],
10846 }
10847 `)
10848
10849 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10850 s := mod.Rule("apexRule").Args["copy_commands"]
10851 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010852 if len(copyCmds) != 38 {
10853 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010854 }
10855
Jooyung Hana3fddf42024-09-03 13:22:21 +090010856 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10857 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10858 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10859 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010860 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010861
Yu Liubba555e2024-02-17 00:36:42 +000010862 inputs := []string{
10863 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010864 "my_aconfig_declarations_bar/intermediate.pb",
10865 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010866 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10867 }
10868 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10869 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10870 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10871 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010872 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010873}
10874
10875func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10876 aconfigRule := mod.Description(desc)
10877 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010878 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010879 if len(aconfigArgs) != len(inputs) {
10880 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010881 }
Yu Liucec0e412023-11-30 16:45:50 -080010882
Yu Liubba555e2024-02-17 00:36:42 +000010883 ensureEquals(t, container, aconfigRule.Args["container"])
10884 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10885
10886 buildParams := aconfigRule.BuildParams
10887 for _, input := range inputs {
10888 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10889 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010890 }
Yu Liubba555e2024-02-17 00:36:42 +000010891
10892 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010893}
10894
Yu Liueae7b362023-11-16 17:05:47 -080010895func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010896 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010897 ctx := testApex(t, apex_default_bp+`
10898 apex {
10899 name: "myapex",
10900 manifest: ":myapex.manifest",
10901 androidManifest: ":myapex.androidmanifest",
10902 key: "myapex.key",
10903 java_libs: [
10904 "my_java_library_foo",
10905 "other_java_library_bar",
10906 ],
10907 updatable: false,
10908 }
10909
10910 java_library {
10911 name: "my_java_library_foo",
10912 srcs: ["foo/bar/MyClass.java"],
10913 sdk_version: "none",
10914 system_modules: "none",
10915 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010916 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010917 "myapex",
10918 ],
10919 }
10920
10921 java_library {
10922 name: "other_java_library_bar",
10923 srcs: ["foo/bar/MyClass.java"],
10924 sdk_version: "none",
10925 system_modules: "none",
10926 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010927 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010928 "myapex",
10929 ],
10930 }
10931
10932 aconfig_declarations {
10933 name: "my_aconfig_declarations_foo",
10934 package: "com.example.package",
10935 container: "myapex",
10936 srcs: ["foo.aconfig"],
10937 }
10938
10939 java_aconfig_library {
10940 name: "my_java_aconfig_library_foo",
10941 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010942 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010943 "myapex",
10944 ],
10945 }
10946
10947 aconfig_declarations {
10948 name: "other_aconfig_declarations_bar",
10949 package: "com.example.package",
10950 container: "otherapex",
10951 srcs: ["bar.aconfig"],
10952 }
10953
10954 java_aconfig_library {
10955 name: "other_java_aconfig_library_bar",
10956 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010957 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010958 "myapex",
10959 ],
10960 }
10961 `)
10962
10963 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10964 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10965 s := " " + combineAconfigRule.Args["cache_files"]
10966 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10967 if len(aconfigArgs) != 1 {
10968 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10969 }
10970 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10971
10972 buildParams := combineAconfigRule.BuildParams
10973 if len(buildParams.Inputs) != 1 {
10974 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10975 }
10976 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10977 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10978}
10979
10980func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010981 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010982 ctx := testApex(t, apex_default_bp+`
10983 apex {
10984 name: "myapex",
10985 manifest: ":myapex.manifest",
10986 androidManifest: ":myapex.androidmanifest",
10987 key: "myapex.key",
10988 java_libs: [
10989 "my_java_library_foo",
10990 "my_java_library_bar",
10991 ],
10992 updatable: false,
10993 }
10994
10995 java_library {
10996 name: "my_java_library_foo",
10997 srcs: ["foo/bar/MyClass.java"],
10998 sdk_version: "none",
10999 system_modules: "none",
11000 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011001 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011002 "myapex",
11003 ],
11004 }
11005
11006 java_library {
11007 name: "my_java_library_bar",
11008 srcs: ["foo/bar/MyClass.java"],
11009 sdk_version: "none",
11010 system_modules: "none",
11011 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011012 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011013 "myapex",
11014 ],
11015 }
11016
11017 aconfig_declarations {
11018 name: "my_aconfig_declarations_foo",
11019 package: "com.example.package",
11020 container: "myapex",
11021 srcs: ["foo.aconfig"],
11022 }
11023
11024 java_aconfig_library {
11025 name: "my_java_aconfig_library_foo",
11026 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011027 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011028 "myapex",
11029 ],
11030 }
11031
11032 java_aconfig_library {
11033 name: "my_java_aconfig_library_bar",
11034 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011035 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011036 "myapex",
11037 ],
11038 }
11039 `)
11040
11041 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11042 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11043 s := " " + combineAconfigRule.Args["cache_files"]
11044 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11045 if len(aconfigArgs) != 1 {
11046 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11047 }
11048 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11049
11050 buildParams := combineAconfigRule.BuildParams
11051 if len(buildParams.Inputs) != 1 {
11052 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11053 }
11054 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11055 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11056}
Spandan Das5be63332023-12-13 00:06:32 +000011057
11058// Test that the boot jars come from the _selected_ apex prebuilt
11059// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11060func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011061 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011062 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11063 t.Helper()
11064 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11065 foundLibfooJar := false
11066 base := stem + ".jar"
11067 for _, output := range s.AllOutputs() {
11068 if filepath.Base(output) == base {
11069 foundLibfooJar = true
11070 buildRule := s.Output(output)
11071 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11072 }
11073 }
11074 if !foundLibfooJar {
11075 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11076 }
11077 }
11078
Spandan Das64c9e0c2023-12-20 20:13:34 +000011079 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11080 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11081 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11082 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11083 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11084 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)
11085 }
11086
11087 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11088 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11089 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11090 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11091 }
11092
Spandan Das5be63332023-12-13 00:06:32 +000011093 bp := `
11094 // Source APEX.
11095
11096 java_library {
11097 name: "framework-foo",
11098 srcs: ["foo.java"],
11099 installable: true,
11100 apex_available: [
11101 "com.android.foo",
11102 ],
11103 }
11104
11105 bootclasspath_fragment {
11106 name: "foo-bootclasspath-fragment",
11107 contents: ["framework-foo"],
11108 apex_available: [
11109 "com.android.foo",
11110 ],
11111 hidden_api: {
11112 split_packages: ["*"],
11113 },
11114 }
11115
11116 apex_key {
11117 name: "com.android.foo.key",
11118 public_key: "com.android.foo.avbpubkey",
11119 private_key: "com.android.foo.pem",
11120 }
11121
11122 apex {
11123 name: "com.android.foo",
11124 key: "com.android.foo.key",
11125 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11126 updatable: false,
11127 }
11128
11129 // Prebuilt APEX.
11130
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011131 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011132 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011133 public: {
11134 jars: ["foo.jar"],
11135 },
Spandan Das5be63332023-12-13 00:06:32 +000011136 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011137 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011138 }
11139
11140 prebuilt_bootclasspath_fragment {
11141 name: "foo-bootclasspath-fragment",
11142 contents: ["framework-foo"],
11143 hidden_api: {
11144 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11145 metadata: "my-bootclasspath-fragment/metadata.csv",
11146 index: "my-bootclasspath-fragment/index.csv",
11147 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11148 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11149 },
11150 apex_available: [
11151 "com.android.foo",
11152 ],
11153 }
11154
11155 prebuilt_apex {
11156 name: "com.android.foo",
11157 apex_name: "com.android.foo",
11158 src: "com.android.foo-arm.apex",
11159 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11160 }
11161
11162 // Another Prebuilt ART APEX
11163 prebuilt_apex {
11164 name: "com.android.foo.v2",
11165 apex_name: "com.android.foo", // Used to determine the API domain
11166 src: "com.android.foo-arm.apex",
11167 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11168 }
11169
11170 // APEX contribution modules
11171
11172 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011173 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011174 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011175 contents: ["com.android.foo"],
11176 }
11177
11178 apex_contributions {
11179 name: "foo.prebuilt.contributions",
11180 api_domain: "com.android.foo",
11181 contents: ["prebuilt_com.android.foo"],
11182 }
11183
11184 apex_contributions {
11185 name: "foo.prebuilt.v2.contributions",
11186 api_domain: "com.android.foo",
11187 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011188 }
11189 `
11190
11191 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011192 desc string
11193 selectedApexContributions string
11194 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011195 }{
11196 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011197 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11198 selectedApexContributions: "foo.source.contributions",
11199 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011200 },
11201 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011202 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11203 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011204 expectedBootJar: "out/soong/.intermediates/prebuilt_com.android.foo/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011205 },
11206 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011207 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11208 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011209 expectedBootJar: "out/soong/.intermediates/com.android.foo.v2/android_common_com.android.foo/deapexer/javalib/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011210 },
11211 }
11212
11213 fragment := java.ApexVariantReference{
11214 Apex: proptools.StringPtr("com.android.foo"),
11215 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11216 }
11217
11218 for _, tc := range testCases {
11219 preparer := android.GroupFixturePreparers(
11220 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11221 android.FixtureMergeMockFs(map[string][]byte{
11222 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11223 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011224 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11225 // file creation.
11226 java.FixtureConfigureBootJars("platform:foo"),
11227 android.FixtureModifyMockFS(func(fs android.MockFS) {
11228 fs["platform/Android.bp"] = []byte(`
11229 java_library {
11230 name: "foo",
11231 srcs: ["Test.java"],
11232 compile_dex: true,
11233 }
11234 `)
11235 fs["platform/Test.java"] = nil
11236 }),
11237
Colin Crossa66b4632024-08-08 15:50:47 -070011238 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011239 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011240 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011241 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011242 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11243 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011244 }
11245}
Spandan Das3576e762024-01-03 18:57:03 +000011246
11247// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11248// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11249func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011250 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011251 // for a mainline module family, check that only the flagged soong module is visible to make
11252 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11253 variation := func(moduleName string) string {
11254 ret := "android_common_com.android.foo"
11255 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011256 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011257 }
11258 return ret
11259 }
11260
11261 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11262 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11263
11264 for _, hiddenModuleName := range hiddenModuleNames {
11265 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11266 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11267
11268 }
11269 }
11270
11271 bp := `
11272 apex_key {
11273 name: "com.android.foo.key",
11274 public_key: "com.android.foo.avbpubkey",
11275 private_key: "com.android.foo.pem",
11276 }
11277
11278 // AOSP source apex
11279 apex {
11280 name: "com.android.foo",
11281 key: "com.android.foo.key",
11282 updatable: false,
11283 }
11284
11285 // Google source apex
11286 override_apex {
11287 name: "com.google.android.foo",
11288 base: "com.android.foo",
11289 key: "com.android.foo.key",
11290 }
11291
11292 // Prebuilt Google APEX.
11293
11294 prebuilt_apex {
11295 name: "com.google.android.foo",
11296 apex_name: "com.android.foo",
11297 src: "com.android.foo-arm.apex",
11298 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11299 }
11300
11301 // Another Prebuilt Google APEX
11302 prebuilt_apex {
11303 name: "com.google.android.foo.v2",
11304 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011305 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011306 src: "com.android.foo-arm.apex",
11307 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11308 }
11309
11310 // APEX contribution modules
11311
11312 apex_contributions {
11313 name: "foo.source.contributions",
11314 api_domain: "com.android.foo",
11315 contents: ["com.google.android.foo"],
11316 }
11317
11318 apex_contributions {
11319 name: "foo.prebuilt.contributions",
11320 api_domain: "com.android.foo",
11321 contents: ["prebuilt_com.google.android.foo"],
11322 }
11323
11324 apex_contributions {
11325 name: "foo.prebuilt.v2.contributions",
11326 api_domain: "com.android.foo",
11327 contents: ["prebuilt_com.google.android.foo.v2"],
11328 }
11329
11330 // This is an incompatible module because it selects multiple versions of the same mainline module
11331 apex_contributions {
11332 name: "foo.prebuilt.duplicate.contributions",
11333 api_domain: "com.android.foo",
11334 contents: [
11335 "prebuilt_com.google.android.foo",
11336 "prebuilt_com.google.android.foo.v2",
11337 ],
11338 }
11339 `
11340
11341 testCases := []struct {
11342 desc string
11343 selectedApexContributions string
11344 expectedVisibleModuleName string
11345 expectedHiddenModuleNames []string
11346 expectedError string
11347 }{
11348 {
11349 desc: "Source apex is selected, prebuilts should be hidden from make",
11350 selectedApexContributions: "foo.source.contributions",
11351 expectedVisibleModuleName: "com.google.android.foo",
11352 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11353 },
11354 {
11355 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11356 selectedApexContributions: "foo.prebuilt.contributions",
11357 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11358 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11359 },
11360 {
11361 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11362 selectedApexContributions: "foo.prebuilt.v2.contributions",
11363 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11364 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11365 },
11366 {
11367 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11368 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11369 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11370 },
11371 }
11372
11373 for _, tc := range testCases {
11374 preparer := android.GroupFixturePreparers(
11375 android.FixtureMergeMockFs(map[string][]byte{
11376 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11377 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011378 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011379 )
11380 if tc.expectedError != "" {
11381 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11382 testApex(t, bp, preparer)
11383 return
11384 }
11385 ctx := testApex(t, bp, preparer)
11386
Spandan Das3576e762024-01-03 18:57:03 +000011387 // Check that
11388 // 1. The contents of the selected apex_contributions are visible to make
11389 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11390 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11391 }
11392}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011393
Spandan Das85bd4622024-08-01 00:51:20 +000011394// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11395func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011396 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011397 // for a mainline module family, check that only the flagged soong module is visible to make
11398 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11399 variation := func(moduleName string) string {
11400 ret := "android_common_com.android.adservices"
11401 if moduleName == "com.google.android.foo" {
11402 ret = "android_common_com.google.android.foo_com.google.android.foo"
11403 }
11404 return ret
11405 }
11406
11407 for _, visibleModuleName := range visibleModuleNames {
11408 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11409 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11410 }
11411
11412 for _, hiddenModuleName := range hiddenModuleNames {
11413 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11414 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11415
11416 }
11417 }
11418
11419 bp := `
11420 apex_key {
11421 name: "com.android.adservices.key",
11422 public_key: "com.android.adservices.avbpubkey",
11423 private_key: "com.android.adservices.pem",
11424 }
11425
11426 // AOSP source apex
11427 apex {
11428 name: "com.android.adservices",
11429 key: "com.android.adservices.key",
11430 updatable: false,
11431 }
11432
11433 // Prebuilt Google APEX.
11434
11435 prebuilt_apex {
11436 name: "com.google.android.adservices",
11437 apex_name: "com.android.adservices",
11438 src: "com.android.foo-arm.apex",
11439 }
11440
11441 // Another Prebuilt Google APEX
11442 prebuilt_apex {
11443 name: "com.google.android.adservices.v2",
11444 apex_name: "com.android.adservices",
11445 src: "com.android.foo-arm.apex",
11446 }
11447
11448 // APEX contribution modules
11449
11450
11451 apex_contributions {
11452 name: "adservices.prebuilt.contributions",
11453 api_domain: "com.android.adservices",
11454 contents: ["prebuilt_com.google.android.adservices"],
11455 }
11456
11457 apex_contributions {
11458 name: "adservices.prebuilt.v2.contributions",
11459 api_domain: "com.android.adservices",
11460 contents: ["prebuilt_com.google.android.adservices.v2"],
11461 }
11462 `
11463
11464 testCases := []struct {
11465 desc string
11466 selectedApexContributions string
11467 expectedVisibleModuleNames []string
11468 expectedHiddenModuleNames []string
11469 }{
11470 {
11471 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11472 selectedApexContributions: "",
11473 expectedVisibleModuleNames: []string{"com.android.adservices"},
11474 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11475 },
11476 {
11477 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11478 selectedApexContributions: "adservices.prebuilt.contributions",
11479 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11480 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11481 },
11482 {
11483 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11484 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11485 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11486 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11487 },
11488 }
11489
11490 for _, tc := range testCases {
11491 preparer := android.GroupFixturePreparers(
11492 android.FixtureMergeMockFs(map[string][]byte{
11493 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11494 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011495 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011496 )
11497 ctx := testApex(t, bp, preparer)
11498
11499 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11500 }
11501}
11502
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011503func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011504 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011505 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11506 for _, moduleName := range moduleNames {
11507 ret += fmt.Sprintf(`
11508 aconfig_declarations {
11509 name: "%[1]s",
11510 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011511 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011512 srcs: [
11513 "%[1]s.aconfig",
11514 ],
11515 }
11516 java_aconfig_library {
11517 name: "%[1]s-lib",
11518 aconfig_declarations: "%[1]s",
11519 }
11520 `, moduleName)
11521 }
11522 return ret
11523 }
11524
11525 result := android.GroupFixturePreparers(
11526 prepareForApexTest,
11527 java.PrepareForTestWithJavaSdkLibraryFiles,
11528 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011529 ).RunTestWithBp(t, `
11530 java_library {
11531 name: "baz-java-lib",
11532 static_libs: [
11533 "baz-lib",
11534 ],
11535 }
11536 filegroup {
11537 name: "qux-filegroup",
11538 srcs: [
11539 ":qux-lib{.generated_srcjars}",
11540 ],
11541 }
11542 filegroup {
11543 name: "qux-another-filegroup",
11544 srcs: [
11545 ":qux-filegroup",
11546 ],
11547 }
11548 java_library {
11549 name: "quux-java-lib",
11550 srcs: [
11551 "a.java",
11552 ],
11553 libs: [
11554 "quux-lib",
11555 ],
11556 }
11557 java_sdk_library {
11558 name: "foo",
11559 srcs: [
11560 ":qux-another-filegroup",
11561 ],
11562 api_packages: ["foo"],
11563 system: {
11564 enabled: true,
11565 },
11566 module_lib: {
11567 enabled: true,
11568 },
11569 test: {
11570 enabled: true,
11571 },
11572 static_libs: [
11573 "bar-lib",
11574 ],
11575 libs: [
11576 "baz-java-lib",
11577 "quux-java-lib",
11578 ],
11579 aconfig_declarations: [
11580 "bar",
11581 ],
11582 }
11583 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11584
11585 m := result.ModuleForTests("foo.stubs.source", "android_common")
11586 outDir := "out/soong/.intermediates"
11587
11588 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11589 // textproto files
11590 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11591
11592 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11593 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11594 // to aconfig.
11595 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11596 "passed as an input",
11597 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11598
11599 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11600 // to metalava as classpath. Thus the cache file provided by the associated
11601 // aconfig_declarations module "baz" should be passed to aconfig.
11602 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11603 "java_aconfig_library passed as an input",
11604 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11605
11606 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11607 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11608 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11609 "input",
11610 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11611
11612 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11613 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11614 // aconfig_declarations module "quux" should not be passed to aconfig.
11615 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11616 "depend on java_aconfig_library not passed as an input",
11617 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11618}
Cole Faust7c991b42024-05-15 11:17:55 -070011619
11620func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011621 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011622 ctx := testApex(t, `
11623 apex {
11624 name: "myapex",
11625 key: "myapex.key",
11626 prebuilts: ["myetc", "myetc2"],
11627 min_sdk_version: "29",
11628 }
11629 apex_key {
11630 name: "myapex.key",
11631 public_key: "testkey.avbpubkey",
11632 private_key: "testkey.pem",
11633 }
11634
11635 prebuilt_etc {
11636 name: "myetc",
11637 src: "myprebuilt",
11638 filename: "myfilename",
11639 }
11640 prebuilt_etc {
11641 name: "myetc2",
11642 sub_dir: "mysubdir",
11643 src: "myprebuilt",
11644 filename: "myfilename",
11645 }
11646 `, withFiles(android.MockFS{
11647 "packages/modules/common/build/allowed_deps.txt": nil,
11648 }))
11649
11650 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11651 data := android.AndroidMkDataForTest(t, ctx, ab)
11652 var builder strings.Builder
11653 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11654 androidMk := builder.String()
11655
11656 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11657 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11658}
Spandan Das50801e22024-05-13 18:29:45 +000011659
11660func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011661 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011662 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11663 args := module.Rule("apexRule").Args
11664 optFlags := args["opt_flags"]
11665 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11666 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11667 }
11668 }
11669
11670 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11671 t.Helper()
11672 found := false
11673 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11674 if dep == wantDep {
11675 found = true
11676 }
11677 })
11678 if !found {
11679 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11680 }
11681 }
11682
11683 ctx := testApex(t, `
11684 apex {
11685 name: "com.android.apex30",
11686 min_sdk_version: "30",
11687 key: "apex30.key",
11688 java_libs: ["javalib"],
11689 }
11690
11691 java_library {
11692 name: "javalib",
11693 srcs: ["A.java"],
11694 apex_available: ["com.android.apex30"],
11695 min_sdk_version: "30",
11696 sdk_version: "current",
11697 }
11698
11699 override_apex {
11700 name: "com.mycompany.android.apex30",
11701 base: "com.android.apex30",
11702 }
11703
11704 override_apex {
11705 name: "com.mycompany.android.apex31",
11706 base: "com.android.apex30",
11707 min_sdk_version: "31",
11708 }
11709
11710 apex_key {
11711 name: "apex30.key",
11712 public_key: "testkey.avbpubkey",
11713 private_key: "testkey.pem",
11714 }
11715
11716 `, android.FixtureMergeMockFs(android.MockFS{
11717 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11718 }),
11719 )
11720
11721 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11722 checkMinSdkVersion(t, baseModule, "30")
11723
11724 // Override module, but uses same min_sdk_version
11725 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11726 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11727 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11728 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11729
11730 // Override module, uses different min_sdk_version
11731 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11732 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11733 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11734 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11735}
Spandan Das0b28fa02024-05-28 23:40:17 +000011736
11737func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011738 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011739 context := android.GroupFixturePreparers(
11740 android.PrepareForIntegrationTestWithAndroid,
11741 PrepareForTestWithApexBuildComponents,
11742 android.FixtureMergeMockFs(android.MockFS{
11743 "system/sepolicy/apex/foo-file_contexts": nil,
11744 }),
11745 )
11746 res := context.RunTestWithBp(t, `
11747 apex {
11748 name: "foo",
11749 key: "myapex.key",
11750 apex_available_name: "com.android.foo",
11751 variant_version: "0",
11752 updatable: false,
11753 }
11754 apex_key {
11755 name: "myapex.key",
11756 public_key: "testkey.avbpubkey",
11757 private_key: "testkey.pem",
11758 }
11759 prebuilt_apex {
11760 name: "foo",
11761 src: "foo.apex",
11762 prefer: true,
11763 }
11764 override_apex {
11765 name: "myoverrideapex",
11766 base: "foo",
11767 }
11768 `)
11769
11770 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11771}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011772
11773func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011774 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011775 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`, `
11776 apex {
11777 name: "myapex",
11778 key: "myapex.key",
11779 updatable: true,
11780 min_sdk_version: "current",
11781 }
11782
11783 apex_key {
11784 name: "myapex.key",
11785 public_key: "testkey.avbpubkey",
11786 private_key: "testkey.pem",
11787 }
11788 `)
11789}
Spandan Das2f68f192024-07-22 19:25:50 +000011790
11791func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011792 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011793 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11794 result := android.GroupFixturePreparers(
11795 prepareForApexTest,
11796 android.PrepareForTestWithAndroidMk,
11797 android.PrepareForTestWithMakevars,
11798 android.FixtureMergeMockFs(fs),
11799 ).RunTest(t)
11800
11801 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011802 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011803
11804 installRules := result.InstallMakeRulesForTesting(t)
11805
11806 var installedlibRule *android.InstallMakeRule
11807 for i, rule := range installRules {
11808 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11809 if installedlibRule != nil {
11810 t.Errorf("Duplicate install rules for %s", rule.Target)
11811 }
11812 installedlibRule = &installRules[i]
11813 }
11814 }
11815 if installedlibRule == nil {
11816 t.Errorf("No install rule found for installedlib")
11817 return
11818 }
11819
11820 if expectLibfooOnSystemLib {
11821 android.AssertStringListContains(t,
11822 "installedlib doesn't have install dependency on libfoo impl",
11823 installedlibRule.OrderOnlyDeps,
11824 "out/target/product/test_device/system/lib/libfoo.so")
11825 } else {
11826 android.AssertStringListDoesNotContain(t,
11827 "installedlib has install dependency on libfoo stub",
11828 installedlibRule.Deps,
11829 "out/target/product/test_device/system/lib/libfoo.so")
11830 android.AssertStringListDoesNotContain(t,
11831 "installedlib has order-only install dependency on libfoo stub",
11832 installedlibRule.OrderOnlyDeps,
11833 "out/target/product/test_device/system/lib/libfoo.so")
11834 }
11835 }
11836
11837 prebuiltLibfooBp := []byte(`
11838 cc_prebuilt_library {
11839 name: "libfoo",
11840 prefer: true,
11841 srcs: ["libfoo.so"],
11842 stubs: {
11843 versions: ["1"],
11844 },
11845 apex_available: ["apexfoo"],
11846 }
11847 `)
11848
11849 apexfooBp := []byte(`
11850 apex {
11851 name: "apexfoo",
11852 key: "apexfoo.key",
11853 native_shared_libs: ["libfoo"],
11854 updatable: false,
11855 compile_multilib: "both",
11856 }
11857 apex_key {
11858 name: "apexfoo.key",
11859 public_key: "testkey.avbpubkey",
11860 private_key: "testkey.pem",
11861 }
11862 `)
11863
11864 installedlibBp := []byte(`
11865 cc_library {
11866 name: "installedlib",
11867 shared_libs: ["libfoo"],
11868 }
11869 `)
11870
11871 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011872 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011873 testFunc(
11874 t,
11875 /*expectLibfooOnSystemLib=*/ false,
11876 android.MockFS{
11877 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11878 "apexfoo/Android.bp": apexfooBp,
11879 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11880 "Android.bp": installedlibBp,
11881 },
11882 )
11883 })
11884
11885 disabledSourceLibfooBp := []byte(`
11886 cc_library {
11887 name: "libfoo",
11888 enabled: false,
11889 stubs: {
11890 versions: ["1"],
11891 },
11892 apex_available: ["apexfoo"],
11893 }
11894 `)
11895
11896 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011897 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011898 testFunc(
11899 t,
11900 /*expectLibfooOnSystemLib=*/ false,
11901 android.MockFS{
11902 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11903 "impl/Android.bp": disabledSourceLibfooBp,
11904 "apexfoo/Android.bp": apexfooBp,
11905 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11906 "Android.bp": installedlibBp,
11907 },
11908 )
11909 })
11910}
Jihoon Kange246bb72024-09-18 22:26:22 +000011911
11912func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011913 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011914 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11915 // in libs of android_app and java_library does not lead to class loader context device/host
11916 // path mismatch errors.
11917 android.GroupFixturePreparers(
11918 prepareForApexTest,
11919 android.PrepareForIntegrationTestWithAndroid,
11920 PrepareForTestWithApexBuildComponents,
11921 android.FixtureModifyEnv(func(env map[string]string) {
11922 env["DISABLE_CONTAINER_CHECK"] = "true"
11923 }),
11924 withFiles(filesForSdkLibrary),
11925 android.FixtureMergeMockFs(android.MockFS{
11926 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11927 }),
11928 ).RunTestWithBp(t, `
11929 apex {
11930 name: "com.android.foo30",
11931 key: "myapex.key",
11932 updatable: true,
11933 bootclasspath_fragments: [
11934 "foo-bootclasspath-fragment",
11935 ],
11936 java_libs: [
11937 "bar",
11938 ],
11939 apps: [
11940 "bar-app",
11941 ],
11942 min_sdk_version: "30",
11943 }
11944 apex_key {
11945 name: "myapex.key",
11946 public_key: "testkey.avbpubkey",
11947 private_key: "testkey.pem",
11948 }
11949 bootclasspath_fragment {
11950 name: "foo-bootclasspath-fragment",
11951 contents: [
11952 "framework-foo",
11953 ],
11954 apex_available: [
11955 "com.android.foo30",
11956 ],
11957 hidden_api: {
11958 split_packages: ["*"]
11959 },
11960 }
11961
11962 java_sdk_library {
11963 name: "framework-foo",
11964 srcs: [
11965 "A.java"
11966 ],
11967 unsafe_ignore_missing_latest_api: true,
11968 apex_available: [
11969 "com.android.foo30",
11970 ],
11971 compile_dex: true,
11972 sdk_version: "core_current",
11973 shared_library: false,
11974 }
11975
11976 java_library {
11977 name: "bar",
11978 srcs: [
11979 "A.java"
11980 ],
11981 libs: [
11982 "framework-foo.impl",
11983 ],
11984 apex_available: [
11985 "com.android.foo30",
11986 ],
11987 sdk_version: "core_current",
11988 }
11989
11990 java_library {
11991 name: "baz",
11992 srcs: [
11993 "A.java"
11994 ],
11995 libs: [
11996 "bar",
11997 ],
11998 sdk_version: "core_current",
11999 }
12000
12001 android_app {
12002 name: "bar-app",
12003 srcs: [
12004 "A.java"
12005 ],
12006 libs: [
12007 "baz",
12008 "framework-foo.impl",
12009 ],
12010 apex_available: [
12011 "com.android.foo30",
12012 ],
12013 sdk_version: "core_current",
12014 min_sdk_version: "30",
12015 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012016 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012017 }
12018 `)
12019}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012020
12021// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12022func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012023 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012024 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12025 apex {
12026 name: "myapex",
12027 key: "myapex.key",
12028 systemserverclasspath_fragments: [
12029 "mysystemserverclasspathfragment",
12030 ],
12031 min_sdk_version: "29",
12032 updatable: true,
12033 system_ext_specific: true,
12034 }
12035
12036 apex_key {
12037 name: "myapex.key",
12038 public_key: "testkey.avbpubkey",
12039 private_key: "testkey.pem",
12040 }
12041
12042 java_library {
12043 name: "foo",
12044 srcs: ["b.java"],
12045 min_sdk_version: "29",
12046 installable: true,
12047 apex_available: [
12048 "myapex",
12049 ],
12050 sdk_version: "current",
12051 }
12052
12053 systemserverclasspath_fragment {
12054 name: "mysystemserverclasspathfragment",
12055 contents: [
12056 "foo",
12057 ],
12058 apex_available: [
12059 "myapex",
12060 ],
12061 }
12062 `,
12063 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12064 )
12065}
Spandan Das72d86c62024-10-15 19:27:41 +000012066
12067// partitions should not package the artifacts that are included inside the apex.
12068func TestFilesystemWithApexDeps(t *testing.T) {
12069 t.Parallel()
12070 result := testApex(t, `
12071 android_filesystem {
12072 name: "myfilesystem",
12073 deps: ["myapex"],
12074 }
12075 apex {
12076 name: "myapex",
12077 key: "myapex.key",
12078 binaries: ["binfoo"],
12079 native_shared_libs: ["libfoo"],
12080 apps: ["appfoo"],
12081 updatable: false,
12082 }
12083 apex_key {
12084 name: "myapex.key",
12085 }
12086 cc_binary {
12087 name: "binfoo",
12088 apex_available: ["myapex"],
12089 }
12090 cc_library {
12091 name: "libfoo",
12092 apex_available: ["myapex"],
12093 }
12094 android_app {
12095 name: "appfoo",
12096 sdk_version: "current",
12097 apex_available: ["myapex"],
12098 }
12099 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12100
12101 partition := result.ModuleForTests("myfilesystem", "android_common")
12102 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12103 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12104}