blob: b50ffe6ffff486a0e834cb0be27a8e7899a3cc04 [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"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700396 rustlibs: ["libfoo.transitive.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
Colin Cross49f1a8f2024-10-23 13:04:15 -0700423 rust_library_dylib {
424 name: "libfoo.transitive.dylib.rust",
425 srcs: ["foo.rs"],
426 crate_name: "foo",
427 apex_available: ["myapex"],
428 }
429
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900430 rust_ffi_shared {
431 name: "libfoo.ffi",
432 srcs: ["foo.rs"],
433 crate_name: "foo",
434 apex_available: ["myapex"],
435 }
436
437 rust_ffi_shared {
438 name: "libbar.ffi",
439 srcs: ["foo.rs"],
440 crate_name: "bar",
441 apex_available: ["myapex"],
442 }
443
Paul Duffindddd5462020-04-07 15:25:44 +0100444 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900445 name: "mylib2",
446 srcs: ["mylib.cpp"],
447 system_shared_libs: [],
448 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900449 static_libs: ["libstatic"],
450 // TODO: remove //apex_available:platform
451 apex_available: [
452 "//apex_available:platform",
453 "myapex",
454 ],
455 }
456
Paul Duffindddd5462020-04-07 15:25:44 +0100457 cc_prebuilt_library_shared {
458 name: "mylib2",
459 srcs: ["prebuilt.so"],
460 // TODO: remove //apex_available:platform
461 apex_available: [
462 "//apex_available:platform",
463 "myapex",
464 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700465 }
Paul Duffindddd5462020-04-07 15:25:44 +0100466
Jiyong Park9918e1a2020-03-17 19:16:40 +0900467 cc_library_static {
468 name: "libstatic",
469 srcs: ["mylib.cpp"],
470 system_shared_libs: [],
471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000472 // TODO: remove //apex_available:platform
473 apex_available: [
474 "//apex_available:platform",
475 "myapex",
476 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900477 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900478
479 java_library {
480 name: "myjar",
481 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900482 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900483 sdk_version: "none",
484 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900485 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900486 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000487 // TODO: remove //apex_available:platform
488 apex_available: [
489 "//apex_available:platform",
490 "myapex",
491 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900492 }
493
Jiyong Park77acec62020-06-01 21:39:15 +0900494 dex_import {
495 name: "myjar_dex",
496 jars: ["prebuilt.jar"],
497 apex_available: [
498 "//apex_available:platform",
499 "myapex",
500 ],
501 }
502
Jiyong Park7f7766d2019-07-25 22:02:35 +0900503 java_library {
504 name: "myotherjar",
505 srcs: ["foo/bar/MyClass.java"],
506 sdk_version: "none",
507 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900508 // TODO: remove //apex_available:platform
509 apex_available: [
510 "//apex_available:platform",
511 "myapex",
512 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900513 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900514
515 java_library {
516 name: "mysharedjar",
517 srcs: ["foo/bar/MyClass.java"],
518 sdk_version: "none",
519 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900520 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900521 `)
522
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900525 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900526 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700527 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900528 var builder strings.Builder
529 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
530
531 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000532 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900533 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
534
Jiyong Park42cca6c2019-04-01 11:15:50 +0900535 optFlags := apexRule.Args["opt_flags"]
536 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700537 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900538 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900539
Jiyong Park25fc6a92018-11-18 18:02:45 +0900540 copyCmds := apexRule.Args["copy_commands"]
541
542 // Ensure that main rule creates an output
543 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
544
545 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700546 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
547 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
548 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900549 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900550 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900551
552 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700553 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
554 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900555 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
556 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700557 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900558 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900559 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900560
561 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800562 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
563 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900564 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900565 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900566 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700567 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900568 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
569 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900570 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900571 // .. but not for java libs
572 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900573 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800574
Colin Cross7113d202019-11-20 16:39:12 -0800575 // Ensure that the platform variant ends with _shared or _common
576 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
577 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900578 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
579 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900580 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
581
582 // Ensure that dynamic dependency to java libs are not included
583 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800584
585 // Ensure that all symlinks are present.
586 found_foo_link_64 := false
587 found_foo := false
588 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900589 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800590 if strings.HasSuffix(cmd, "bin/foo") {
591 found_foo = true
592 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
593 found_foo_link_64 = true
594 }
595 }
596 }
597 good := found_foo && found_foo_link_64
598 if !good {
599 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
600 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900601
Colin Crossf61d03d2023-11-02 16:56:39 -0700602 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
603 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100604 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100605 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
606 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
607 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100608
Colin Crossf61d03d2023-11-02 16:56:39 -0700609 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
610 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100611 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100612 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
613 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
614 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800615}
616
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700618 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800619 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900620 apex_defaults {
621 name: "myapex-defaults",
622 key: "myapex.key",
623 prebuilts: ["myetc"],
624 native_shared_libs: ["mylib"],
625 java_libs: ["myjar"],
626 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900627 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800628 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000629 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900630 }
631
632 prebuilt_etc {
633 name: "myetc",
634 src: "myprebuilt",
635 }
636
637 apex {
638 name: "myapex",
639 defaults: ["myapex-defaults"],
640 }
641
642 apex_key {
643 name: "myapex.key",
644 public_key: "testkey.avbpubkey",
645 private_key: "testkey.pem",
646 }
647
648 cc_library {
649 name: "mylib",
650 system_shared_libs: [],
651 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000652 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900653 }
654
655 java_library {
656 name: "myjar",
657 srcs: ["foo/bar/MyClass.java"],
658 sdk_version: "none",
659 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000660 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900661 }
662
663 android_app {
664 name: "AppFoo",
665 srcs: ["foo/bar/MyClass.java"],
666 sdk_version: "none",
667 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000668 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900669 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900670
671 runtime_resource_overlay {
672 name: "rro",
673 theme: "blue",
674 }
675
markchien2f59ec92020-09-02 16:23:38 +0800676 bpf {
677 name: "bpf",
678 srcs: ["bpf.c", "bpf2.c"],
679 }
680
Ken Chenfad7f9d2021-11-10 22:02:57 +0800681 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800682 name: "netdTest",
683 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800684 sub_dir: "netd",
685 }
686
Jooyung Hanf21c7972019-12-16 22:32:06 +0900687 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900688 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900689 "etc/myetc",
690 "javalib/myjar.jar",
691 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000692 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900693 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800694 "etc/bpf/bpf.o",
695 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800696 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900697 })
698}
699
Jooyung Han01a3ee22019-11-02 02:52:25 +0900700func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700701 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800702 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900703 apex {
704 name: "myapex",
705 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000706 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900707 }
708
709 apex_key {
710 name: "myapex.key",
711 public_key: "testkey.avbpubkey",
712 private_key: "testkey.pem",
713 }
714 `)
715
Jooyung Hana0503a52023-08-23 13:12:50 +0900716 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900717 args := module.Rule("apexRule").Args
718 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
719 t.Error("manifest should be apex_manifest.pb, but " + manifest)
720 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900721}
722
Liz Kammer4854a7d2021-05-27 14:28:27 -0400723func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700724 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400725 ctx := testApex(t, `
726 apex_defaults {
727 name: "my_defaults",
728 key: "myapex.key",
729 product_specific: true,
730 file_contexts: ":my-file-contexts",
731 updatable: false,
732 }
733 apex {
734 name: "myapex_30",
735 min_sdk_version: "30",
736 defaults: ["my_defaults"],
737 }
738
739 apex {
740 name: "myapex_current",
741 min_sdk_version: "current",
742 defaults: ["my_defaults"],
743 }
744
745 apex {
746 name: "myapex_none",
747 defaults: ["my_defaults"],
748 }
749
750 apex_key {
751 name: "myapex.key",
752 public_key: "testkey.avbpubkey",
753 private_key: "testkey.pem",
754 }
755
756 filegroup {
757 name: "my-file-contexts",
758 srcs: ["product_specific_file_contexts"],
759 }
760 `, withFiles(map[string][]byte{
761 "product_specific_file_contexts": nil,
762 }), android.FixtureModifyProductVariables(
763 func(variables android.FixtureProductVariables) {
764 variables.Unbundled_build = proptools.BoolPtr(true)
765 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
766 }), android.FixtureMergeEnv(map[string]string{
767 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
768 }))
769
770 testCases := []struct {
771 module string
772 minSdkVersion string
773 }{
774 {
775 module: "myapex_30",
776 minSdkVersion: "30",
777 },
778 {
779 module: "myapex_current",
780 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
781 },
782 {
783 module: "myapex_none",
784 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
785 },
786 }
787 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900788 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400789 args := module.Rule("apexRule").Args
790 optFlags := args["opt_flags"]
791 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
792 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
793 }
794 }
795}
796
Jihoon Kang842b9992024-02-08 01:41:51 +0000797func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700798 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000799 ctx := testApex(t, `
800 apex_defaults {
801 name: "my_defaults",
802 key: "myapex.key",
803 product_specific: true,
804 file_contexts: ":my-file-contexts",
805 updatable: false,
806 }
807 apex {
808 name: "myapex_30",
809 min_sdk_version: "30",
810 defaults: ["my_defaults"],
811 }
812
813 apex {
814 name: "myapex_current",
815 min_sdk_version: "current",
816 defaults: ["my_defaults"],
817 }
818
819 apex {
820 name: "myapex_none",
821 defaults: ["my_defaults"],
822 }
823
824 apex_key {
825 name: "myapex.key",
826 public_key: "testkey.avbpubkey",
827 private_key: "testkey.pem",
828 }
829
830 filegroup {
831 name: "my-file-contexts",
832 srcs: ["product_specific_file_contexts"],
833 }
834 `, withFiles(map[string][]byte{
835 "product_specific_file_contexts": nil,
836 }), android.FixtureModifyProductVariables(
837 func(variables android.FixtureProductVariables) {
838 variables.Unbundled_build = proptools.BoolPtr(true)
839 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
840 }), android.FixtureMergeEnv(map[string]string{
841 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
842 }))
843
844 testCases := []struct {
845 module string
846 minSdkVersion string
847 }{
848 {
849 module: "myapex_30",
850 minSdkVersion: "30",
851 },
852 {
853 module: "myapex_current",
854 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
855 },
856 {
857 module: "myapex_none",
858 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
859 },
860 }
861 for _, tc := range testCases {
862 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
863 args := module.Rule("apexRule").Args
864 optFlags := args["opt_flags"]
865 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
866 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
867 }
868 }
869}
870
Jooyung Hanaf730952023-02-28 14:13:38 +0900871func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700872 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900873 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900874 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900875 if vendor {
876 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900877 }
878 ctx := testApex(t, `
879 apex {
880 name: "myapex",
881 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900882 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900883 `+prop+`
884 }
885
886 apex_key {
887 name: "myapex.key",
888 public_key: "testkey.avbpubkey",
889 private_key: "testkey.pem",
890 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900891 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900892
Jooyung Hana0503a52023-08-23 13:12:50 +0900893 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900894 if vendor {
895 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
896 rule.RuleParams.Command,
897 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900898 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900899 android.AssertStringDoesContain(t, "should force-label as system_file",
900 rule.RuleParams.Command,
901 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900902 }
903 }
904}
905
Jiyong Park25fc6a92018-11-18 18:02:45 +0900906func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700907 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800908 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900909 apex {
910 name: "myapex",
911 key: "myapex.key",
912 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900913 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000914 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 }
916
917 apex_key {
918 name: "myapex.key",
919 public_key: "testkey.avbpubkey",
920 private_key: "testkey.pem",
921 }
922
923 cc_library {
924 name: "mylib",
925 srcs: ["mylib.cpp"],
Spandan Das357ffcc2024-07-24 18:07:48 +0000926 shared_libs: ["mylib2", "mylib3", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 system_shared_libs: [],
928 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000929 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900930 }
931
932 cc_library {
933 name: "mylib2",
934 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900935 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900936 system_shared_libs: [],
937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["1", "2", "3"],
941 },
942 }
943
944 cc_library {
945 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900946 srcs: ["mylib.cpp"],
947 shared_libs: ["mylib4"],
948 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900949 stl: "none",
950 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000951 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900952 versions: ["10", "11", "12"],
953 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000954 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900955 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900956
957 cc_library {
958 name: "mylib4",
959 srcs: ["mylib.cpp"],
960 system_shared_libs: [],
961 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000962 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900963 }
Jiyong Park105dc322021-06-11 17:22:09 +0900964
Spandan Das357ffcc2024-07-24 18:07:48 +0000965 cc_prebuilt_library_shared {
966 name: "my_prebuilt_platform_lib",
967 stubs: {
968 symbol_file: "my_prebuilt_platform_lib.map.txt",
969 versions: ["1", "2", "3"],
970 },
971 srcs: ["foo.so"],
972 }
973
974 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
975 cc_prebuilt_library_shared {
976 name: "my_prebuilt_platform_stub_only_lib",
977 stubs: {
978 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
979 versions: ["1", "2", "3"],
980 }
981 }
982
Jiyong Park105dc322021-06-11 17:22:09 +0900983 rust_binary {
984 name: "foo.rust",
985 srcs: ["foo.rs"],
986 shared_libs: ["libfoo.shared_from_rust"],
987 prefer_rlib: true,
988 apex_available: ["myapex"],
989 }
990
991 cc_library_shared {
992 name: "libfoo.shared_from_rust",
993 srcs: ["mylib.cpp"],
994 system_shared_libs: [],
995 stl: "none",
996 stubs: {
997 versions: ["10", "11", "12"],
998 },
999 }
1000
Jiyong Park25fc6a92018-11-18 18:02:45 +09001001 `)
1002
Jooyung Hana0503a52023-08-23 13:12:50 +09001003 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004 copyCmds := apexRule.Args["copy_commands"]
1005
1006 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001007 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001008
1009 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001010 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001011
1012 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001013 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001014
Colin Crossaede88c2020-08-11 12:17:01 -07001015 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001016
1017 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001018 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001019 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001020 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001021
1022 // 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 -07001023 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001024 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001025 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001026
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001027 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1028 // is replaced by sharing of "cFlags" in cc/builder.go.
1029 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1030 // module variable representing "cflags". So it was not detected by ensureNotContains.
1031 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1032 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1033 // including the original cflags's "-include mylib.h".
1034 //
Jiyong Park64379952018-12-13 18:37:29 +09001035 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001036 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1037 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001038
Jiyong Park85cc35a2022-07-17 11:30:47 +09001039 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1040 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1041 // Ensure that genstub for apex-provided lib is invoked with --apex
1042 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001043
Jooyung Hana0503a52023-08-23 13:12:50 +09001044 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001045 "lib64/mylib.so",
1046 "lib64/mylib3.so",
1047 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001048 "bin/foo.rust",
1049 "lib64/libc++.so", // by the implicit dependency from foo.rust
1050 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001051 })
Jiyong Park105dc322021-06-11 17:22:09 +09001052
1053 // Ensure that stub dependency from a rust module is not included
1054 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1055 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001056 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001057 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1058 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001059
Jooyung Hana0503a52023-08-23 13:12:50 +09001060 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001061 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001062
1063 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1064 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1065 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1066 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1067 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1068 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1069
1070 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1071 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1072 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1073 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1074 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1075 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 +09001076}
1077
Jooyung Han20348752023-12-05 15:23:56 +09001078func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001079 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001080 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1081 apex {
1082 name: "myapex",
1083 key: "myapex.key",
1084 vendor: true,
1085 updatable: false,
1086 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1087 }
1088
1089 apex_key {
1090 name: "myapex.key",
1091 public_key: "testkey.avbpubkey",
1092 private_key: "testkey.pem",
1093 }
1094
1095 cc_library {
1096 name: "libbar",
1097 srcs: ["mylib.cpp"],
1098 llndk: {
1099 symbol_file: "libbar.map.txt",
1100 }
1101 }
1102 `)
1103}
1104
Jiyong Park1bc84122021-06-22 20:23:05 +09001105func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001106 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001107 ctx := testApex(t, `
1108 apex {
1109 name: "myapex",
1110 key: "myapex.key",
1111 native_shared_libs: ["mylib"],
1112 binaries: ["foo.rust"],
1113 updatable: false,
1114 platform_apis: true,
1115 }
1116
1117 apex_key {
1118 name: "myapex.key",
1119 public_key: "testkey.avbpubkey",
1120 private_key: "testkey.pem",
1121 }
1122
1123 cc_library {
1124 name: "mylib",
1125 srcs: ["mylib.cpp"],
1126 shared_libs: ["mylib2"],
1127 system_shared_libs: [],
1128 stl: "none",
1129 apex_available: [ "myapex" ],
1130 }
1131
1132 cc_library {
1133 name: "mylib2",
1134 srcs: ["mylib.cpp"],
1135 cflags: ["-include mylib.h"],
1136 system_shared_libs: [],
1137 stl: "none",
1138 stubs: {
1139 versions: ["1", "2", "3"],
1140 },
1141 }
1142
1143 rust_binary {
1144 name: "foo.rust",
1145 srcs: ["foo.rs"],
1146 shared_libs: ["libfoo.shared_from_rust"],
1147 prefer_rlib: true,
1148 apex_available: ["myapex"],
1149 }
1150
1151 cc_library_shared {
1152 name: "libfoo.shared_from_rust",
1153 srcs: ["mylib.cpp"],
1154 system_shared_libs: [],
1155 stl: "none",
1156 stubs: {
1157 versions: ["10", "11", "12"],
1158 },
1159 }
1160 `)
1161
Jooyung Hana0503a52023-08-23 13:12:50 +09001162 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 copyCmds := apexRule.Args["copy_commands"]
1164
1165 // Ensure that indirect stubs dep is not included
1166 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1167 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1168
1169 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1170 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001171 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001172 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1173 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001174 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001175 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1176 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1177}
1178
Colin Cross7812fd32020-09-25 12:35:10 -07001179func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001181 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001182 apex {
1183 name: "myapex",
1184 key: "myapex.key",
1185 native_shared_libs: ["mylib", "mylib3"],
1186 min_sdk_version: "29",
1187 }
1188
1189 apex_key {
1190 name: "myapex.key",
1191 public_key: "testkey.avbpubkey",
1192 private_key: "testkey.pem",
1193 }
1194
1195 cc_library {
1196 name: "mylib",
1197 srcs: ["mylib.cpp"],
1198 shared_libs: ["mylib2", "mylib3"],
1199 system_shared_libs: [],
1200 stl: "none",
1201 apex_available: [ "myapex" ],
1202 min_sdk_version: "28",
1203 }
1204
1205 cc_library {
1206 name: "mylib2",
1207 srcs: ["mylib.cpp"],
1208 cflags: ["-include mylib.h"],
1209 system_shared_libs: [],
1210 stl: "none",
1211 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001212 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001213 versions: ["28", "29", "30", "current"],
1214 },
1215 min_sdk_version: "28",
1216 }
1217
1218 cc_library {
1219 name: "mylib3",
1220 srcs: ["mylib.cpp"],
1221 shared_libs: ["mylib4"],
1222 system_shared_libs: [],
1223 stl: "none",
1224 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001225 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001226 versions: ["28", "29", "30", "current"],
1227 },
1228 apex_available: [ "myapex" ],
1229 min_sdk_version: "28",
1230 }
1231
1232 cc_library {
1233 name: "mylib4",
1234 srcs: ["mylib.cpp"],
1235 system_shared_libs: [],
1236 stl: "none",
1237 apex_available: [ "myapex" ],
1238 min_sdk_version: "28",
1239 }
1240 `)
1241
Jooyung Hana0503a52023-08-23 13:12:50 +09001242 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001243 copyCmds := apexRule.Args["copy_commands"]
1244
1245 // Ensure that direct non-stubs dep is always included
1246 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1247
1248 // Ensure that indirect stubs dep is not included
1249 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1250
1251 // Ensure that direct stubs dep is included
1252 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1253
1254 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1255
Jiyong Park55549df2021-02-26 23:57:23 +09001256 // Ensure that mylib is linking with the latest version of stub for mylib2
1257 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001258 // ... and not linking to the non-stub (impl) variant of mylib2
1259 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1260
1261 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
1262 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1263 // .. and not linking to the stubs variant of mylib3
1264 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1265
1266 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001267 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001268 ensureNotContains(t, mylib2Cflags, "-include ")
1269
Jiyong Park85cc35a2022-07-17 11:30:47 +09001270 // Ensure that genstub is invoked with --systemapi
1271 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001272
Jooyung Hana0503a52023-08-23 13:12:50 +09001273 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001274 "lib64/mylib.so",
1275 "lib64/mylib3.so",
1276 "lib64/mylib4.so",
1277 })
1278}
1279
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001280func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1281 t.Parallel()
1282 // myapex (Z)
1283 // mylib -----------------.
1284 // |
1285 // otherapex (29) |
1286 // libstub's versions: 29 Z current
1287 // |
1288 // <platform> |
1289 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001290 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001291 apex {
1292 name: "myapex",
1293 key: "myapex.key",
1294 native_shared_libs: ["mylib"],
1295 min_sdk_version: "Z", // non-final
1296 }
1297
1298 cc_library {
1299 name: "mylib",
1300 srcs: ["mylib.cpp"],
1301 shared_libs: ["libstub"],
1302 apex_available: ["myapex"],
1303 min_sdk_version: "Z",
1304 }
1305
1306 apex_key {
1307 name: "myapex.key",
1308 public_key: "testkey.avbpubkey",
1309 private_key: "testkey.pem",
1310 }
1311
1312 apex {
1313 name: "otherapex",
1314 key: "myapex.key",
1315 native_shared_libs: ["libstub"],
1316 min_sdk_version: "29",
1317 }
1318
1319 cc_library {
1320 name: "libstub",
1321 srcs: ["mylib.cpp"],
1322 stubs: {
1323 versions: ["29", "Z", "current"],
1324 },
1325 apex_available: ["otherapex"],
1326 min_sdk_version: "29",
1327 }
1328
1329 // platform module depending on libstub from otherapex should use the latest stub("current")
1330 cc_library {
1331 name: "libplatform",
1332 srcs: ["mylib.cpp"],
1333 shared_libs: ["libstub"],
1334 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001335 `,
1336 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1337 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1338 variables.Platform_sdk_final = proptools.BoolPtr(false)
1339 variables.Platform_version_active_codenames = []string{"Z"}
1340 }),
1341 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001342
Jiyong Park55549df2021-02-26 23:57:23 +09001343 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001344 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001345 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001346 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001347 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001348
1349 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1350 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1351 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1352 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1353 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1354}
1355
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001357 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001358 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001359 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001360 name: "myapex2",
1361 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001362 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001363 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001364 }
1365
1366 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001367 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 public_key: "testkey.avbpubkey",
1369 private_key: "testkey.pem",
1370 }
1371
1372 cc_library {
1373 name: "mylib",
1374 srcs: ["mylib.cpp"],
1375 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001376 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001377 system_shared_libs: [],
1378 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001379 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001380 }
1381
1382 cc_library {
1383 name: "libfoo",
1384 srcs: ["mylib.cpp"],
1385 shared_libs: ["libbar"],
1386 system_shared_libs: [],
1387 stl: "none",
1388 stubs: {
1389 versions: ["10", "20", "30"],
1390 },
1391 }
1392
1393 cc_library {
1394 name: "libbar",
1395 srcs: ["mylib.cpp"],
1396 system_shared_libs: [],
1397 stl: "none",
1398 }
1399
Jiyong Park678c8812020-02-07 17:25:49 +09001400 cc_library_static {
1401 name: "libbaz",
1402 srcs: ["mylib.cpp"],
1403 system_shared_libs: [],
1404 stl: "none",
1405 apex_available: [ "myapex2" ],
1406 }
1407
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001408 `)
1409
Jooyung Hana0503a52023-08-23 13:12:50 +09001410 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411 copyCmds := apexRule.Args["copy_commands"]
1412
1413 // Ensure that direct non-stubs dep is always included
1414 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1415
1416 // Ensure that indirect stubs dep is not included
1417 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1418
1419 // Ensure that dependency of stubs is not included
1420 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1421
Colin Crossaede88c2020-08-11 12:17:01 -07001422 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001423
1424 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001425 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001426 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001427 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001428
Jiyong Park3ff16992019-12-27 14:11:47 +09001429 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001430
1431 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1432 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001433
Colin Crossf61d03d2023-11-02 16:56:39 -07001434 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1435 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001436 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001437
Colin Crossf61d03d2023-11-02 16:56:39 -07001438 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1439 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001440 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001441}
1442
Jooyung Hand3639552019-08-09 12:57:43 +09001443func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001444 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001445 /*
1446 myapex
1447 |
1448 v (runtime_libs)
1449 mylib ------+------> libfoo [provides stub]
1450 |
1451 `------> libbar
1452 */
Colin Cross1c460562021-02-16 17:55:47 -08001453 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001454 apex {
1455 name: "myapex",
1456 key: "myapex.key",
1457 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001458 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001459 }
1460
1461 apex_key {
1462 name: "myapex.key",
1463 public_key: "testkey.avbpubkey",
1464 private_key: "testkey.pem",
1465 }
1466
1467 cc_library {
1468 name: "mylib",
1469 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001470 static_libs: ["libstatic"],
1471 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001472 runtime_libs: ["libfoo", "libbar"],
1473 system_shared_libs: [],
1474 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001475 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001476 }
1477
1478 cc_library {
1479 name: "libfoo",
1480 srcs: ["mylib.cpp"],
1481 system_shared_libs: [],
1482 stl: "none",
1483 stubs: {
1484 versions: ["10", "20", "30"],
1485 },
1486 }
1487
1488 cc_library {
1489 name: "libbar",
1490 srcs: ["mylib.cpp"],
1491 system_shared_libs: [],
1492 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001493 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001494 }
1495
Liz Kammer5f108fa2023-05-11 14:33:17 -04001496 cc_library {
1497 name: "libstatic",
1498 srcs: ["mylib.cpp"],
1499 system_shared_libs: [],
1500 stl: "none",
1501 apex_available: [ "myapex" ],
1502 runtime_libs: ["libstatic_to_runtime"],
1503 }
1504
1505 cc_library {
1506 name: "libshared",
1507 srcs: ["mylib.cpp"],
1508 system_shared_libs: [],
1509 stl: "none",
1510 apex_available: [ "myapex" ],
1511 runtime_libs: ["libshared_to_runtime"],
1512 }
1513
1514 cc_library {
1515 name: "libstatic_to_runtime",
1516 srcs: ["mylib.cpp"],
1517 system_shared_libs: [],
1518 stl: "none",
1519 apex_available: [ "myapex" ],
1520 }
1521
1522 cc_library {
1523 name: "libshared_to_runtime",
1524 srcs: ["mylib.cpp"],
1525 system_shared_libs: [],
1526 stl: "none",
1527 apex_available: [ "myapex" ],
1528 }
Jooyung Hand3639552019-08-09 12:57:43 +09001529 `)
1530
Jooyung Hana0503a52023-08-23 13:12:50 +09001531 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001532 copyCmds := apexRule.Args["copy_commands"]
1533
1534 // Ensure that direct non-stubs dep is always included
1535 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1536
1537 // Ensure that indirect stubs dep is not included
1538 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1539
1540 // Ensure that runtime_libs dep in included
1541 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001542 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1543 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1544
1545 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001546
Jooyung Hana0503a52023-08-23 13:12:50 +09001547 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001548 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1549 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001550}
1551
Paul Duffina02cae32021-03-09 01:44:06 +00001552var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1553 cc.PrepareForTestWithCcBuildComponents,
1554 PrepareForTestWithApexBuildComponents,
1555 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001556 apex {
1557 name: "com.android.runtime",
1558 key: "com.android.runtime.key",
1559 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001560 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001561 }
1562
1563 apex_key {
1564 name: "com.android.runtime.key",
1565 public_key: "testkey.avbpubkey",
1566 private_key: "testkey.pem",
1567 }
Paul Duffina02cae32021-03-09 01:44:06 +00001568 `),
1569 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1570)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001571
Paul Duffina02cae32021-03-09 01:44:06 +00001572func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001573 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001574 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001575 cc_library {
1576 name: "libc",
1577 no_libcrt: true,
1578 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001579 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 stl: "none",
1581 system_shared_libs: [],
1582 stubs: { versions: ["1"] },
1583 apex_available: ["com.android.runtime"],
1584
1585 sanitize: {
1586 hwaddress: true,
1587 }
1588 }
1589
1590 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001591 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001592 no_libcrt: true,
1593 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001594 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001595 stl: "none",
1596 system_shared_libs: [],
1597 srcs: [""],
1598 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001599 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600
1601 sanitize: {
1602 never: true,
1603 },
Spandan Das4de7b492023-05-05 21:13:01 +00001604 apex_available: [
1605 "//apex_available:anyapex",
1606 "//apex_available:platform",
1607 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001608 } `)
1609 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001610
Jooyung Hana0503a52023-08-23 13:12:50 +09001611 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001612 "lib64/bionic/libc.so",
1613 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1614 })
1615
Colin Cross4c4c1be2022-02-10 11:41:18 -08001616 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001617
1618 installed := hwasan.Description("install libclang_rt.hwasan")
1619 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1620
1621 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1622 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1623 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1624}
1625
1626func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001627 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001628 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001629 prepareForTestOfRuntimeApexWithHwasan,
1630 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1631 variables.SanitizeDevice = []string{"hwaddress"}
1632 }),
1633 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001634 cc_library {
1635 name: "libc",
1636 no_libcrt: true,
1637 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001638 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001639 stl: "none",
1640 system_shared_libs: [],
1641 stubs: { versions: ["1"] },
1642 apex_available: ["com.android.runtime"],
1643 }
1644
1645 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001646 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001647 no_libcrt: true,
1648 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001649 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001650 stl: "none",
1651 system_shared_libs: [],
1652 srcs: [""],
1653 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001654 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001655
1656 sanitize: {
1657 never: true,
1658 },
Spandan Das4de7b492023-05-05 21:13:01 +00001659 apex_available: [
1660 "//apex_available:anyapex",
1661 "//apex_available:platform",
1662 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001663 }
Paul Duffina02cae32021-03-09 01:44:06 +00001664 `)
1665 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001666
Jooyung Hana0503a52023-08-23 13:12:50 +09001667 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001668 "lib64/bionic/libc.so",
1669 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1670 })
1671
Colin Cross4c4c1be2022-02-10 11:41:18 -08001672 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001673
1674 installed := hwasan.Description("install libclang_rt.hwasan")
1675 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1676
1677 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1678 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1679 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1680}
1681
Jooyung Han61b66e92020-03-21 14:21:46 +00001682func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001683 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001684 testcases := []struct {
1685 name string
1686 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001687 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001688 shouldLink string
1689 shouldNotLink []string
1690 }{
1691 {
Jiyong Park55549df2021-02-26 23:57:23 +09001692 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001693 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001694 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001695 shouldLink: "current",
1696 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001697 },
1698 {
Jiyong Park55549df2021-02-26 23:57:23 +09001699 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001700 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001701 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001702 shouldLink: "current",
1703 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 },
1705 }
1706 for _, tc := range testcases {
1707 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001708 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001709 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001710 apex {
1711 name: "myapex",
1712 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001713 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001714 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001715 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001716 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001717
Jooyung Han61b66e92020-03-21 14:21:46 +00001718 apex_key {
1719 name: "myapex.key",
1720 public_key: "testkey.avbpubkey",
1721 private_key: "testkey.pem",
1722 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001723
Jooyung Han61b66e92020-03-21 14:21:46 +00001724 cc_library {
1725 name: "mylib",
1726 srcs: ["mylib.cpp"],
1727 vendor_available: true,
1728 shared_libs: ["libbar"],
1729 system_shared_libs: [],
1730 stl: "none",
1731 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001732 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001733 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001734
Jooyung Han61b66e92020-03-21 14:21:46 +00001735 cc_library {
1736 name: "libbar",
1737 srcs: ["mylib.cpp"],
1738 system_shared_libs: [],
1739 stl: "none",
1740 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001741 llndk: {
1742 symbol_file: "libbar.map.txt",
1743 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001745 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001746 withUnbundledBuild,
1747 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001748
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001750 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 "lib64/mylib.so",
1752 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001753
Jooyung Han61b66e92020-03-21 14:21:46 +00001754 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001755 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001756 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1757 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001758
Steven Moreland2c4000c2021-04-27 02:08:49 +00001759 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1760 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001761 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001762 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001763 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001764
Steven Moreland2c4000c2021-04-27 02:08:49 +00001765 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001766 ver := tc.shouldLink
1767 if tc.shouldLink == "current" {
1768 ver = strconv.Itoa(android.FutureApiLevelInt)
1769 }
1770 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001771 })
1772 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001773}
1774
Jiyong Park25fc6a92018-11-18 18:02:45 +09001775func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001776 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001777 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001778 apex {
1779 name: "myapex",
1780 key: "myapex.key",
1781 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001782 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001783 }
1784
1785 apex_key {
1786 name: "myapex.key",
1787 public_key: "testkey.avbpubkey",
1788 private_key: "testkey.pem",
1789 }
1790
1791 cc_library {
1792 name: "mylib",
1793 srcs: ["mylib.cpp"],
Colin Cross0de8a1e2020-09-18 14:15:30 -07001794 system_shared_libs: ["libc", "libm"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001795 shared_libs: ["libdl#27"],
1796 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001797 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001798 }
1799
1800 cc_library_shared {
1801 name: "mylib_shared",
1802 srcs: ["mylib.cpp"],
1803 shared_libs: ["libdl#27"],
1804 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001805 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001806 }
1807
1808 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 name: "libBootstrap",
1810 srcs: ["mylib.cpp"],
1811 stl: "none",
1812 bootstrap: true,
1813 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814 `)
1815
Jooyung Hana0503a52023-08-23 13:12:50 +09001816 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001817 copyCmds := apexRule.Args["copy_commands"]
1818
1819 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001820 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001821 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1822 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001823
1824 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001825 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001826
Colin Crossaede88c2020-08-11 12:17:01 -07001827 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1828 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1829 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001830
1831 // For dependency to libc
1832 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001833 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001834 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001835 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001836 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001837 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1838 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001839
1840 // For dependency to libm
1841 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001842 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001844 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... and is not compiling with the stub
1846 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1847 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1848
1849 // For dependency to libdl
1850 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001851 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001852 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001853 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1854 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001855 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001856 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001857 // ... Cflags from stub is correctly exported to mylib
1858 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1859 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001860
1861 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001862 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1863 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1864 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1865 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001866}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001867
Jooyung Han749dc692020-04-15 11:03:39 +09001868func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001869 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001870 // there are three links between liba --> libz.
1871 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001872 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001873 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001874 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001875 apex {
1876 name: "myapex",
1877 key: "myapex.key",
1878 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001879 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001880 }
1881
1882 apex {
1883 name: "otherapex",
1884 key: "myapex.key",
1885 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001886 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001887 }
1888
1889 apex_key {
1890 name: "myapex.key",
1891 public_key: "testkey.avbpubkey",
1892 private_key: "testkey.pem",
1893 }
1894
1895 cc_library {
1896 name: "libx",
1897 shared_libs: ["liba"],
1898 system_shared_libs: [],
1899 stl: "none",
1900 apex_available: [ "myapex" ],
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: "liby",
1906 shared_libs: ["liba"],
1907 system_shared_libs: [],
1908 stl: "none",
1909 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "liba",
1915 shared_libs: ["libz"],
1916 system_shared_libs: [],
1917 stl: "none",
1918 apex_available: [
1919 "//apex_available:anyapex",
1920 "//apex_available:platform",
1921 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001922 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001923 }
1924
1925 cc_library {
1926 name: "libz",
1927 system_shared_libs: [],
1928 stl: "none",
1929 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001930 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001931 },
1932 }
Jooyung Han749dc692020-04-15 11:03:39 +09001933 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001934
1935 expectLink := func(from, from_variant, to, to_variant string) {
1936 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1937 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1938 }
1939 expectNoLink := func(from, from_variant, to, to_variant string) {
1940 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1941 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1942 }
1943 // platform liba is linked to non-stub version
1944 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001945 // liba in myapex is linked to current
1946 expectLink("liba", "shared_apex29", "libz", "shared_current")
1947 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001948 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001949 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001950 // liba in otherapex is linked to current
1951 expectLink("liba", "shared_apex30", "libz", "shared_current")
1952 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001953 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1954 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001955}
1956
Jooyung Hanaed150d2020-04-02 01:41:41 +09001957func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001958 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001959 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001960 apex {
1961 name: "myapex",
1962 key: "myapex.key",
1963 native_shared_libs: ["libx"],
1964 min_sdk_version: "R",
1965 }
1966
1967 apex_key {
1968 name: "myapex.key",
1969 public_key: "testkey.avbpubkey",
1970 private_key: "testkey.pem",
1971 }
1972
1973 cc_library {
1974 name: "libx",
1975 shared_libs: ["libz"],
1976 system_shared_libs: [],
1977 stl: "none",
1978 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001979 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001980 }
1981
1982 cc_library {
1983 name: "libz",
1984 system_shared_libs: [],
1985 stl: "none",
1986 stubs: {
1987 versions: ["29", "R"],
1988 },
1989 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001990 `,
1991 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1992 variables.Platform_version_active_codenames = []string{"R"}
1993 }),
1994 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001995
1996 expectLink := func(from, from_variant, to, to_variant string) {
1997 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1998 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1999 }
2000 expectNoLink := func(from, from_variant, to, to_variant string) {
2001 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2002 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2003 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002004 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2005 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002006 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2007 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002008}
2009
Jooyung Han4c4da062021-06-23 10:23:16 +09002010func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002011 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002012 testApex(t, `
2013 apex {
2014 name: "myapex",
2015 key: "myapex.key",
2016 java_libs: ["libx"],
2017 min_sdk_version: "S",
2018 }
2019
2020 apex_key {
2021 name: "myapex.key",
2022 public_key: "testkey.avbpubkey",
2023 private_key: "testkey.pem",
2024 }
2025
2026 java_library {
2027 name: "libx",
2028 srcs: ["a.java"],
2029 apex_available: [ "myapex" ],
2030 sdk_version: "current",
2031 min_sdk_version: "S", // should be okay
2032 }
2033 `,
2034 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2035 variables.Platform_version_active_codenames = []string{"S"}
2036 variables.Platform_sdk_codename = proptools.StringPtr("S")
2037 }),
2038 )
2039}
2040
Jooyung Han749dc692020-04-15 11:03:39 +09002041func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002042 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002043 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002044 apex {
2045 name: "myapex",
2046 key: "myapex.key",
2047 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002048 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002049 }
2050
2051 apex_key {
2052 name: "myapex.key",
2053 public_key: "testkey.avbpubkey",
2054 private_key: "testkey.pem",
2055 }
2056
2057 cc_library {
2058 name: "libx",
2059 shared_libs: ["libz"],
2060 system_shared_libs: [],
2061 stl: "none",
2062 apex_available: [ "myapex" ],
2063 }
2064
2065 cc_library {
2066 name: "libz",
2067 system_shared_libs: [],
2068 stl: "none",
2069 stubs: {
2070 versions: ["1", "2"],
2071 },
2072 }
2073 `)
2074
2075 expectLink := func(from, from_variant, to, to_variant string) {
2076 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2077 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2078 }
2079 expectNoLink := func(from, from_variant, to, to_variant string) {
2080 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2081 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2082 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002083 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002084 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002085 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002086 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002087}
2088
Jooyung Handfc864c2023-03-20 18:19:07 +09002089func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002090 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002091 ctx := testApex(t, `
2092 apex {
2093 name: "myapex",
2094 key: "myapex.key",
2095 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002096 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002097 vendor: true,
2098 min_sdk_version: "29",
2099 }
2100
2101 apex_key {
2102 name: "myapex.key",
2103 public_key: "testkey.avbpubkey",
2104 private_key: "testkey.pem",
2105 }
2106
2107 cc_library {
2108 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002109 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002110 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002111 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002112 shared_libs: ["libbar"],
2113 }
2114
2115 cc_library {
2116 name: "libbar",
2117 stubs: { versions: ["29", "30"] },
2118 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002119 }
2120 `)
2121
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002122 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002123
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002124 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002125
2126 // Ensure that mylib links with "current" LLNDK
2127 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002128 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002129
2130 // Ensure that mylib is targeting 29
2131 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2132 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2133
2134 // Ensure that the correct variant of crtbegin_so is used.
2135 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2136 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002137
2138 // Ensure that the crtbegin_so used by the APEX is targeting 29
2139 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2140 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2141}
2142
Jooyung Han4495f842023-04-25 16:39:59 +09002143func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002144 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002145 ctx := testApex(t, `
2146 apex {
2147 name: "myapex",
2148 key: "myapex.key",
2149 updatable: true,
2150 native_shared_libs: [
2151 "mylib",
2152 "yourlib",
2153 ],
2154 min_sdk_version: "29",
2155 }
2156
2157 apex {
2158 name: "myapex2",
2159 key: "myapex.key",
2160 updatable: false,
2161 native_shared_libs: ["yourlib"],
2162 }
2163
2164 apex_key {
2165 name: "myapex.key",
2166 public_key: "testkey.avbpubkey",
2167 private_key: "testkey.pem",
2168 }
2169
2170 cc_library {
2171 name: "mylib",
2172 srcs: ["mylib.cpp"],
2173 shared_libs: ["libbar"],
2174 min_sdk_version: "29",
2175 apex_available: ["myapex"],
2176 }
2177
2178 cc_library {
2179 name: "libbar",
2180 stubs: { versions: ["29", "30"] },
2181 }
2182
2183 cc_library {
2184 name: "yourlib",
2185 srcs: ["mylib.cpp"],
2186 min_sdk_version: "29",
2187 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2188 }
2189 `, withFiles(android.MockFS{
2190 "packages/modules/common/build/allowed_deps.txt": nil,
2191 }))
2192
2193 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2194 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2195 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002196 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002197 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002198 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002199
Jooyung Hana0503a52023-08-23 13:12:50 +09002200 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002201 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2202 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002203 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2204 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2205 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2206 flatlist, "mylib:(minSdkVersion:29)")
2207 android.AssertStringListContains(t, "track platform-available lib",
2208 flatlist, "yourlib(minSdkVersion:29)")
2209}
2210
Nouby Mohamed8609a552024-09-04 22:19:51 +00002211func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002212 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002213 ctx := testApex(t, `
2214 apex {
2215 name: "myapex",
2216 key: "myapex.key",
2217 updatable: true,
2218 native_shared_libs: [
2219 "mylib",
2220 "yourlib",
2221 ],
2222 min_sdk_version: "29",
2223 }
2224
2225 apex {
2226 name: "myapex2",
2227 key: "myapex.key",
2228 updatable: false,
2229 native_shared_libs: ["yourlib"],
2230 }
2231
2232 apex_key {
2233 name: "myapex.key",
2234 public_key: "testkey.avbpubkey",
2235 private_key: "testkey.pem",
2236 }
2237
2238 cc_library {
2239 name: "mylib",
2240 srcs: ["mylib.cpp"],
2241 shared_libs: ["libbar"],
2242 min_sdk_version: "29",
2243 apex_available: ["myapex"],
2244 }
2245
2246 cc_library {
2247 name: "libbar",
2248 stubs: { versions: ["29", "30"] },
2249 }
2250
2251 cc_library {
2252 name: "yourlib",
2253 srcs: ["mylib.cpp"],
2254 min_sdk_version: "29",
2255 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2256 }
2257 `, withFiles(android.MockFS{
2258 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2259 }),
2260 android.FixtureModifyProductVariables(
2261 func(variables android.FixtureProductVariables) {
2262 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2263 },
2264 ))
2265
2266 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2267 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2268 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2269 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2270 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2271 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2272
2273 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2274 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2275 myapex.Output("depsinfo/flatlist.txt")), "\n")
2276 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2277 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2278 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2279 flatlist, "mylib:(minSdkVersion:29)")
2280 android.AssertStringListContains(t, "track platform-available lib",
2281 flatlist, "yourlib(minSdkVersion:29)")
2282}
2283
2284func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002285 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002286 ctx := testApex(t, `
2287 apex {
2288 name: "myapex",
2289 key: "myapex.key",
2290 updatable: true,
2291 native_shared_libs: [
2292 "mylib",
2293 "yourlib",
2294 ],
2295 min_sdk_version: "29",
2296 }
2297
2298 apex {
2299 name: "myapex2",
2300 key: "myapex.key",
2301 updatable: false,
2302 native_shared_libs: ["yourlib"],
2303 }
2304
2305 apex_key {
2306 name: "myapex.key",
2307 public_key: "testkey.avbpubkey",
2308 private_key: "testkey.pem",
2309 }
2310
2311 cc_library {
2312 name: "mylib",
2313 srcs: ["mylib.cpp"],
2314 shared_libs: ["libbar"],
2315 min_sdk_version: "29",
2316 apex_available: ["myapex"],
2317 }
2318
2319 cc_library {
2320 name: "libbar",
2321 stubs: { versions: ["29", "30"] },
2322 }
2323
2324 cc_library {
2325 name: "yourlib",
2326 srcs: ["mylib.cpp"],
2327 min_sdk_version: "29",
2328 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2329 }
2330 `, withFiles(android.MockFS{
2331 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2332 "packages/modules/common/build/allowed_deps.txt": nil,
2333 }),
2334 android.FixtureModifyProductVariables(
2335 func(variables android.FixtureProductVariables) {
2336 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2337 },
2338 ))
2339
2340 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2341 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2342 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2343 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2344 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2345 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2346
2347 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2348 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2349 myapex.Output("depsinfo/flatlist.txt")), "\n")
2350 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2351 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2352 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2353 flatlist, "mylib:(minSdkVersion:29)")
2354 android.AssertStringListContains(t, "track platform-available lib",
2355 flatlist, "yourlib(minSdkVersion:29)")
2356}
2357
Jooyung Han4495f842023-04-25 16:39:59 +09002358func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002359 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002360 ctx := testApex(t, `
2361 apex {
2362 name: "myapex",
2363 key: "myapex.key",
2364 updatable: true,
2365 min_sdk_version: "29",
2366 }
2367
2368 apex_key {
2369 name: "myapex.key",
2370 public_key: "testkey.avbpubkey",
2371 private_key: "testkey.pem",
2372 }
2373 `)
2374 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2375 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2376 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2377 }
2378}
2379
Jooyung Han03b51852020-02-26 22:45:42 +09002380func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002381 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002382 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002383 apex {
2384 name: "myapex",
2385 key: "myapex.key",
2386 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002387 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002388 }
2389
2390 apex_key {
2391 name: "myapex.key",
2392 public_key: "testkey.avbpubkey",
2393 private_key: "testkey.pem",
2394 }
2395
2396 cc_library {
2397 name: "libx",
2398 system_shared_libs: [],
2399 stl: "none",
2400 apex_available: [ "myapex" ],
2401 stubs: {
2402 versions: ["1", "2"],
2403 },
2404 }
2405
2406 cc_library {
2407 name: "libz",
2408 shared_libs: ["libx"],
2409 system_shared_libs: [],
2410 stl: "none",
2411 }
2412 `)
2413
2414 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002415 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002416 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2417 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2418 }
2419 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002420 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002421 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2422 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2423 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002424 expectLink("libz", "shared", "libx", "shared_current")
2425 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002426 expectNoLink("libz", "shared", "libz", "shared_1")
2427 expectNoLink("libz", "shared", "libz", "shared")
2428}
2429
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002430var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2431 func(variables android.FixtureProductVariables) {
2432 variables.SanitizeDevice = []string{"hwaddress"}
2433 },
2434)
2435
Jooyung Han75568392020-03-20 04:29:24 +09002436func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002437 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002438 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002439 apex {
2440 name: "myapex",
2441 key: "myapex.key",
2442 native_shared_libs: ["libx"],
2443 min_sdk_version: "29",
2444 }
2445
2446 apex_key {
2447 name: "myapex.key",
2448 public_key: "testkey.avbpubkey",
2449 private_key: "testkey.pem",
2450 }
2451
2452 cc_library {
2453 name: "libx",
2454 shared_libs: ["libbar"],
2455 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002456 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002457 }
2458
2459 cc_library {
2460 name: "libbar",
2461 stubs: {
2462 versions: ["29", "30"],
2463 },
2464 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002465 `,
2466 prepareForTestWithSantitizeHwaddress,
2467 )
Jooyung Han03b51852020-02-26 22:45:42 +09002468 expectLink := func(from, from_variant, to, to_variant string) {
2469 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2470 libFlags := ld.Args["libFlags"]
2471 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2472 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002473 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002474}
2475
Jooyung Han75568392020-03-20 04:29:24 +09002476func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002477 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002478 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002479 apex {
2480 name: "myapex",
2481 key: "myapex.key",
2482 native_shared_libs: ["libx"],
2483 min_sdk_version: "29",
2484 }
2485
2486 apex_key {
2487 name: "myapex.key",
2488 public_key: "testkey.avbpubkey",
2489 private_key: "testkey.pem",
2490 }
2491
2492 cc_library {
2493 name: "libx",
2494 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002495 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002496 }
Jooyung Han75568392020-03-20 04:29:24 +09002497 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002498
2499 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002500 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002501 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002502 // note that platform variant is not.
2503 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002504 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002505}
2506
Jooyung Han749dc692020-04-15 11:03:39 +09002507func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002508 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002509 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002510 apex {
2511 name: "myapex",
2512 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002513 native_shared_libs: ["mylib"],
2514 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002515 }
2516
2517 apex_key {
2518 name: "myapex.key",
2519 public_key: "testkey.avbpubkey",
2520 private_key: "testkey.pem",
2521 }
Jooyung Han749dc692020-04-15 11:03:39 +09002522
2523 cc_library {
2524 name: "mylib",
2525 srcs: ["mylib.cpp"],
2526 system_shared_libs: [],
2527 stl: "none",
2528 apex_available: [
2529 "myapex",
2530 ],
2531 min_sdk_version: "30",
2532 }
2533 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002534
2535 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2536 apex {
2537 name: "myapex",
2538 key: "myapex.key",
2539 native_shared_libs: ["libfoo.ffi"],
2540 min_sdk_version: "29",
2541 }
2542
2543 apex_key {
2544 name: "myapex.key",
2545 public_key: "testkey.avbpubkey",
2546 private_key: "testkey.pem",
2547 }
2548
2549 rust_ffi_shared {
2550 name: "libfoo.ffi",
2551 srcs: ["foo.rs"],
2552 crate_name: "foo",
2553 apex_available: [
2554 "myapex",
2555 ],
2556 min_sdk_version: "30",
2557 }
2558 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002559
2560 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2561 apex {
2562 name: "myapex",
2563 key: "myapex.key",
2564 java_libs: ["libfoo"],
2565 min_sdk_version: "29",
2566 }
2567
2568 apex_key {
2569 name: "myapex.key",
2570 public_key: "testkey.avbpubkey",
2571 private_key: "testkey.pem",
2572 }
2573
2574 java_import {
2575 name: "libfoo",
2576 jars: ["libfoo.jar"],
2577 apex_available: [
2578 "myapex",
2579 ],
2580 min_sdk_version: "30",
2581 }
2582 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002583
2584 // Skip check for modules compiling against core API surface
2585 testApex(t, `
2586 apex {
2587 name: "myapex",
2588 key: "myapex.key",
2589 java_libs: ["libfoo"],
2590 min_sdk_version: "29",
2591 }
2592
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598
2599 java_library {
2600 name: "libfoo",
2601 srcs: ["Foo.java"],
2602 apex_available: [
2603 "myapex",
2604 ],
2605 // Compile against core API surface
2606 sdk_version: "core_current",
2607 min_sdk_version: "30",
2608 }
2609 `)
2610
Jooyung Han749dc692020-04-15 11:03:39 +09002611}
2612
2613func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002614 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002615 testApex(t, `
2616 apex {
2617 name: "myapex",
2618 key: "myapex.key",
2619 native_shared_libs: ["libfoo"],
2620 java_libs: ["libbar"],
2621 min_sdk_version: "29",
2622 }
2623
2624 apex_key {
2625 name: "myapex.key",
2626 public_key: "testkey.avbpubkey",
2627 private_key: "testkey.pem",
2628 }
2629
2630 cc_library {
2631 name: "libfoo",
2632 srcs: ["mylib.cpp"],
2633 shared_libs: ["libfoo_dep"],
2634 apex_available: ["myapex"],
2635 min_sdk_version: "29",
2636 }
2637
2638 cc_library {
2639 name: "libfoo_dep",
2640 srcs: ["mylib.cpp"],
2641 apex_available: ["myapex"],
2642 min_sdk_version: "29",
2643 }
2644
2645 java_library {
2646 name: "libbar",
2647 sdk_version: "current",
2648 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002649 static_libs: [
2650 "libbar_dep",
2651 "libbar_import_dep",
2652 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002653 apex_available: ["myapex"],
2654 min_sdk_version: "29",
2655 }
2656
2657 java_library {
2658 name: "libbar_dep",
2659 sdk_version: "current",
2660 srcs: ["a.java"],
2661 apex_available: ["myapex"],
2662 min_sdk_version: "29",
2663 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002664
2665 java_import {
2666 name: "libbar_import_dep",
2667 jars: ["libbar.jar"],
2668 apex_available: ["myapex"],
2669 min_sdk_version: "29",
2670 }
Jooyung Han03b51852020-02-26 22:45:42 +09002671 `)
2672}
2673
Colin Cross8ca61c12022-10-06 21:00:14 -07002674func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002675 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002676 // Tests that an apex dependency with min_sdk_version higher than the
2677 // min_sdk_version of the apex is allowed as long as the dependency's
2678 // min_sdk_version is less than or equal to the api level that the
2679 // architecture was introduced in. In this case, arm64 didn't exist
2680 // until api level 21, so the arm64 code will never need to run on
2681 // an api level 20 device, even if other architectures of the apex
2682 // will.
2683 testApex(t, `
2684 apex {
2685 name: "myapex",
2686 key: "myapex.key",
2687 native_shared_libs: ["libfoo"],
2688 min_sdk_version: "20",
2689 }
2690
2691 apex_key {
2692 name: "myapex.key",
2693 public_key: "testkey.avbpubkey",
2694 private_key: "testkey.pem",
2695 }
2696
2697 cc_library {
2698 name: "libfoo",
2699 srcs: ["mylib.cpp"],
2700 apex_available: ["myapex"],
2701 min_sdk_version: "21",
2702 stl: "none",
2703 }
2704 `)
2705}
2706
Artur Satayev8cf899a2020-04-15 17:29:42 +01002707func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002708 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002709 testCases := []struct {
2710 name string
2711 expectedError string
2712 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002713 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002714 }{
2715 {
2716 name: "Non-updatable apex with non-stable dep",
2717 bp: `
2718 apex {
2719 name: "myapex",
2720 java_libs: ["myjar"],
2721 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002722 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002723 }
2724 apex_key {
2725 name: "myapex.key",
2726 public_key: "testkey.avbpubkey",
2727 private_key: "testkey.pem",
2728 }
2729 java_library {
2730 name: "myjar",
2731 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002732 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002733 apex_available: ["myapex"],
2734 }
2735 `,
2736 },
2737 {
2738 name: "Updatable apex with stable dep",
2739 bp: `
2740 apex {
2741 name: "myapex",
2742 java_libs: ["myjar"],
2743 key: "myapex.key",
2744 updatable: true,
2745 min_sdk_version: "29",
2746 }
2747 apex_key {
2748 name: "myapex.key",
2749 public_key: "testkey.avbpubkey",
2750 private_key: "testkey.pem",
2751 }
2752 java_library {
2753 name: "myjar",
2754 srcs: ["foo/bar/MyClass.java"],
2755 sdk_version: "current",
2756 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002757 min_sdk_version: "29",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002758 }
2759 `,
2760 },
2761 {
2762 name: "Updatable apex with non-stable dep",
2763 expectedError: "cannot depend on \"myjar\"",
2764 bp: `
2765 apex {
2766 name: "myapex",
2767 java_libs: ["myjar"],
2768 key: "myapex.key",
2769 updatable: true,
2770 }
2771 apex_key {
2772 name: "myapex.key",
2773 public_key: "testkey.avbpubkey",
2774 private_key: "testkey.pem",
2775 }
2776 java_library {
2777 name: "myjar",
2778 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002779 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002780 apex_available: ["myapex"],
2781 }
2782 `,
2783 },
2784 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002785 name: "Updatable apex with non-stable legacy core platform dep",
2786 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2787 bp: `
2788 apex {
2789 name: "myapex",
2790 java_libs: ["myjar-uses-legacy"],
2791 key: "myapex.key",
2792 updatable: true,
2793 }
2794 apex_key {
2795 name: "myapex.key",
2796 public_key: "testkey.avbpubkey",
2797 private_key: "testkey.pem",
2798 }
2799 java_library {
2800 name: "myjar-uses-legacy",
2801 srcs: ["foo/bar/MyClass.java"],
2802 sdk_version: "core_platform",
2803 apex_available: ["myapex"],
2804 }
2805 `,
2806 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2807 },
2808 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002809 name: "Updatable apex with non-stable transitive dep",
2810 // This is not actually detecting that the transitive dependency is unstable, rather it is
2811 // detecting that the transitive dependency is building against a wider API surface than the
2812 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002813 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002814 bp: `
2815 apex {
2816 name: "myapex",
2817 java_libs: ["myjar"],
2818 key: "myapex.key",
2819 updatable: true,
2820 }
2821 apex_key {
2822 name: "myapex.key",
2823 public_key: "testkey.avbpubkey",
2824 private_key: "testkey.pem",
2825 }
2826 java_library {
2827 name: "myjar",
2828 srcs: ["foo/bar/MyClass.java"],
2829 sdk_version: "current",
2830 apex_available: ["myapex"],
2831 static_libs: ["transitive-jar"],
2832 }
2833 java_library {
2834 name: "transitive-jar",
2835 srcs: ["foo/bar/MyClass.java"],
2836 sdk_version: "core_platform",
2837 apex_available: ["myapex"],
2838 }
2839 `,
2840 },
2841 }
2842
2843 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002844 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2845 continue
2846 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002847 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002848 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002849 errorHandler := android.FixtureExpectsNoErrors
2850 if test.expectedError != "" {
2851 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002852 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002853 android.GroupFixturePreparers(
2854 java.PrepareForTestWithJavaDefaultModules,
2855 PrepareForTestWithApexBuildComponents,
2856 prepareForTestWithMyapex,
2857 android.OptionalFixturePreparer(test.preparer),
2858 ).
2859 ExtendWithErrorHandler(errorHandler).
2860 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002861 })
2862 }
2863}
2864
Jooyung Han749dc692020-04-15 11:03:39 +09002865func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2866 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2867 apex {
2868 name: "myapex",
2869 key: "myapex.key",
2870 native_shared_libs: ["mylib"],
2871 min_sdk_version: "29",
2872 }
2873
2874 apex_key {
2875 name: "myapex.key",
2876 public_key: "testkey.avbpubkey",
2877 private_key: "testkey.pem",
2878 }
2879
2880 cc_library {
2881 name: "mylib",
2882 srcs: ["mylib.cpp"],
2883 shared_libs: ["mylib2"],
2884 system_shared_libs: [],
2885 stl: "none",
2886 apex_available: [
2887 "myapex",
2888 ],
2889 min_sdk_version: "29",
2890 }
2891
2892 // indirect part of the apex
2893 cc_library {
2894 name: "mylib2",
2895 srcs: ["mylib.cpp"],
2896 system_shared_libs: [],
2897 stl: "none",
2898 apex_available: [
2899 "myapex",
2900 ],
2901 min_sdk_version: "30",
2902 }
2903 `)
2904}
2905
2906func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002907 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002908 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2909 apex {
2910 name: "myapex",
2911 key: "myapex.key",
2912 apps: ["AppFoo"],
2913 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002914 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002915 }
2916
2917 apex_key {
2918 name: "myapex.key",
2919 public_key: "testkey.avbpubkey",
2920 private_key: "testkey.pem",
2921 }
2922
2923 android_app {
2924 name: "AppFoo",
2925 srcs: ["foo/bar/MyClass.java"],
2926 sdk_version: "current",
2927 min_sdk_version: "29",
2928 system_modules: "none",
2929 stl: "none",
2930 static_libs: ["bar"],
2931 apex_available: [ "myapex" ],
2932 }
2933
2934 java_library {
2935 name: "bar",
2936 sdk_version: "current",
2937 srcs: ["a.java"],
2938 apex_available: [ "myapex" ],
2939 }
2940 `)
2941}
2942
2943func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002944 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002945 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002946 apex {
2947 name: "myapex",
2948 key: "myapex.key",
2949 native_shared_libs: ["mylib"],
2950 min_sdk_version: "29",
2951 }
2952
2953 apex_key {
2954 name: "myapex.key",
2955 public_key: "testkey.avbpubkey",
2956 private_key: "testkey.pem",
2957 }
2958
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002959 // mylib in myapex will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002960 // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
2961 cc_library {
2962 name: "mylib",
2963 srcs: ["mylib.cpp"],
2964 shared_libs: ["mylib2"],
2965 system_shared_libs: [],
2966 stl: "none",
2967 apex_available: ["myapex", "otherapex"],
2968 min_sdk_version: "29",
2969 }
2970
2971 cc_library {
2972 name: "mylib2",
2973 srcs: ["mylib.cpp"],
2974 system_shared_libs: [],
2975 stl: "none",
2976 apex_available: ["otherapex"],
2977 stubs: { versions: ["29", "30"] },
2978 min_sdk_version: "30",
2979 }
2980
2981 apex {
2982 name: "otherapex",
2983 key: "myapex.key",
2984 native_shared_libs: ["mylib", "mylib2"],
2985 min_sdk_version: "30",
2986 }
2987 `)
2988 expectLink := func(from, from_variant, to, to_variant string) {
2989 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2990 libFlags := ld.Args["libFlags"]
2991 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2992 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002993 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002994 expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
Jooyung Han749dc692020-04-15 11:03:39 +09002995}
2996
Jooyung Haned124c32021-01-26 11:43:46 +09002997func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002998 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002999 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3000 func(variables android.FixtureProductVariables) {
3001 variables.Platform_sdk_codename = proptools.StringPtr("S")
3002 variables.Platform_version_active_codenames = []string{"S"}
3003 },
3004 )
Jooyung Haned124c32021-01-26 11:43:46 +09003005 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3006 apex {
3007 name: "myapex",
3008 key: "myapex.key",
3009 native_shared_libs: ["libfoo"],
3010 min_sdk_version: "S",
3011 }
3012 apex_key {
3013 name: "myapex.key",
3014 public_key: "testkey.avbpubkey",
3015 private_key: "testkey.pem",
3016 }
3017 cc_library {
3018 name: "libfoo",
3019 shared_libs: ["libbar"],
3020 apex_available: ["myapex"],
3021 min_sdk_version: "29",
3022 }
3023 cc_library {
3024 name: "libbar",
3025 apex_available: ["myapex"],
3026 }
3027 `, withSAsActiveCodeNames)
3028}
3029
3030func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003031 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003032 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3033 variables.Platform_sdk_codename = proptools.StringPtr("S")
3034 variables.Platform_version_active_codenames = []string{"S", "T"}
3035 })
Colin Cross1c460562021-02-16 17:55:47 -08003036 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003037 apex {
3038 name: "myapex",
3039 key: "myapex.key",
3040 native_shared_libs: ["libfoo"],
3041 min_sdk_version: "S",
3042 }
3043 apex_key {
3044 name: "myapex.key",
3045 public_key: "testkey.avbpubkey",
3046 private_key: "testkey.pem",
3047 }
3048 cc_library {
3049 name: "libfoo",
3050 shared_libs: ["libbar"],
3051 apex_available: ["myapex"],
3052 min_sdk_version: "S",
3053 }
3054 cc_library {
3055 name: "libbar",
3056 stubs: {
3057 symbol_file: "libbar.map.txt",
3058 versions: ["30", "S", "T"],
3059 },
3060 }
3061 `, withSAsActiveCodeNames)
3062
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003063 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003064 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3065 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003066 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003067}
3068
Jiyong Park7c2ee712018-12-07 00:42:25 +09003069func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003070 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003071 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003072 apex {
3073 name: "myapex",
3074 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003075 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003076 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003077 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003078 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003079 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003080 }
3081
3082 apex_key {
3083 name: "myapex.key",
3084 public_key: "testkey.avbpubkey",
3085 private_key: "testkey.pem",
3086 }
3087
3088 prebuilt_etc {
3089 name: "myetc",
3090 src: "myprebuilt",
3091 sub_dir: "foo/bar",
3092 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003093
3094 cc_library {
3095 name: "mylib",
3096 srcs: ["mylib.cpp"],
3097 relative_install_path: "foo/bar",
3098 system_shared_libs: [],
3099 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003100 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003101 }
3102
3103 cc_binary {
3104 name: "mybin",
3105 srcs: ["mylib.cpp"],
3106 relative_install_path: "foo/bar",
3107 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003108 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003109 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003110 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003111
3112 rust_binary {
3113 name: "mybin.rust",
3114 srcs: ["foo.rs"],
3115 relative_install_path: "rust_subdir",
3116 apex_available: [ "myapex" ],
3117 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003118 `)
3119
Jooyung Hana0503a52023-08-23 13:12:50 +09003120 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003121 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003122
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003123 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003124 ensureContains(t, cmd, "/etc ")
3125 ensureContains(t, cmd, "/etc/foo ")
3126 ensureContains(t, cmd, "/etc/foo/bar ")
3127 ensureContains(t, cmd, "/lib64 ")
3128 ensureContains(t, cmd, "/lib64/foo ")
3129 ensureContains(t, cmd, "/lib64/foo/bar ")
3130 ensureContains(t, cmd, "/lib ")
3131 ensureContains(t, cmd, "/lib/foo ")
3132 ensureContains(t, cmd, "/lib/foo/bar ")
3133 ensureContains(t, cmd, "/bin ")
3134 ensureContains(t, cmd, "/bin/foo ")
3135 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003136 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003137}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003138
Jooyung Han35155c42020-02-06 17:33:20 +09003139func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003140 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003141 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003142 apex {
3143 name: "myapex",
3144 key: "myapex.key",
3145 multilib: {
3146 both: {
3147 native_shared_libs: ["mylib"],
3148 binaries: ["mybin"],
3149 },
3150 },
3151 compile_multilib: "both",
3152 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003153 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003154 }
3155
3156 apex_key {
3157 name: "myapex.key",
3158 public_key: "testkey.avbpubkey",
3159 private_key: "testkey.pem",
3160 }
3161
3162 cc_library {
3163 name: "mylib",
3164 relative_install_path: "foo/bar",
3165 system_shared_libs: [],
3166 stl: "none",
3167 apex_available: [ "myapex" ],
3168 native_bridge_supported: true,
3169 }
3170
3171 cc_binary {
3172 name: "mybin",
3173 relative_install_path: "foo/bar",
3174 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003175 stl: "none",
3176 apex_available: [ "myapex" ],
3177 native_bridge_supported: true,
3178 compile_multilib: "both", // default is "first" for binary
3179 multilib: {
3180 lib64: {
3181 suffix: "64",
3182 },
3183 },
3184 }
3185 `, withNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003186 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003187 "bin/foo/bar/mybin",
3188 "bin/foo/bar/mybin64",
3189 "bin/arm/foo/bar/mybin",
3190 "bin/arm64/foo/bar/mybin64",
3191 "lib/foo/bar/mylib.so",
3192 "lib/arm/foo/bar/mylib.so",
3193 "lib64/foo/bar/mylib.so",
3194 "lib64/arm64/foo/bar/mylib.so",
3195 })
3196}
3197
Jooyung Han85d61762020-06-24 23:50:26 +09003198func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003199 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003200 result := android.GroupFixturePreparers(
3201 prepareForApexTest,
3202 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3203 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003204 apex {
3205 name: "myapex",
3206 key: "myapex.key",
3207 binaries: ["mybin"],
3208 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003209 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003210 }
3211 apex_key {
3212 name: "myapex.key",
3213 public_key: "testkey.avbpubkey",
3214 private_key: "testkey.pem",
3215 }
3216 cc_binary {
3217 name: "mybin",
3218 vendor: true,
3219 shared_libs: ["libfoo"],
3220 }
3221 cc_library {
3222 name: "libfoo",
3223 proprietary: true,
3224 }
3225 `)
3226
Jooyung Hana0503a52023-08-23 13:12:50 +09003227 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003228 "bin/mybin",
3229 "lib64/libfoo.so",
3230 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3231 "lib64/libc++.so",
3232 })
3233
Jooyung Hana0503a52023-08-23 13:12:50 +09003234 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003235 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003236 name := apexBundle.BaseModuleName()
3237 prefix := "TARGET_"
3238 var builder strings.Builder
3239 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003240 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003241 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003242 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003243
Jooyung Hana0503a52023-08-23 13:12:50 +09003244 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003245 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3246 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003247}
3248
Justin Yun13decfb2021-03-08 19:25:55 +09003249func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003250 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003251 ctx := testApex(t, `
3252 apex {
3253 name: "myapex",
3254 key: "myapex.key",
3255 updatable: false,
3256 product_specific: true,
3257 binaries: ["foo"],
3258 }
3259
3260 apex_key {
3261 name: "myapex.key",
3262 public_key: "testkey.avbpubkey",
3263 private_key: "testkey.pem",
3264 }
3265
3266 cc_binary {
3267 name: "foo",
3268 product_available: true,
3269 apex_available: ["myapex"],
3270 srcs: ["foo.cpp"],
3271 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003272 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003273
3274 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003275 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003276 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3277 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3278 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3279 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3280}
3281
Jooyung Han8e5685d2020-09-21 11:02:57 +09003282func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003283 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003284 testCases := []struct {
3285 name string
3286 additionalProp string
3287 }{
3288 {"system apex with prebuilt_firmware", ""},
3289 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3290 }
3291 for _, tc := range testCases {
3292 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003293 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003294 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003295 apex {
3296 name: "myapex",
3297 key: "myapex.key",
3298 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003299 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003300 `+tc.additionalProp+`
3301 }
3302 apex_key {
3303 name: "myapex.key",
3304 public_key: "testkey.avbpubkey",
3305 private_key: "testkey.pem",
3306 }
3307 prebuilt_firmware {
3308 name: "myfirmware",
3309 src: "myfirmware.bin",
3310 filename_from_src: true,
3311 `+tc.additionalProp+`
3312 }
3313 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003314 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003315 "etc/firmware/myfirmware.bin",
3316 })
3317 })
3318 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003319}
3320
Jooyung Hanefb184e2020-06-25 17:14:25 +09003321func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003322 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003323 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003324 apex {
3325 name: "myapex",
3326 key: "myapex.key",
3327 vendor: true,
3328 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003329 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003330 }
3331
3332 apex_key {
3333 name: "myapex.key",
3334 public_key: "testkey.avbpubkey",
3335 private_key: "testkey.pem",
3336 }
3337
3338 cc_library {
3339 name: "mylib",
3340 vendor_available: true,
3341 }
3342 `)
3343
Jooyung Hana0503a52023-08-23 13:12:50 +09003344 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003345 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003346 name := apexBundle.BaseModuleName()
3347 prefix := "TARGET_"
3348 var builder strings.Builder
3349 data.Custom(&builder, name, prefix, "", data)
3350 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003351 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 +09003352}
3353
Jooyung Han2ed99d02020-06-24 23:26:26 +09003354func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003355 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003356 apex {
3357 name: "myapex",
3358 key: "myapex.key",
3359 vintf_fragments: ["fragment.xml"],
3360 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003361 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003362 }
3363 apex_key {
3364 name: "myapex.key",
3365 public_key: "testkey.avbpubkey",
3366 private_key: "testkey.pem",
3367 }
3368 cc_binary {
3369 name: "mybin",
3370 }
3371 `)
3372
Jooyung Hana0503a52023-08-23 13:12:50 +09003373 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003374 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003375 name := apexBundle.BaseModuleName()
3376 prefix := "TARGET_"
3377 var builder strings.Builder
3378 data.Custom(&builder, name, prefix, "", data)
3379 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003380 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003381 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003382}
3383
Jiyong Park16e91a02018-12-20 18:18:08 +09003384func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003385 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003386 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003387 apex {
3388 name: "myapex",
3389 key: "myapex.key",
3390 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003391 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003392 }
3393
3394 apex_key {
3395 name: "myapex.key",
3396 public_key: "testkey.avbpubkey",
3397 private_key: "testkey.pem",
3398 }
3399
3400 cc_library {
3401 name: "mylib",
3402 srcs: ["mylib.cpp"],
3403 system_shared_libs: [],
3404 stl: "none",
3405 stubs: {
3406 versions: ["1", "2", "3"],
3407 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003408 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003409 }
3410
3411 cc_binary {
3412 name: "not_in_apex",
3413 srcs: ["mylib.cpp"],
3414 static_libs: ["mylib"],
3415 static_executable: true,
3416 system_shared_libs: [],
3417 stl: "none",
3418 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003419 `)
3420
Colin Cross7113d202019-11-20 16:39:12 -08003421 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003422
3423 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003424 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003425}
Jiyong Park9335a262018-12-24 11:31:58 +09003426
3427func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003428 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003429 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003430 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003431 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003432 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003433 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003434 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003435 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003436 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003437 }
3438
3439 cc_library {
3440 name: "mylib",
3441 srcs: ["mylib.cpp"],
3442 system_shared_libs: [],
3443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003444 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003445 }
3446
3447 apex_key {
3448 name: "myapex.key",
3449 public_key: "testkey.avbpubkey",
3450 private_key: "testkey.pem",
3451 }
3452
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003453 android_app_certificate {
3454 name: "myapex.certificate",
3455 certificate: "testkey",
3456 }
3457
3458 android_app_certificate {
3459 name: "myapex.certificate.override",
3460 certificate: "testkey.override",
3461 }
3462
Jiyong Park9335a262018-12-24 11:31:58 +09003463 `)
3464
3465 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003466 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003467
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003468 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3469 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003470 "vendor/foo/devkeys/testkey.avbpubkey")
3471 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003472 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3473 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003474 "vendor/foo/devkeys/testkey.pem")
3475 }
3476
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003477 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003478 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003479 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003480 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003481 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003482 }
3483}
Jiyong Park58e364a2019-01-19 19:24:06 +09003484
Jooyung Hanf121a652019-12-17 14:30:11 +09003485func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003486 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003487 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003488 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003489 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003490 apex {
3491 name: "myapex",
3492 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003493 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003494 }
3495 apex_key {
3496 name: "myapex.key",
3497 public_key: "testkey.avbpubkey",
3498 private_key: "testkey.pem",
3499 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003500 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003501 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3502 if actual := rule.Args["certificates"]; actual != expected {
3503 t.Errorf("certificates should be %q, not %q", expected, actual)
3504 }
3505 })
3506 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003507 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003508 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003509 apex {
3510 name: "myapex_keytest",
3511 key: "myapex.key",
3512 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003513 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003514 }
3515 apex_key {
3516 name: "myapex.key",
3517 public_key: "testkey.avbpubkey",
3518 private_key: "testkey.pem",
3519 }
3520 android_app_certificate {
3521 name: "myapex.certificate.override",
3522 certificate: "testkey.override",
3523 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003524 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003525 expected := "testkey.override.x509.pem testkey.override.pk8"
3526 if actual := rule.Args["certificates"]; actual != expected {
3527 t.Errorf("certificates should be %q, not %q", expected, actual)
3528 }
3529 })
3530 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003531 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003532 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003533 apex {
3534 name: "myapex",
3535 key: "myapex.key",
3536 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003537 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003538 }
3539 apex_key {
3540 name: "myapex.key",
3541 public_key: "testkey.avbpubkey",
3542 private_key: "testkey.pem",
3543 }
3544 android_app_certificate {
3545 name: "myapex.certificate",
3546 certificate: "testkey",
3547 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003548 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003549 expected := "testkey.x509.pem testkey.pk8"
3550 if actual := rule.Args["certificates"]; actual != expected {
3551 t.Errorf("certificates should be %q, not %q", expected, actual)
3552 }
3553 })
3554 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003555 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003556 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003557 apex {
3558 name: "myapex_keytest",
3559 key: "myapex.key",
3560 file_contexts: ":myapex-file_contexts",
3561 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003562 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003563 }
3564 apex_key {
3565 name: "myapex.key",
3566 public_key: "testkey.avbpubkey",
3567 private_key: "testkey.pem",
3568 }
3569 android_app_certificate {
3570 name: "myapex.certificate.override",
3571 certificate: "testkey.override",
3572 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003573 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003574 expected := "testkey.override.x509.pem testkey.override.pk8"
3575 if actual := rule.Args["certificates"]; actual != expected {
3576 t.Errorf("certificates should be %q, not %q", expected, actual)
3577 }
3578 })
3579 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003580 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003581 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003582 apex {
3583 name: "myapex",
3584 key: "myapex.key",
3585 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003586 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003587 }
3588 apex_key {
3589 name: "myapex.key",
3590 public_key: "testkey.avbpubkey",
3591 private_key: "testkey.pem",
3592 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003593 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003594 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3595 if actual := rule.Args["certificates"]; actual != expected {
3596 t.Errorf("certificates should be %q, not %q", expected, actual)
3597 }
3598 })
3599 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003600 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003601 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003602 apex {
3603 name: "myapex_keytest",
3604 key: "myapex.key",
3605 file_contexts: ":myapex-file_contexts",
3606 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003607 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003608 }
3609 apex_key {
3610 name: "myapex.key",
3611 public_key: "testkey.avbpubkey",
3612 private_key: "testkey.pem",
3613 }
3614 android_app_certificate {
3615 name: "myapex.certificate.override",
3616 certificate: "testkey.override",
3617 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003618 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003619 expected := "testkey.override.x509.pem testkey.override.pk8"
3620 if actual := rule.Args["certificates"]; actual != expected {
3621 t.Errorf("certificates should be %q, not %q", expected, actual)
3622 }
3623 })
3624}
3625
Jiyong Park58e364a2019-01-19 19:24:06 +09003626func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003627 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003628 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003629 apex {
3630 name: "myapex",
3631 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003632 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003633 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003634 }
3635
3636 apex {
3637 name: "otherapex",
3638 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003639 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003640 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003641 }
3642
3643 apex_key {
3644 name: "myapex.key",
3645 public_key: "testkey.avbpubkey",
3646 private_key: "testkey.pem",
3647 }
3648
3649 cc_library {
3650 name: "mylib",
3651 srcs: ["mylib.cpp"],
3652 system_shared_libs: [],
3653 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003654 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003655 "myapex",
3656 "otherapex",
3657 ],
Jooyung Han24282772020-03-21 23:20:55 +09003658 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003659 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003660 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003661 cc_library {
3662 name: "mylib2",
3663 srcs: ["mylib.cpp"],
3664 system_shared_libs: [],
3665 stl: "none",
3666 apex_available: [
3667 "myapex",
3668 "otherapex",
3669 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003670 static_libs: ["mylib3"],
3671 recovery_available: true,
3672 min_sdk_version: "29",
3673 }
3674 cc_library {
3675 name: "mylib3",
3676 srcs: ["mylib.cpp"],
3677 system_shared_libs: [],
3678 stl: "none",
3679 apex_available: [
3680 "myapex",
3681 "otherapex",
3682 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003683 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003684 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003685 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003686 `)
3687
Jooyung Hanc87a0592020-03-02 17:44:33 +09003688 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003689 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003690 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003695
Vinh Tranf9754732023-01-19 22:41:46 -05003696 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003697 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003698 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003699
Colin Crossaede88c2020-08-11 12:17:01 -07003700 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3701 // each variant defines additional macros to distinguish which apex variant it is built for
3702
3703 // non-APEX variant does not have __ANDROID_APEX__ defined
3704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3706
Vinh Tranf9754732023-01-19 22:41:46 -05003707 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003708 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003710
Jooyung Hanc87a0592020-03-02 17:44:33 +09003711 // non-APEX variant does not have __ANDROID_APEX__ defined
3712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3714
Vinh Tranf9754732023-01-19 22:41:46 -05003715 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003716 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003717 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003718}
Jiyong Park7e636d02019-01-28 16:16:54 +09003719
3720func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003721 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003722 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003723 apex {
3724 name: "myapex",
3725 key: "myapex.key",
3726 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003727 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003728 }
3729
3730 apex_key {
3731 name: "myapex.key",
3732 public_key: "testkey.avbpubkey",
3733 private_key: "testkey.pem",
3734 }
3735
3736 cc_library_headers {
3737 name: "mylib_headers",
3738 export_include_dirs: ["my_include"],
3739 system_shared_libs: [],
3740 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003741 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003742 }
3743
3744 cc_library {
3745 name: "mylib",
3746 srcs: ["mylib.cpp"],
3747 system_shared_libs: [],
3748 stl: "none",
3749 header_libs: ["mylib_headers"],
3750 export_header_lib_headers: ["mylib_headers"],
3751 stubs: {
3752 versions: ["1", "2", "3"],
3753 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003754 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003755 }
3756
3757 cc_library {
3758 name: "otherlib",
3759 srcs: ["mylib.cpp"],
3760 system_shared_libs: [],
3761 stl: "none",
3762 shared_libs: ["mylib"],
3763 }
3764 `)
3765
Colin Cross7113d202019-11-20 16:39:12 -08003766 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003767
3768 // Ensure that the include path of the header lib is exported to 'otherlib'
3769 ensureContains(t, cFlags, "-Imy_include")
3770}
Alex Light9670d332019-01-29 18:07:33 -08003771
Jiyong Park7cd10e32020-01-14 09:22:18 +09003772type fileInApex struct {
3773 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003774 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003775 isLink bool
3776}
3777
Jooyung Han1724d582022-12-21 10:17:44 +09003778func (f fileInApex) String() string {
3779 return f.src + ":" + f.path
3780}
3781
3782func (f fileInApex) match(expectation string) bool {
3783 parts := strings.Split(expectation, ":")
3784 if len(parts) == 1 {
3785 match, _ := path.Match(parts[0], f.path)
3786 return match
3787 }
3788 if len(parts) == 2 {
3789 matchSrc, _ := path.Match(parts[0], f.src)
3790 matchDst, _ := path.Match(parts[1], f.path)
3791 return matchSrc && matchDst
3792 }
3793 panic("invalid expected file specification: " + expectation)
3794}
3795
Jooyung Hana57af4a2020-01-23 05:36:59 +00003796func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003798 module := ctx.ModuleForTests(moduleName, variant)
3799 apexRule := module.MaybeRule("apexRule")
3800 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003801 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003802 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003803 for _, cmd := range strings.Split(copyCmds, "&&") {
3804 cmd = strings.TrimSpace(cmd)
3805 if cmd == "" {
3806 continue
3807 }
3808 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003809 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 switch terms[0] {
3812 case "mkdir":
3813 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003814 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003815 t.Fatal("copyCmds contains invalid cp command", cmd)
3816 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003817 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003818 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003819 isLink = false
3820 case "ln":
3821 if len(terms) != 3 && len(terms) != 4 {
3822 // ln LINK TARGET or ln -s LINK TARGET
3823 t.Fatal("copyCmds contains invalid ln command", cmd)
3824 }
3825 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003826 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003827 isLink = true
3828 default:
3829 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3830 }
3831 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003832 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003833 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003834 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003835 }
Jooyung Han1724d582022-12-21 10:17:44 +09003836 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003837 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003838 }
3839 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003840 return ret
3841}
3842
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003843func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003844 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003845 var failed bool
3846 var surplus []string
3847 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003848 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003849 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003850 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003851 if file.match(expected) {
3852 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003853 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003854 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003855 }
3856 }
Jooyung Han1724d582022-12-21 10:17:44 +09003857 if !matchFound {
3858 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003859 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003860 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003861
Jooyung Han31c470b2019-10-18 16:26:59 +09003862 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003864 t.Log("surplus files", surplus)
3865 failed = true
3866 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003868 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003869 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003870 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003871 if !filesMatched[expected] {
3872 missing = append(missing, expected)
3873 }
3874 }
3875 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003876 t.Log("missing files", missing)
3877 failed = true
3878 }
3879 if failed {
3880 t.Fail()
3881 }
3882}
3883
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003884func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3885 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3886}
3887
3888func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003889 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003890 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3891 if deapexer.Output != nil {
3892 outputs = append(outputs, deapexer.Output.String())
3893 }
3894 for _, output := range deapexer.ImplicitOutputs {
3895 outputs = append(outputs, output.String())
3896 }
3897 actualFiles := make([]fileInApex, 0, len(outputs))
3898 for _, output := range outputs {
3899 dir := "/deapexer/"
3900 pos := strings.LastIndex(output, dir)
3901 if pos == -1 {
3902 t.Fatal("Unknown deapexer output ", output)
3903 }
3904 path := output[pos+len(dir):]
3905 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3906 }
3907 assertFileListEquals(t, files, actualFiles)
3908}
3909
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910func vndkLibrariesTxtFiles(vers ...string) (result string) {
3911 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003912 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003913 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003914 prebuilt_etc {
3915 name: "` + txt + `.libraries.` + v + `.txt",
3916 src: "dummy.txt",
3917 }
3918 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003919 }
3920 }
3921 return
3922}
3923
Jooyung Han344d5432019-08-23 11:17:39 +09003924func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003925 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003926 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003927 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003928 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003929 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003930 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003931 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003932 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003933 }
3934
3935 apex_key {
3936 name: "myapex.key",
3937 public_key: "testkey.avbpubkey",
3938 private_key: "testkey.pem",
3939 }
3940
Jooyung Han31c470b2019-10-18 16:26:59 +09003941 vndk_prebuilt_shared {
3942 name: "libvndk27",
3943 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003944 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003945 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003946 vndk: {
3947 enabled: true,
3948 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003949 target_arch: "arm64",
3950 arch: {
3951 arm: {
3952 srcs: ["libvndk27_arm.so"],
3953 },
3954 arm64: {
3955 srcs: ["libvndk27_arm64.so"],
3956 },
3957 },
Colin Cross2807f002021-03-02 10:15:29 -08003958 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003959 }
3960
3961 vndk_prebuilt_shared {
3962 name: "libvndk27",
3963 version: "27",
3964 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003965 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003966 vndk: {
3967 enabled: true,
3968 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003969 target_arch: "x86_64",
3970 arch: {
3971 x86: {
3972 srcs: ["libvndk27_x86.so"],
3973 },
3974 x86_64: {
3975 srcs: ["libvndk27_x86_64.so"],
3976 },
3977 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003978 }
3979 `+vndkLibrariesTxtFiles("27"),
3980 withFiles(map[string][]byte{
3981 "libvndk27_arm.so": nil,
3982 "libvndk27_arm64.so": nil,
3983 "libvndk27_x86.so": nil,
3984 "libvndk27_x86_64.so": nil,
3985 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003986
Jooyung Hana0503a52023-08-23 13:12:50 +09003987 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 "lib/libvndk27_arm.so",
3989 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003990 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003991 })
Jooyung Han344d5432019-08-23 11:17:39 +09003992}
3993
Jooyung Han90eee022019-10-01 20:02:42 +09003994func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003995 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003996 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003997 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003998 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003999 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004000 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004001 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004002 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004003 }
4004 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004005 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004006 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004008 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004009 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004010 }
4011 apex_key {
4012 name: "myapex.key",
4013 public_key: "testkey.avbpubkey",
4014 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004015 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004016
4017 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004018 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004019 apexManifestRule := module.Rule("apexManifestRule")
4020 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004021 }
4022
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004023 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004024 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004025}
4026
Jooyung Han344d5432019-08-23 11:17:39 +09004027func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004028 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004029 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004030 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004031 name: "com.android.vndk.v30",
4032 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004033 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004034 native_bridge_supported: true,
4035 }
4036
4037 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004038 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004039 public_key: "testkey.avbpubkey",
4040 private_key: "testkey.pem",
4041 }
4042
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004043 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004044 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004045 version: "30",
4046 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004047 srcs: ["mylib.cpp"],
4048 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004049 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004050 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004051 vndk: {
4052 enabled: true,
4053 },
Jooyung Han344d5432019-08-23 11:17:39 +09004054 }
4055 `)
4056}
4057
Jooyung Han31c470b2019-10-18 16:26:59 +09004058func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004059 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004060 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004062 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004064 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004065 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004066 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004067 }
4068
4069 apex_key {
4070 name: "myapex.key",
4071 public_key: "testkey.avbpubkey",
4072 private_key: "testkey.pem",
4073 }
4074
4075 vndk_prebuilt_shared {
4076 name: "libvndk27",
4077 version: "27",
4078 target_arch: "arm",
4079 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004080 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004081 vndk: {
4082 enabled: true,
4083 },
4084 arch: {
4085 arm: {
4086 srcs: ["libvndk27.so"],
4087 }
4088 },
4089 }
4090
4091 vndk_prebuilt_shared {
4092 name: "libvndk27",
4093 version: "27",
4094 target_arch: "arm",
4095 binder32bit: true,
4096 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004097 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004098 vndk: {
4099 enabled: true,
4100 },
4101 arch: {
4102 arm: {
4103 srcs: ["libvndk27binder32.so"],
4104 }
4105 },
Colin Cross2807f002021-03-02 10:15:29 -08004106 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004107 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004108 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 withFiles(map[string][]byte{
4110 "libvndk27.so": nil,
4111 "libvndk27binder32.so": nil,
4112 }),
4113 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004114 android.FixtureModifyConfig(func(config android.Config) {
4115 target := android.Target{
4116 Os: android.Android,
4117 Arch: android.Arch{
4118 ArchType: android.Arm,
4119 ArchVariant: "armv7-a-neon",
4120 Abi: []string{"armeabi-v7a"},
4121 },
4122 NativeBridge: android.NativeBridgeDisabled,
4123 NativeBridgeHostArchName: "",
4124 NativeBridgeRelativePath: "",
4125 }
4126 config.Targets[android.Android] = []android.Target{target}
4127 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 }),
4129 )
4130
Jooyung Hana0503a52023-08-23 13:12:50 +09004131 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004132 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004133 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 })
4135}
4136
Jooyung Hane1633032019-08-01 17:41:43 +09004137func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004139 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004140 apex {
4141 name: "myapex_nodep",
4142 key: "myapex.key",
4143 native_shared_libs: ["lib_nodep"],
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_dep",
4151 key: "myapex.key",
4152 native_shared_libs: ["lib_dep"],
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_provider",
4160 key: "myapex.key",
4161 native_shared_libs: ["libfoo"],
4162 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 {
4168 name: "myapex_selfcontained",
4169 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004170 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004171 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004172 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004173 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004174 }
4175
4176 apex_key {
4177 name: "myapex.key",
4178 public_key: "testkey.avbpubkey",
4179 private_key: "testkey.pem",
4180 }
4181
4182 cc_library {
4183 name: "lib_nodep",
4184 srcs: ["mylib.cpp"],
4185 system_shared_libs: [],
4186 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004187 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004188 }
4189
4190 cc_library {
4191 name: "lib_dep",
4192 srcs: ["mylib.cpp"],
4193 shared_libs: ["libfoo"],
4194 system_shared_libs: [],
4195 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004196 apex_available: [
4197 "myapex_dep",
4198 "myapex_provider",
4199 "myapex_selfcontained",
4200 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004201 }
4202
4203 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004204 name: "lib_dep_on_bar",
4205 srcs: ["mylib.cpp"],
4206 shared_libs: ["libbar"],
4207 system_shared_libs: [],
4208 stl: "none",
4209 apex_available: [
4210 "myapex_selfcontained",
4211 ],
4212 }
4213
4214
4215 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004216 name: "libfoo",
4217 srcs: ["mytest.cpp"],
4218 stubs: {
4219 versions: ["1"],
4220 },
4221 system_shared_libs: [],
4222 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004223 apex_available: [
4224 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004225 ],
4226 }
4227
4228 cc_library {
4229 name: "libbar",
4230 srcs: ["mytest.cpp"],
4231 stubs: {
4232 versions: ["1"],
4233 },
4234 system_shared_libs: [],
4235 stl: "none",
4236 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004237 "myapex_selfcontained",
4238 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004239 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004240
Jooyung Hane1633032019-08-01 17:41:43 +09004241 `)
4242
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004244 var provideNativeLibs, requireNativeLibs []string
4245
Jooyung Hana0503a52023-08-23 13:12:50 +09004246 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004247 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4248 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004249 ensureListEmpty(t, provideNativeLibs)
4250 ensureListEmpty(t, requireNativeLibs)
4251
Jooyung Hana0503a52023-08-23 13:12:50 +09004252 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004253 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4254 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004255 ensureListEmpty(t, provideNativeLibs)
4256 ensureListContains(t, requireNativeLibs, "libfoo.so")
4257
Jooyung Hana0503a52023-08-23 13:12:50 +09004258 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004259 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4260 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004261 ensureListContains(t, provideNativeLibs, "libfoo.so")
4262 ensureListEmpty(t, requireNativeLibs)
4263
Jooyung Hana0503a52023-08-23 13:12:50 +09004264 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004265 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4266 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004267 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004268 ensureListEmpty(t, requireNativeLibs)
4269}
4270
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004271func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004272 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 ctx := testApex(t, `
4274 apex {
4275 name: "myapex",
4276 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004277 native_shared_libs: ["mylib"],
4278 updatable: false,
4279 }
4280
4281 apex_key {
4282 name: "myapex.key",
4283 public_key: "testkey.avbpubkey",
4284 private_key: "testkey.pem",
4285 }
4286
4287 cc_library {
4288 name: "mylib",
4289 srcs: ["mylib.cpp"],
4290 system_shared_libs: [],
4291 stl: "none",
4292 apex_available: [
4293 "//apex_available:platform",
4294 "myapex",
4295 ],
4296 }
4297 `, android.FixtureMergeEnv(map[string]string{
4298 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4299 }))
4300
Jooyung Hana0503a52023-08-23 13:12:50 +09004301 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004302 apexManifestRule := module.Rule("apexManifestRule")
4303 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4304}
4305
Vinh Tran8f5310f2022-10-07 18:16:47 -04004306func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004307 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004308 testCases := []struct {
4309 compileMultiLibProp string
4310 containedLibs []string
4311 notContainedLibs []string
4312 }{
4313 {
4314 containedLibs: []string{
4315 "image.apex/lib64/mylib.so",
4316 "image.apex/lib/mylib.so",
4317 },
4318 compileMultiLibProp: `compile_multilib: "both",`,
4319 },
4320 {
4321 containedLibs: []string{"image.apex/lib64/mylib.so"},
4322 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4323 compileMultiLibProp: `compile_multilib: "first",`,
4324 },
4325 {
4326 containedLibs: []string{"image.apex/lib64/mylib.so"},
4327 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4328 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4329 },
4330 {
4331 containedLibs: []string{"image.apex/lib64/mylib.so"},
4332 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4333 compileMultiLibProp: `compile_multilib: "64",`,
4334 },
4335 {
4336 containedLibs: []string{"image.apex/lib/mylib.so"},
4337 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4338 compileMultiLibProp: `compile_multilib: "32",`,
4339 },
4340 }
4341 for _, testCase := range testCases {
4342 ctx := testApex(t, fmt.Sprintf(`
4343 apex {
4344 name: "myapex",
4345 key: "myapex.key",
4346 %s
4347 native_shared_libs: ["mylib"],
4348 updatable: false,
4349 }
4350 apex_key {
4351 name: "myapex.key",
4352 public_key: "testkey.avbpubkey",
4353 private_key: "testkey.pem",
4354 }
4355 cc_library {
4356 name: "mylib",
4357 srcs: ["mylib.cpp"],
4358 apex_available: [
4359 "//apex_available:platform",
4360 "myapex",
4361 ],
4362 }
4363 `, testCase.compileMultiLibProp),
4364 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004365 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004366 apexRule := module.Rule("apexRule")
4367 copyCmds := apexRule.Args["copy_commands"]
4368 for _, containedLib := range testCase.containedLibs {
4369 ensureContains(t, copyCmds, containedLib)
4370 }
4371 for _, notContainedLib := range testCase.notContainedLibs {
4372 ensureNotContains(t, copyCmds, notContainedLib)
4373 }
4374 }
4375}
4376
Alex Light0851b882019-02-07 13:20:53 -08004377func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004378 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004379 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004380 apex {
4381 name: "myapex",
4382 key: "myapex.key",
4383 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004384 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004385 }
4386
4387 apex_key {
4388 name: "myapex.key",
4389 public_key: "testkey.avbpubkey",
4390 private_key: "testkey.pem",
4391 }
4392
4393 cc_library {
4394 name: "mylib_common",
4395 srcs: ["mylib.cpp"],
4396 system_shared_libs: [],
4397 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004398 apex_available: [
4399 "//apex_available:platform",
4400 "myapex",
4401 ],
Alex Light0851b882019-02-07 13:20:53 -08004402 }
4403 `)
4404
Jooyung Hana0503a52023-08-23 13:12:50 +09004405 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004406 apexRule := module.Rule("apexRule")
4407 copyCmds := apexRule.Args["copy_commands"]
4408
4409 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4410 t.Log("Apex was a test apex!")
4411 t.Fail()
4412 }
4413 // Ensure that main rule creates an output
4414 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4415
4416 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004417 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004418
4419 // Ensure that both direct and indirect deps are copied into apex
4420 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4421
Colin Cross7113d202019-11-20 16:39:12 -08004422 // Ensure that the platform variant ends with _shared
4423 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004424
Colin Cross56a83212020-09-15 18:30:11 -07004425 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004426 t.Log("Found mylib_common not in any apex!")
4427 t.Fail()
4428 }
4429}
4430
4431func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004432 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004433 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004434 apex_test {
4435 name: "myapex",
4436 key: "myapex.key",
4437 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004438 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004439 }
4440
4441 apex_key {
4442 name: "myapex.key",
4443 public_key: "testkey.avbpubkey",
4444 private_key: "testkey.pem",
4445 }
4446
4447 cc_library {
4448 name: "mylib_common_test",
4449 srcs: ["mylib.cpp"],
4450 system_shared_libs: [],
4451 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004452 // TODO: remove //apex_available:platform
4453 apex_available: [
4454 "//apex_available:platform",
4455 "myapex",
4456 ],
Alex Light0851b882019-02-07 13:20:53 -08004457 }
4458 `)
4459
Jooyung Hana0503a52023-08-23 13:12:50 +09004460 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004461 apexRule := module.Rule("apexRule")
4462 copyCmds := apexRule.Args["copy_commands"]
4463
4464 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4465 t.Log("Apex was not a test apex!")
4466 t.Fail()
4467 }
4468 // Ensure that main rule creates an output
4469 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4470
4471 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004472 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004473
4474 // Ensure that both direct and indirect deps are copied into apex
4475 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4476
Colin Cross7113d202019-11-20 16:39:12 -08004477 // Ensure that the platform variant ends with _shared
4478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004479}
4480
Jooyung Han85707de2023-12-01 14:21:13 +09004481func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004482 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004483 ctx := testApex(t, `
4484 apex {
4485 name: "myapex",
4486 key: "myapex.key",
4487 updatable: false,
4488 binaries: ["mybin"],
4489 }
4490 apex {
4491 name: "myvendorapex",
4492 key: "myapex.key",
4493 file_contexts: "myvendorapex_file_contexts",
4494 vendor: true,
4495 updatable: false,
4496 binaries: ["mybin"],
4497 }
4498 apex_key {
4499 name: "myapex.key",
4500 public_key: "testkey.avbpubkey",
4501 private_key: "testkey.pem",
4502 }
4503 cc_binary {
4504 name: "mybin",
4505 vendor_available: true,
4506 system_shared_libs: [],
4507 stl: "none",
4508 shared_libs: ["libz"],
4509 apex_available: ["//apex_available:anyapex"],
4510 }
4511 cc_library {
4512 name: "libz",
4513 vendor_available: true,
4514 system_shared_libs: [],
4515 stl: "none",
4516 stubs: {
4517 versions: ["28", "30"],
4518 },
4519 target: {
4520 vendor: {
4521 no_stubs: true,
4522 },
4523 },
4524 }
4525 `, withFiles(map[string][]byte{
4526 "myvendorapex_file_contexts": nil,
4527 }))
4528
4529 // libz provides stubs for core variant.
4530 {
4531 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4532 "bin/mybin",
4533 })
4534 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4535 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4536 }
4537 // libz doesn't provide stubs for vendor variant.
4538 {
4539 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4540 "bin/mybin",
4541 "lib64/libz.so",
4542 })
4543 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4544 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4545 }
4546}
4547
Alex Light9670d332019-01-29 18:07:33 -08004548func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004549 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004550 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004551 apex {
4552 name: "myapex",
4553 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004554 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004555 multilib: {
4556 first: {
4557 native_shared_libs: ["mylib_common"],
4558 }
4559 },
4560 target: {
4561 android: {
4562 multilib: {
4563 first: {
4564 native_shared_libs: ["mylib"],
4565 }
4566 }
4567 },
4568 host: {
4569 multilib: {
4570 first: {
4571 native_shared_libs: ["mylib2"],
4572 }
4573 }
4574 }
4575 }
4576 }
4577
4578 apex_key {
4579 name: "myapex.key",
4580 public_key: "testkey.avbpubkey",
4581 private_key: "testkey.pem",
4582 }
4583
4584 cc_library {
4585 name: "mylib",
4586 srcs: ["mylib.cpp"],
4587 system_shared_libs: [],
4588 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004589 // TODO: remove //apex_available:platform
4590 apex_available: [
4591 "//apex_available:platform",
4592 "myapex",
4593 ],
Alex Light9670d332019-01-29 18:07:33 -08004594 }
4595
4596 cc_library {
4597 name: "mylib_common",
4598 srcs: ["mylib.cpp"],
4599 system_shared_libs: [],
4600 stl: "none",
4601 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004602 // TODO: remove //apex_available:platform
4603 apex_available: [
4604 "//apex_available:platform",
4605 "myapex",
4606 ],
Alex Light9670d332019-01-29 18:07:33 -08004607 }
4608
4609 cc_library {
4610 name: "mylib2",
4611 srcs: ["mylib.cpp"],
4612 system_shared_libs: [],
4613 stl: "none",
4614 compile_multilib: "first",
4615 }
4616 `)
4617
Jooyung Hana0503a52023-08-23 13:12:50 +09004618 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004619 copyCmds := apexRule.Args["copy_commands"]
4620
4621 // Ensure that main rule creates an output
4622 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4623
4624 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004625 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4626 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4627 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004628
4629 // Ensure that both direct and indirect deps are copied into apex
4630 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4631 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4632 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4633
Colin Cross7113d202019-11-20 16:39:12 -08004634 // Ensure that the platform variant ends with _shared
4635 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4636 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4637 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004638}
Jiyong Park04480cf2019-02-06 00:16:29 +09004639
Jiyong Park59140302020-12-14 18:44:04 +09004640func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004641 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004647 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 arch: {
4649 arm64: {
4650 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 x86_64: {
4654 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004655 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004656 },
4657 }
4658 }
4659
4660 apex_key {
4661 name: "myapex.key",
4662 public_key: "testkey.avbpubkey",
4663 private_key: "testkey.pem",
4664 }
4665
4666 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004667 name: "mylib.generic",
4668 srcs: ["mylib.cpp"],
4669 system_shared_libs: [],
4670 stl: "none",
4671 // TODO: remove //apex_available:platform
4672 apex_available: [
4673 "//apex_available:platform",
4674 "myapex",
4675 ],
4676 }
4677
4678 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004679 name: "mylib.arm64",
4680 srcs: ["mylib.cpp"],
4681 system_shared_libs: [],
4682 stl: "none",
4683 // TODO: remove //apex_available:platform
4684 apex_available: [
4685 "//apex_available:platform",
4686 "myapex",
4687 ],
4688 }
4689
4690 cc_library {
4691 name: "mylib.x64",
4692 srcs: ["mylib.cpp"],
4693 system_shared_libs: [],
4694 stl: "none",
4695 // TODO: remove //apex_available:platform
4696 apex_available: [
4697 "//apex_available:platform",
4698 "myapex",
4699 ],
4700 }
4701 `)
4702
Jooyung Hana0503a52023-08-23 13:12:50 +09004703 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004704 copyCmds := apexRule.Args["copy_commands"]
4705
4706 // Ensure that apex variant is created for the direct dep
4707 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004708 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004709 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4710
4711 // Ensure that both direct and indirect deps are copied into apex
4712 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4713 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4714}
4715
Jiyong Park04480cf2019-02-06 00:16:29 +09004716func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004718 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004719 apex {
4720 name: "myapex",
4721 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004722 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004723 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004724 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004725 }
4726
4727 apex_key {
4728 name: "myapex.key",
4729 public_key: "testkey.avbpubkey",
4730 private_key: "testkey.pem",
4731 }
4732
4733 sh_binary {
4734 name: "myscript",
4735 src: "mylib.cpp",
4736 filename: "myscript.sh",
4737 sub_dir: "script",
4738 }
4739 `)
4740
Jooyung Hana0503a52023-08-23 13:12:50 +09004741 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004742 copyCmds := apexRule.Args["copy_commands"]
4743
4744 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4745}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004746
Jooyung Han91df2082019-11-20 01:49:42 +09004747func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004748 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004749 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004750 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004751 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004752 {"", "system"},
4753 {"product_specific: true", "product"},
4754 {"soc_specific: true", "vendor"},
4755 {"proprietary: true", "vendor"},
4756 {"vendor: true", "vendor"},
4757 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004758 }
4759 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004760 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004761 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004762 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004763 apex {
4764 name: "myapex",
4765 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004766 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004767 `+tc.propName+`
4768 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004769
Jooyung Han91df2082019-11-20 01:49:42 +09004770 apex_key {
4771 name: "myapex.key",
4772 public_key: "testkey.avbpubkey",
4773 private_key: "testkey.pem",
4774 }
4775 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004776
Jooyung Hana0503a52023-08-23 13:12:50 +09004777 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004778 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004779 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004780 if actual != expected {
4781 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4782 }
Jooyung Han91df2082019-11-20 01:49:42 +09004783 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004784 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004785}
Jiyong Park67882562019-03-21 01:11:21 +09004786
Jooyung Han580eb4f2020-06-24 19:33:06 +09004787func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004788 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004789 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 apex {
4791 name: "myapex",
4792 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004793 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004794 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004795
Jooyung Han580eb4f2020-06-24 19:33:06 +09004796 apex_key {
4797 name: "myapex.key",
4798 public_key: "testkey.avbpubkey",
4799 private_key: "testkey.pem",
4800 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004801 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004802 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803 rule := module.Output("file_contexts")
4804 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4805}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004806
Jooyung Han580eb4f2020-06-24 19:33:06 +09004807func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004808 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004809 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004810 apex {
4811 name: "myapex",
4812 key: "myapex.key",
4813 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004814 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004815 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004816
Jooyung Han580eb4f2020-06-24 19:33:06 +09004817 apex_key {
4818 name: "myapex.key",
4819 public_key: "testkey.avbpubkey",
4820 private_key: "testkey.pem",
4821 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822 `, withFiles(map[string][]byte{
4823 "my_own_file_contexts": nil,
4824 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004825}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004826
Jooyung Han580eb4f2020-06-24 19:33:06 +09004827func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004828 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004829 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004830 apex {
4831 name: "myapex",
4832 key: "myapex.key",
4833 product_specific: true,
4834 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004835 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004836 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004837
Jooyung Han580eb4f2020-06-24 19:33:06 +09004838 apex_key {
4839 name: "myapex.key",
4840 public_key: "testkey.avbpubkey",
4841 private_key: "testkey.pem",
4842 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004843 `)
4844
Colin Cross1c460562021-02-16 17:55:47 -08004845 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004846 apex {
4847 name: "myapex",
4848 key: "myapex.key",
4849 product_specific: true,
4850 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004851 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004852 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004853
Jooyung Han580eb4f2020-06-24 19:33:06 +09004854 apex_key {
4855 name: "myapex.key",
4856 public_key: "testkey.avbpubkey",
4857 private_key: "testkey.pem",
4858 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004859 `, withFiles(map[string][]byte{
4860 "product_specific_file_contexts": nil,
4861 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004862 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863 rule := module.Output("file_contexts")
4864 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4865}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004866
Jooyung Han580eb4f2020-06-24 19:33:06 +09004867func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004868 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004869 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004870 apex {
4871 name: "myapex",
4872 key: "myapex.key",
4873 product_specific: true,
4874 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004875 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004876 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004877
Jooyung Han580eb4f2020-06-24 19:33:06 +09004878 apex_key {
4879 name: "myapex.key",
4880 public_key: "testkey.avbpubkey",
4881 private_key: "testkey.pem",
4882 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004883
Jooyung Han580eb4f2020-06-24 19:33:06 +09004884 filegroup {
4885 name: "my-file-contexts",
4886 srcs: ["product_specific_file_contexts"],
4887 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004888 `, withFiles(map[string][]byte{
4889 "product_specific_file_contexts": nil,
4890 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004891 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004892 rule := module.Output("file_contexts")
4893 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004894}
4895
Jiyong Park67882562019-03-21 01:11:21 +09004896func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004897 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004898 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004899 apex_key {
4900 name: "myapex.key",
4901 public_key: ":my.avbpubkey",
4902 private_key: ":my.pem",
4903 product_specific: true,
4904 }
4905
4906 filegroup {
4907 name: "my.avbpubkey",
4908 srcs: ["testkey2.avbpubkey"],
4909 }
4910
4911 filegroup {
4912 name: "my.pem",
4913 srcs: ["testkey2.pem"],
4914 }
4915 `)
4916
4917 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4918 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004919 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004920 if actual_pubkey != expected_pubkey {
4921 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4922 }
4923 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004924 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004925 if actual_privkey != expected_privkey {
4926 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4927 }
4928}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929
4930func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004931 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004932 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004933 prebuilt_apex {
4934 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004935 arch: {
4936 arm64: {
4937 src: "myapex-arm64.apex",
4938 },
4939 arm: {
4940 src: "myapex-arm.apex",
4941 },
4942 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004943 }
4944 `)
4945
Wei Li340ee8e2022-03-18 17:33:24 -07004946 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4947 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004948
Jiyong Parkc95714e2019-03-29 14:23:10 +09004949 expectedInput := "myapex-arm64.apex"
4950 if prebuilt.inputApex.String() != expectedInput {
4951 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4952 }
Wei Li340ee8e2022-03-18 17:33:24 -07004953 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4954 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4955 rule := testingModule.Rule("genProvenanceMetaData")
4956 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4957 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4958 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4959 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004960
4961 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4962 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004963}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004964
Paul Duffinc0609c62021-03-01 17:27:16 +00004965func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004967 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004968 prebuilt_apex {
4969 name: "myapex",
4970 }
4971 `)
4972}
4973
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004974func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004975 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004976 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004977 prebuilt_apex {
4978 name: "myapex",
4979 src: "myapex-arm.apex",
4980 filename: "notmyapex.apex",
4981 }
4982 `)
4983
Wei Li340ee8e2022-03-18 17:33:24 -07004984 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4985 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004986
4987 expected := "notmyapex.apex"
4988 if p.installFilename != expected {
4989 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4990 }
Wei Li340ee8e2022-03-18 17:33:24 -07004991 rule := testingModule.Rule("genProvenanceMetaData")
4992 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4993 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4994 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4995 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004996}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004997
Samiul Islam7c02e262021-09-08 17:48:28 +01004998func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004999 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005000 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.apex"
5006 }
5007 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5008
5009 testApex(t, `
5010 apex_set {
5011 name: "com.company.android.myapex",
5012 apex_name: "com.android.myapex",
5013 set: "company-myapex.apks",
5014 filename: "com.company.android.myapex.capex"
5015 }
5016 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5017
5018 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5019 apex_set {
5020 name: "com.company.android.myapex",
5021 apex_name: "com.android.myapex",
5022 set: "company-myapex.apks",
5023 filename: "some-random-suffix"
5024 }
5025 `)
5026}
5027
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005028func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005029 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005030 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005031 prebuilt_apex {
5032 name: "myapex.prebuilt",
5033 src: "myapex-arm.apex",
5034 overrides: [
5035 "myapex",
5036 ],
5037 }
5038 `)
5039
Wei Li340ee8e2022-03-18 17:33:24 -07005040 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5041 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005042
5043 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005044 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005045 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005046 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005047 }
Wei Li340ee8e2022-03-18 17:33:24 -07005048 rule := testingModule.Rule("genProvenanceMetaData")
5049 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5050 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5051 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5052 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005053}
5054
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005055func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005056 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005057 testApex(t, `
5058 prebuilt_apex {
5059 name: "com.company.android.myapex",
5060 apex_name: "com.android.myapex",
5061 src: "company-myapex-arm.apex",
5062 }
5063 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5064
5065 testApex(t, `
5066 apex_set {
5067 name: "com.company.android.myapex",
5068 apex_name: "com.android.myapex",
5069 set: "company-myapex.apks",
5070 }
5071 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5072}
5073
5074func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005075 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005076 _ = android.GroupFixturePreparers(
5077 java.PrepareForTestWithJavaDefaultModules,
5078 PrepareForTestWithApexBuildComponents,
5079 android.FixtureWithRootAndroidBp(`
5080 platform_bootclasspath {
5081 name: "platform-bootclasspath",
5082 fragments: [
5083 {
5084 apex: "com.android.art",
5085 module: "art-bootclasspath-fragment",
5086 },
5087 ],
5088 }
5089
5090 prebuilt_apex {
5091 name: "com.company.android.art",
5092 apex_name: "com.android.art",
5093 src: "com.company.android.art-arm.apex",
5094 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5095 }
5096
5097 prebuilt_bootclasspath_fragment {
5098 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005099 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005100 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005101 hidden_api: {
5102 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5103 metadata: "my-bootclasspath-fragment/metadata.csv",
5104 index: "my-bootclasspath-fragment/index.csv",
5105 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5106 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5107 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005108 }
5109
5110 java_import {
5111 name: "core-oj",
5112 jars: ["prebuilt.jar"],
5113 }
5114 `),
5115 ).RunTest(t)
5116}
5117
Spandan Das59a4a2b2024-01-09 21:35:56 +00005118// A minimal context object for use with DexJarBuildPath
5119type moduleErrorfTestCtx struct {
5120}
5121
5122func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5123}
5124
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005125func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005126 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005127 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005128 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005129 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5130 // is disabled.
5131 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005132
5133 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5134 // file creation.
5135 java.FixtureConfigureBootJars("platform:foo"),
5136 android.FixtureModifyMockFS(func(fs android.MockFS) {
5137 fs["platform/Android.bp"] = []byte(`
5138 java_library {
5139 name: "foo",
5140 srcs: ["Test.java"],
5141 compile_dex: true,
5142 }
5143 `)
5144 fs["platform/Test.java"] = nil
5145 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005146 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005147
Paul Duffin40a3f652021-07-19 13:11:24 +01005148 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005149 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005150 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005151 var rule android.TestingBuildParams
5152
5153 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5154 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005155 }
5156
Paul Duffin40a3f652021-07-19 13:11:24 +01005157 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5158 t.Helper()
5159 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5160 var rule android.TestingBuildParams
5161
5162 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5163 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5164 }
5165
Paul Duffin89f570a2021-06-16 01:42:33 +01005166 fragment := java.ApexVariantReference{
5167 Apex: proptools.StringPtr("myapex"),
5168 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5169 }
5170
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005171 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005172 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005173 bp := `
5174 prebuilt_apex {
5175 name: "myapex",
5176 arch: {
5177 arm64: {
5178 src: "myapex-arm64.apex",
5179 },
5180 arm: {
5181 src: "myapex-arm.apex",
5182 },
5183 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005184 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5185 }
5186
5187 prebuilt_bootclasspath_fragment {
5188 name: "my-bootclasspath-fragment",
5189 contents: ["libfoo", "libbar"],
5190 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005191 hidden_api: {
5192 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5193 metadata: "my-bootclasspath-fragment/metadata.csv",
5194 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005195 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5196 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5197 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005198 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005199 }
5200
Spandan Das52c01a12024-09-20 01:09:48 +00005201 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005203 public: {
5204 jars: ["libfoo.jar"],
5205 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005206 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005207 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005208 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005209 }
Paul Duffin37856732021-02-26 14:24:15 +00005210
5211 java_sdk_library_import {
5212 name: "libbar",
5213 public: {
5214 jars: ["libbar.jar"],
5215 },
5216 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005217 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005218 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005219 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005220 `
5221
Paul Duffin89f570a2021-06-16 01:42:33 +01005222 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005223
Paul Duffin537ea3d2021-05-14 10:38:00 +01005224 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005225 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005226 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005227 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005228 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005229 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 +01005230 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005231 })
5232
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005233 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005234 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005235 bp := `
5236 apex_set {
5237 name: "myapex",
5238 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005240 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5241 }
5242
Paul Duffin89f570a2021-06-16 01:42:33 +01005243 prebuilt_bootclasspath_fragment {
5244 name: "my-bootclasspath-fragment",
5245 contents: ["libfoo", "libbar"],
5246 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005247 hidden_api: {
5248 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5249 metadata: "my-bootclasspath-fragment/metadata.csv",
5250 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005251 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5252 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5253 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005254 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005255 }
5256
Liz Kammer2dc72442023-04-20 10:10:48 -04005257 prebuilt_systemserverclasspath_fragment {
5258 name: "my-systemserverclasspath-fragment",
5259 contents: ["libbaz"],
5260 apex_available: ["myapex"],
5261 }
5262
Spandan Das52c01a12024-09-20 01:09:48 +00005263 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005265 public: {
5266 jars: ["libfoo.jar"],
5267 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005268 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005269 shared_library: false,
5270 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005271 }
5272
Spandan Das52c01a12024-09-20 01:09:48 +00005273
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005274 java_sdk_library_import {
5275 name: "libbar",
5276 public: {
5277 jars: ["libbar.jar"],
5278 },
5279 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005280 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005281 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005282 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005283
5284 java_sdk_library_import {
5285 name: "libbaz",
5286 public: {
5287 jars: ["libbaz.jar"],
5288 },
5289 apex_available: ["myapex"],
5290 shared_library: false,
5291 permitted_packages: ["baz"],
5292 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005293 `
5294
Paul Duffin89f570a2021-06-16 01:42:33 +01005295 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005296
Paul Duffin537ea3d2021-05-14 10:38:00 +01005297 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005298 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005299 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005300 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005301 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005302 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 +01005303 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005304
5305 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5306
5307 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005308 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005309 "myjavalib.myapex",
5310 "libfoo.myapex",
5311 "libbar.myapex",
5312 "libbaz.myapex",
5313 }
5314 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5315 for i, e := range mkEntries {
5316 g := e.OverrideName
5317 if w := overrideNames[i]; w != g {
5318 t.Errorf("Expected override name %q, got %q", w, g)
5319 }
5320 }
5321
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005322 })
5323
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005324 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005325 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005326 bp := `
5327 prebuilt_apex {
5328 name: "myapex",
5329 arch: {
5330 arm64: {
5331 src: "myapex-arm64.apex",
5332 },
5333 arm: {
5334 src: "myapex-arm.apex",
5335 },
5336 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005337 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5338 }
5339
5340 prebuilt_bootclasspath_fragment {
5341 name: "my-bootclasspath-fragment",
5342 contents: ["libfoo", "libbar"],
5343 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005344 hidden_api: {
5345 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5346 metadata: "my-bootclasspath-fragment/metadata.csv",
5347 index: "my-bootclasspath-fragment/index.csv",
5348 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5349 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5350 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005351 }
5352
5353 java_import {
5354 name: "libfoo",
5355 jars: ["libfoo.jar"],
5356 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005357 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005358 }
5359
5360 java_library {
5361 name: "libfoo",
5362 srcs: ["foo/bar/MyClass.java"],
5363 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005364 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005365 }
Paul Duffin37856732021-02-26 14:24:15 +00005366
5367 java_sdk_library_import {
5368 name: "libbar",
5369 public: {
5370 jars: ["libbar.jar"],
5371 },
5372 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005373 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005374 }
5375
5376 java_sdk_library {
5377 name: "libbar",
5378 srcs: ["foo/bar/MyClass.java"],
5379 unsafe_ignore_missing_latest_api: true,
5380 apex_available: ["myapex"],
5381 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005382 `
5383
5384 // In this test the source (java_library) libfoo is active since the
5385 // prebuilt (java_import) defaults to prefer:false. However the
5386 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5387 // find the dex boot jar in it. We either need to disable the source libfoo
5388 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005390 // dexbootjar check is skipped if AllowMissingDependencies is true
5391 preparerAllowMissingDeps := android.GroupFixturePreparers(
5392 preparer,
5393 android.PrepareForTestWithAllowMissingDependencies,
5394 )
5395 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 })
5397
5398 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005399 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005401 apex {
5402 name: "myapex",
5403 key: "myapex.key",
5404 updatable: false,
5405 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5406 }
5407
5408 apex_key {
5409 name: "myapex.key",
5410 public_key: "testkey.avbpubkey",
5411 private_key: "testkey.pem",
5412 }
5413
5414 bootclasspath_fragment {
5415 name: "my-bootclasspath-fragment",
5416 contents: ["libfoo", "libbar"],
5417 apex_available: ["myapex"],
5418 hidden_api: {
5419 split_packages: ["*"],
5420 },
5421 }
5422
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005423 prebuilt_apex {
5424 name: "myapex",
5425 arch: {
5426 arm64: {
5427 src: "myapex-arm64.apex",
5428 },
5429 arm: {
5430 src: "myapex-arm.apex",
5431 },
5432 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005433 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5434 }
5435
5436 prebuilt_bootclasspath_fragment {
5437 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005438 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005439 contents: ["libfoo", "libbar"],
5440 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005441 hidden_api: {
5442 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5443 metadata: "my-bootclasspath-fragment/metadata.csv",
5444 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005445 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5446 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5447 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005448 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005449 }
5450
Spandan Das52c01a12024-09-20 01:09:48 +00005451 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 name: "libfoo",
5453 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005454 public: {
5455 jars: ["libfoo.jar"],
5456 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005457 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005458 shared_library: false,
5459 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005460 }
5461
5462 java_library {
5463 name: "libfoo",
5464 srcs: ["foo/bar/MyClass.java"],
5465 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005466 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005467 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005468 }
Paul Duffin37856732021-02-26 14:24:15 +00005469
5470 java_sdk_library_import {
5471 name: "libbar",
5472 prefer: true,
5473 public: {
5474 jars: ["libbar.jar"],
5475 },
5476 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005477 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005478 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005479 }
5480
5481 java_sdk_library {
5482 name: "libbar",
5483 srcs: ["foo/bar/MyClass.java"],
5484 unsafe_ignore_missing_latest_api: true,
5485 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005486 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005487 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005488 `
5489
Paul Duffin89f570a2021-06-16 01:42:33 +01005490 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005491
Paul Duffin537ea3d2021-05-14 10:38:00 +01005492 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005493 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005494 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005495 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005496 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005497 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 +01005498 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 })
5500
5501 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005502 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005503 bp := `
5504 apex {
5505 name: "myapex",
5506 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005507 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005508 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 }
5510
5511 apex_key {
5512 name: "myapex.key",
5513 public_key: "testkey.avbpubkey",
5514 private_key: "testkey.pem",
5515 }
5516
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005517 bootclasspath_fragment {
5518 name: "my-bootclasspath-fragment",
5519 contents: ["libfoo", "libbar"],
5520 apex_available: ["myapex"],
5521 hidden_api: {
5522 split_packages: ["*"],
5523 },
5524 }
5525
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005526 prebuilt_apex {
5527 name: "myapex",
5528 arch: {
5529 arm64: {
5530 src: "myapex-arm64.apex",
5531 },
5532 arm: {
5533 src: "myapex-arm.apex",
5534 },
5535 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005536 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5537 }
5538
5539 prebuilt_bootclasspath_fragment {
5540 name: "my-bootclasspath-fragment",
5541 contents: ["libfoo", "libbar"],
5542 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005543 hidden_api: {
5544 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5545 metadata: "my-bootclasspath-fragment/metadata.csv",
5546 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005547 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5548 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5549 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005550 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005551 }
5552
5553 java_import {
5554 name: "libfoo",
5555 jars: ["libfoo.jar"],
5556 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005557 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005558 }
5559
5560 java_library {
5561 name: "libfoo",
5562 srcs: ["foo/bar/MyClass.java"],
5563 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005564 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005565 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005566 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 }
Paul Duffin37856732021-02-26 14:24:15 +00005568
5569 java_sdk_library_import {
5570 name: "libbar",
5571 public: {
5572 jars: ["libbar.jar"],
5573 },
5574 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005575 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005576 }
5577
5578 java_sdk_library {
5579 name: "libbar",
5580 srcs: ["foo/bar/MyClass.java"],
5581 unsafe_ignore_missing_latest_api: true,
5582 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005583 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005584 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005585 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005586 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005587 `
5588
Paul Duffin89f570a2021-06-16 01:42:33 +01005589 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005590
Paul Duffin537ea3d2021-05-14 10:38:00 +01005591 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005592 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005593 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5594 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005595 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5596 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 +01005597 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 })
5599
5600 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005601 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005602 bp := `
5603 apex {
5604 name: "myapex",
5605 enabled: false,
5606 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005607 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 }
5609
5610 apex_key {
5611 name: "myapex.key",
5612 public_key: "testkey.avbpubkey",
5613 private_key: "testkey.pem",
5614 }
5615
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005616 bootclasspath_fragment {
5617 name: "my-bootclasspath-fragment",
5618 enabled: false,
5619 contents: ["libfoo", "libbar"],
5620 apex_available: ["myapex"],
5621 hidden_api: {
5622 split_packages: ["*"],
5623 },
5624 }
5625
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005626 prebuilt_apex {
5627 name: "myapex",
5628 arch: {
5629 arm64: {
5630 src: "myapex-arm64.apex",
5631 },
5632 arm: {
5633 src: "myapex-arm.apex",
5634 },
5635 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005636 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5637 }
5638
5639 prebuilt_bootclasspath_fragment {
5640 name: "my-bootclasspath-fragment",
5641 contents: ["libfoo", "libbar"],
5642 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005643 hidden_api: {
5644 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5645 metadata: "my-bootclasspath-fragment/metadata.csv",
5646 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005647 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5648 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5649 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005650 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 }
5652
5653 java_import {
5654 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005655 jars: ["libfoo.jar"],
5656 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005657 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005658 }
5659
5660 java_library {
5661 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005662 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005663 srcs: ["foo/bar/MyClass.java"],
5664 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005665 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005666 }
Paul Duffin37856732021-02-26 14:24:15 +00005667
5668 java_sdk_library_import {
5669 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005670 public: {
5671 jars: ["libbar.jar"],
5672 },
5673 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005674 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005675 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005676 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005677 }
5678
5679 java_sdk_library {
5680 name: "libbar",
5681 srcs: ["foo/bar/MyClass.java"],
5682 unsafe_ignore_missing_latest_api: true,
5683 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005684 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005685 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005686 `
Cole Fausta963b942024-04-11 17:43:00 -07005687 // This test disables libbar, which causes the ComponentDepsMutator to add
5688 // deps on libbar.stubs and other sub-modules that don't exist. We can
5689 // enable AllowMissingDependencies to work around that, but enabling that
5690 // causes extra checks for missing source files to dex_bootjars, so add those
5691 // to the mock fs as well.
5692 preparer2 := android.GroupFixturePreparers(
5693 preparer,
5694 android.PrepareForTestWithAllowMissingDependencies,
5695 android.FixtureMergeMockFs(map[string][]byte{
5696 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005697 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005698 }),
5699 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005700
Cole Fausta963b942024-04-11 17:43:00 -07005701 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005702
Paul Duffin537ea3d2021-05-14 10:38:00 +01005703 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005704 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005705 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005706 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005707 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005708 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 +01005709 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005710 })
Spandan Das3a392012024-01-17 18:26:27 +00005711
Spandan Dasf2c10572024-02-27 04:49:52 +00005712 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005713 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005714 bp := `
5715 // Source
5716 apex {
5717 name: "myapex",
5718 enabled: false,
5719 key: "myapex.key",
5720 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5721 }
5722
5723 apex_key {
5724 name: "myapex.key",
5725 public_key: "testkey.avbpubkey",
5726 private_key: "testkey.pem",
5727 }
5728
5729 // Prebuilt
5730 prebuilt_apex {
5731 name: "myapex.v1",
5732 source_apex_name: "myapex",
5733 arch: {
5734 arm64: {
5735 src: "myapex-arm64.apex",
5736 },
5737 arm: {
5738 src: "myapex-arm.apex",
5739 },
5740 },
5741 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5742 prefer: true,
5743 }
5744 prebuilt_apex {
5745 name: "myapex.v2",
5746 source_apex_name: "myapex",
5747 arch: {
5748 arm64: {
5749 src: "myapex-arm64.apex",
5750 },
5751 arm: {
5752 src: "myapex-arm.apex",
5753 },
5754 },
5755 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5756 prefer: true,
5757 }
5758
5759 prebuilt_bootclasspath_fragment {
5760 name: "my-bootclasspath-fragment",
5761 contents: ["libfoo", "libbar"],
5762 apex_available: ["myapex"],
5763 hidden_api: {
5764 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5765 metadata: "my-bootclasspath-fragment/metadata.csv",
5766 index: "my-bootclasspath-fragment/index.csv",
5767 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5768 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5769 },
5770 prefer: true,
5771 }
5772
5773 java_import {
5774 name: "libfoo",
5775 jars: ["libfoo.jar"],
5776 apex_available: ["myapex"],
5777 prefer: true,
5778 }
5779 java_import {
5780 name: "libbar",
5781 jars: ["libbar.jar"],
5782 apex_available: ["myapex"],
5783 prefer: true,
5784 }
5785 `
5786
Spandan Dasf2c10572024-02-27 04:49:52 +00005787 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 +00005788 })
5789
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005790}
5791
Roland Levillain630846d2019-06-26 12:48:34 +01005792func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005793 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005794 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005795 apex_test {
5796 name: "myapex",
5797 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005798 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005799 tests: [
5800 "mytest",
5801 ],
5802 }
5803
5804 apex_key {
5805 name: "myapex.key",
5806 public_key: "testkey.avbpubkey",
5807 private_key: "testkey.pem",
5808 }
5809
Liz Kammer1c14a212020-05-12 15:26:55 -07005810 filegroup {
5811 name: "fg",
5812 srcs: [
5813 "baz",
5814 "bar/baz"
5815 ],
5816 }
5817
Roland Levillain630846d2019-06-26 12:48:34 +01005818 cc_test {
5819 name: "mytest",
5820 gtest: false,
5821 srcs: ["mytest.cpp"],
5822 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005823 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005824 system_shared_libs: [],
5825 static_executable: true,
5826 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005827 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005828 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005829
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005830 cc_library {
5831 name: "mylib",
5832 srcs: ["mylib.cpp"],
5833 system_shared_libs: [],
5834 stl: "none",
5835 }
5836
Liz Kammer5bd365f2020-05-27 15:15:11 -07005837 filegroup {
5838 name: "fg2",
5839 srcs: [
5840 "testdata/baz"
5841 ],
5842 }
Roland Levillain630846d2019-06-26 12:48:34 +01005843 `)
5844
Jooyung Hana0503a52023-08-23 13:12:50 +09005845 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005846 copyCmds := apexRule.Args["copy_commands"]
5847
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005848 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005849 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005850 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005851
Liz Kammer1c14a212020-05-12 15:26:55 -07005852 //Ensure that test data are copied into apex.
5853 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5854 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5855
Roland Levillainf89cd092019-07-29 16:22:59 +01005856 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005857 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005858 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005859 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005860 prefix := "TARGET_"
5861 var builder strings.Builder
5862 data.Custom(&builder, name, prefix, "", data)
5863 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005864 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005865 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005866}
5867
Jooyung Hand48f3c32019-08-23 11:18:57 +09005868func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005869 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005870 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5871 apex {
5872 name: "myapex",
5873 key: "myapex.key",
5874 native_shared_libs: ["libfoo"],
5875 }
5876
5877 apex_key {
5878 name: "myapex.key",
5879 public_key: "testkey.avbpubkey",
5880 private_key: "testkey.pem",
5881 }
5882
5883 cc_library {
5884 name: "libfoo",
5885 stl: "none",
5886 system_shared_libs: [],
5887 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005888 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005889 }
5890 `)
5891 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5892 apex {
5893 name: "myapex",
5894 key: "myapex.key",
5895 java_libs: ["myjar"],
5896 }
5897
5898 apex_key {
5899 name: "myapex.key",
5900 public_key: "testkey.avbpubkey",
5901 private_key: "testkey.pem",
5902 }
5903
5904 java_library {
5905 name: "myjar",
5906 srcs: ["foo/bar/MyClass.java"],
5907 sdk_version: "none",
5908 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005909 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005910 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005911 }
5912 `)
5913}
5914
Bill Peckhama41a6962021-01-11 10:58:54 -08005915func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005916 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005917 apex {
5918 name: "myapex",
5919 key: "myapex.key",
5920 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005921 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005922 }
5923
5924 apex_key {
5925 name: "myapex.key",
5926 public_key: "testkey.avbpubkey",
5927 private_key: "testkey.pem",
5928 }
5929
5930 java_import {
5931 name: "myjavaimport",
5932 apex_available: ["myapex"],
5933 jars: ["my.jar"],
5934 compile_dex: true,
5935 }
5936 `)
5937
Jooyung Hana0503a52023-08-23 13:12:50 +09005938 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005939 apexRule := module.Rule("apexRule")
5940 copyCmds := apexRule.Args["copy_commands"]
5941 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5942}
5943
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005945 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005946 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005947 apex {
5948 name: "myapex",
5949 key: "myapex.key",
5950 apps: [
5951 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005952 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005953 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005954 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005955 }
5956
5957 apex_key {
5958 name: "myapex.key",
5959 public_key: "testkey.avbpubkey",
5960 private_key: "testkey.pem",
5961 }
5962
5963 android_app {
5964 name: "AppFoo",
5965 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005966 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005967 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005968 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005969 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005970 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005971 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005972 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005973
5974 android_app {
5975 name: "AppFooPriv",
5976 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005977 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005978 system_modules: "none",
5979 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005980 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005981 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005982 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005983 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005984
5985 cc_library_shared {
5986 name: "libjni",
5987 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005988 shared_libs: ["libfoo"],
5989 stl: "none",
5990 system_shared_libs: [],
5991 apex_available: [ "myapex" ],
5992 sdk_version: "current",
5993 }
5994
5995 cc_library_shared {
5996 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005997 stl: "none",
5998 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005999 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006000 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006001 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 `)
6003
Jooyung Hana0503a52023-08-23 13:12:50 +09006004 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006005 apexRule := module.Rule("apexRule")
6006 copyCmds := apexRule.Args["copy_commands"]
6007
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006008 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6009 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006010 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011
Colin Crossaede88c2020-08-11 12:17:01 -07006012 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006013 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006014 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006015 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006016 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // JNI libraries including transitive deps are
6018 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006019 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006020 // ... embedded inside APK (jnilibs.zip)
6021 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6022 // ... and not directly inside the APEX
6023 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6024 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006025
6026 apexBundle := module.Module().(*apexBundle)
6027 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6028 var builder strings.Builder
6029 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6030 androidMk := builder.String()
6031 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6032 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6033 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6034 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6035 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6036 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 +01006037}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006038
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006039func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006040 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006041 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6042 for _, id := range invalidBuildIds {
6043 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6044 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6045 variables.BuildId = proptools.StringPtr(id)
6046 })
6047 testApexError(t, message, `apex {
6048 name: "myapex",
6049 key: "myapex.key",
6050 apps: ["AppFooPrebuilt"],
6051 updatable: false,
6052 }
6053
6054 apex_key {
6055 name: "myapex.key",
6056 public_key: "testkey.avbpubkey",
6057 private_key: "testkey.pem",
6058 }
6059
6060 android_app_import {
6061 name: "AppFooPrebuilt",
6062 apk: "PrebuiltAppFoo.apk",
6063 presigned: true,
6064 apex_available: ["myapex"],
6065 }
6066 `, fixture)
6067 }
6068}
6069
Dario Frenicde2a032019-10-27 00:29:22 +01006070func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006071 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006072 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006073 apex {
6074 name: "myapex",
6075 key: "myapex.key",
6076 apps: [
6077 "AppFooPrebuilt",
6078 "AppFooPrivPrebuilt",
6079 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006080 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006081 }
6082
6083 apex_key {
6084 name: "myapex.key",
6085 public_key: "testkey.avbpubkey",
6086 private_key: "testkey.pem",
6087 }
6088
6089 android_app_import {
6090 name: "AppFooPrebuilt",
6091 apk: "PrebuiltAppFoo.apk",
6092 presigned: true,
6093 dex_preopt: {
6094 enabled: false,
6095 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006096 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006097 }
6098
6099 android_app_import {
6100 name: "AppFooPrivPrebuilt",
6101 apk: "PrebuiltAppFooPriv.apk",
6102 privileged: true,
6103 presigned: true,
6104 dex_preopt: {
6105 enabled: false,
6106 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006107 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006108 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006109 }
6110 `)
6111
Jooyung Hana0503a52023-08-23 13:12:50 +09006112 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006113 apexRule := module.Rule("apexRule")
6114 copyCmds := apexRule.Args["copy_commands"]
6115
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006116 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6117 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006118}
6119
6120func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006121 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006122 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 apps: [
6127 "AppFoo",
6128 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006129 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006130 }
6131
6132 apex_key {
6133 name: "myapex.key",
6134 public_key: "testkey.avbpubkey",
6135 private_key: "testkey.pem",
6136 }
6137
6138 android_app {
6139 name: "AppFoo",
6140 srcs: ["foo/bar/MyClass.java"],
6141 sdk_version: "none",
6142 system_modules: "none",
6143 apex_available: [ "myapex" ],
6144 }
6145
6146 android_app_import {
6147 name: "AppFoo",
6148 apk: "AppFooPrebuilt.apk",
6149 filename: "AppFooPrebuilt.apk",
6150 presigned: true,
6151 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006152 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006153 }
6154 `, withFiles(map[string][]byte{
6155 "AppFooPrebuilt.apk": nil,
6156 }))
6157
Jooyung Hana0503a52023-08-23 13:12:50 +09006158 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006159 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006160 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006161}
6162
Dario Freni6f3937c2019-12-20 22:58:03 +00006163func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006164 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006165 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 apps: [
6170 "TesterHelpAppFoo",
6171 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006172 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 android_test_helper_app {
6182 name: "TesterHelpAppFoo",
6183 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006184 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006185 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006186 }
6187
6188 `)
6189
Jooyung Hana0503a52023-08-23 13:12:50 +09006190 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006191 apexRule := module.Rule("apexRule")
6192 copyCmds := apexRule.Args["copy_commands"]
6193
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006194 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006195}
6196
Jooyung Han18020ea2019-11-13 10:50:48 +09006197func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006198 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006199 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006200 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006201 apex {
6202 name: "myapex",
6203 key: "myapex.key",
6204 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006205 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006206 }
6207
6208 apex_key {
6209 name: "myapex.key",
6210 public_key: "testkey.avbpubkey",
6211 private_key: "testkey.pem",
6212 }
6213
6214 apex {
6215 name: "otherapex",
6216 key: "myapex.key",
6217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006218 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006219 }
6220
6221 cc_defaults {
6222 name: "libfoo-defaults",
6223 apex_available: ["otherapex"],
6224 }
6225
6226 cc_library {
6227 name: "libfoo",
6228 defaults: ["libfoo-defaults"],
6229 stl: "none",
6230 system_shared_libs: [],
6231 }`)
6232}
6233
Paul Duffine52e66f2020-03-30 17:54:29 +01006234func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006235 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006236 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006237 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006238 apex {
6239 name: "myapex",
6240 key: "myapex.key",
6241 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006242 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006243 }
6244
6245 apex_key {
6246 name: "myapex.key",
6247 public_key: "testkey.avbpubkey",
6248 private_key: "testkey.pem",
6249 }
6250
6251 apex {
6252 name: "otherapex",
6253 key: "otherapex.key",
6254 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006255 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006256 }
6257
6258 apex_key {
6259 name: "otherapex.key",
6260 public_key: "testkey.avbpubkey",
6261 private_key: "testkey.pem",
6262 }
6263
6264 cc_library {
6265 name: "libfoo",
6266 stl: "none",
6267 system_shared_libs: [],
6268 apex_available: ["otherapex"],
6269 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006270
6271 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6272 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6273 testApex(t, `
6274 apex {
6275 name: "com.sdv.myapex",
6276 key: "myapex.key",
6277 native_shared_libs: ["libfoo"],
6278 updatable: false,
6279 product_specific: true,
6280 }
6281
6282 apex_key {
6283 name: "myapex.key",
6284 public_key: "testkey.avbpubkey",
6285 private_key: "testkey.pem",
6286 }
6287
6288 apex {
6289 name: "com.any.otherapex",
6290 key: "otherapex.key",
6291 native_shared_libs: ["libfoo"],
6292 updatable: false,
6293 }
6294
6295 apex_key {
6296 name: "otherapex.key",
6297 public_key: "testkey.avbpubkey",
6298 private_key: "testkey.pem",
6299 }
6300
6301 cc_library {
6302 name: "libfoo",
6303 stl: "none",
6304 system_shared_libs: [],
6305 apex_available: ["com.any.otherapex"],
6306 product_specific: true,
6307 }`,
6308 android.FixtureMergeMockFs(android.MockFS{
6309 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6310 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6311 }))
6312
6313 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6314 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6315 apex {
6316 name: "com.sdv.myapex",
6317 key: "myapex.key",
6318 native_shared_libs: ["libfoo"],
6319 updatable: false,
6320 }
6321
6322 apex_key {
6323 name: "myapex.key",
6324 public_key: "testkey.avbpubkey",
6325 private_key: "testkey.pem",
6326 }
6327
6328 apex {
6329 name: "com.any.otherapex",
6330 key: "otherapex.key",
6331 native_shared_libs: ["libfoo"],
6332 updatable: false,
6333 }
6334
6335 apex_key {
6336 name: "otherapex.key",
6337 public_key: "testkey.avbpubkey",
6338 private_key: "testkey.pem",
6339 }
6340
6341 cc_library {
6342 name: "libfoo",
6343 stl: "none",
6344 system_shared_libs: [],
6345 apex_available: ["com.any.otherapex"],
6346 }`,
6347 android.FixtureMergeMockFs(android.MockFS{
6348 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6349 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6350 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006351}
Jiyong Park127b40b2019-09-30 16:04:35 +09006352
Paul Duffine52e66f2020-03-30 17:54:29 +01006353func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006354 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006355 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006356 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006357.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006358.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006359.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006360.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006361.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006362.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006363 apex {
6364 name: "myapex",
6365 key: "myapex.key",
6366 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006367 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006368 }
6369
6370 apex_key {
6371 name: "myapex.key",
6372 public_key: "testkey.avbpubkey",
6373 private_key: "testkey.pem",
6374 }
6375
Jiyong Park127b40b2019-09-30 16:04:35 +09006376 cc_library {
6377 name: "libfoo",
6378 stl: "none",
6379 shared_libs: ["libbar"],
6380 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006381 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006382 }
6383
6384 cc_library {
6385 name: "libbar",
6386 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006387 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006388 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006389 apex_available: ["myapex"],
6390 }
6391
6392 cc_library {
6393 name: "libbaz",
6394 stl: "none",
6395 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006396 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006397
6398 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6399 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6400 testApex(t, `
6401 apex {
6402 name: "com.sdv.myapex",
6403 key: "myapex.key",
6404 native_shared_libs: ["libfoo"],
6405 updatable: false,
6406 product_specific: true,
6407 }
6408
6409 apex_key {
6410 name: "myapex.key",
6411 public_key: "testkey.avbpubkey",
6412 private_key: "testkey.pem",
6413 }
6414
6415 cc_library {
6416 name: "libfoo",
6417 stl: "none",
6418 shared_libs: ["libbar"],
6419 system_shared_libs: [],
6420 apex_available: ["com.sdv.myapex"],
6421 product_specific: true,
6422 }
6423
6424 cc_library {
6425 name: "libbar",
6426 stl: "none",
6427 shared_libs: ["libbaz"],
6428 system_shared_libs: [],
6429 apex_available: ["com.sdv.myapex"],
6430 product_specific: true,
6431 }
6432
6433 cc_library {
6434 name: "libbaz",
6435 stl: "none",
6436 system_shared_libs: [],
6437 product_specific: true,
6438 }`,
6439 android.FixtureMergeMockFs(android.MockFS{
6440 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6441 }))
6442
6443 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6444 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6445 apex {
6446 name: "com.sdv.myapex",
6447 key: "myapex.key",
6448 native_shared_libs: ["libfoo"],
6449 updatable: false,
6450 }
6451
6452 apex_key {
6453 name: "myapex.key",
6454 public_key: "testkey.avbpubkey",
6455 private_key: "testkey.pem",
6456 }
6457
6458 cc_library {
6459 name: "libfoo",
6460 stl: "none",
6461 shared_libs: ["libbar"],
6462 system_shared_libs: [],
6463 apex_available: ["com.sdv.myapex"],
6464 }
6465
6466 cc_library {
6467 name: "libbar",
6468 stl: "none",
6469 shared_libs: ["libbaz"],
6470 system_shared_libs: [],
6471 apex_available: ["com.sdv.myapex"],
6472 }
6473
6474 cc_library {
6475 name: "libbaz",
6476 stl: "none",
6477 system_shared_libs: [],
6478 }`,
6479 android.FixtureMergeMockFs(android.MockFS{
6480 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6481 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006482}
Jiyong Park127b40b2019-09-30 16:04:35 +09006483
Liz Kammer5f108fa2023-05-11 14:33:17 -04006484func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006485 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006486 testApex(t, `
6487 apex {
6488 name: "myapex",
6489 key: "myapex.key",
6490 native_shared_libs: ["libfoo"],
6491 updatable: false,
6492 }
6493
6494 apex_key {
6495 name: "myapex.key",
6496 public_key: "testkey.avbpubkey",
6497 private_key: "testkey.pem",
6498 }
6499
6500 cc_library {
6501 name: "libfoo",
6502 stl: "none",
6503 static_libs: ["libbar"],
6504 system_shared_libs: [],
6505 apex_available: ["myapex"],
6506 }
6507
6508 cc_library {
6509 name: "libbar",
6510 stl: "none",
6511 shared_libs: ["libbaz"],
6512 system_shared_libs: [],
6513 apex_available: ["myapex"],
6514 }
6515
6516 cc_library {
6517 name: "libbaz",
6518 stl: "none",
6519 system_shared_libs: [],
6520 }`)
6521
6522 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6523 apex {
6524 name: "myapex",
6525 key: "myapex.key",
6526 native_shared_libs: ["libfoo"],
6527 updatable: false,
6528 }
6529
6530 apex_key {
6531 name: "myapex.key",
6532 public_key: "testkey.avbpubkey",
6533 private_key: "testkey.pem",
6534 }
6535
6536 cc_library {
6537 name: "libfoo",
6538 stl: "none",
6539 static_libs: ["libbar"],
6540 system_shared_libs: [],
6541 apex_available: ["myapex"],
6542 }
6543
6544 cc_library {
6545 name: "libbar",
6546 stl: "none",
6547 system_shared_libs: [],
6548 }`)
6549}
6550
Paul Duffine52e66f2020-03-30 17:54:29 +01006551func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006552 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006553 testApexError(t, "\"otherapex\" is not a valid module name", `
6554 apex {
6555 name: "myapex",
6556 key: "myapex.key",
6557 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006558 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 }
6560
6561 apex_key {
6562 name: "myapex.key",
6563 public_key: "testkey.avbpubkey",
6564 private_key: "testkey.pem",
6565 }
6566
6567 cc_library {
6568 name: "libfoo",
6569 stl: "none",
6570 system_shared_libs: [],
6571 apex_available: ["otherapex"],
6572 }`)
6573
Paul Duffine52e66f2020-03-30 17:54:29 +01006574 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006575 apex {
6576 name: "myapex",
6577 key: "myapex.key",
6578 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006579 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006580 }
6581
6582 apex_key {
6583 name: "myapex.key",
6584 public_key: "testkey.avbpubkey",
6585 private_key: "testkey.pem",
6586 }
6587
6588 cc_library {
6589 name: "libfoo",
6590 stl: "none",
6591 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006592 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006593 apex_available: ["myapex"],
6594 }
6595
6596 cc_library {
6597 name: "libbar",
6598 stl: "none",
6599 system_shared_libs: [],
6600 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006601 }
6602
6603 cc_library {
6604 name: "libbaz",
6605 stl: "none",
6606 system_shared_libs: [],
6607 stubs: {
6608 versions: ["10", "20", "30"],
6609 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006610 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006611}
Jiyong Park127b40b2019-09-30 16:04:35 +09006612
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006613func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006614 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006615 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006616 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006617 testApexError(t, "expected an integer between 0-9; got -1", `
6618 apex {
6619 name: "myapex",
6620 key: "myapex.key",
6621 apex_available_name: "com.android.foo",
6622 variant_version: "-1",
6623 updatable: false,
6624 }
6625 apex_key {
6626 name: "myapex.key",
6627 public_key: "testkey.avbpubkey",
6628 private_key: "testkey.pem",
6629 }
6630 `)
6631 })
6632
6633 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006634 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006635 testApexError(t, "expected an integer between 0-9; got 10", `
6636 apex {
6637 name: "myapex",
6638 key: "myapex.key",
6639 apex_available_name: "com.android.foo",
6640 variant_version: "10",
6641 updatable: false,
6642 }
6643 apex_key {
6644 name: "myapex.key",
6645 public_key: "testkey.avbpubkey",
6646 private_key: "testkey.pem",
6647 }
6648 `)
6649 })
6650}
6651
6652func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006653 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006654 context := android.GroupFixturePreparers(
6655 android.PrepareForIntegrationTestWithAndroid,
6656 PrepareForTestWithApexBuildComponents,
6657 android.FixtureMergeMockFs(android.MockFS{
6658 "system/sepolicy/apex/foo-file_contexts": nil,
6659 "system/sepolicy/apex/bar-file_contexts": nil,
6660 }),
6661 )
6662 result := context.RunTestWithBp(t, `
6663 apex {
6664 name: "foo",
6665 key: "myapex.key",
6666 apex_available_name: "com.android.foo",
6667 variant_version: "0",
6668 updatable: false,
6669 }
6670 apex {
6671 name: "bar",
6672 key: "myapex.key",
6673 apex_available_name: "com.android.foo",
6674 variant_version: "3",
6675 updatable: false,
6676 }
6677 apex_key {
6678 name: "myapex.key",
6679 public_key: "testkey.avbpubkey",
6680 private_key: "testkey.pem",
6681 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006682 override_apex {
6683 name: "myoverrideapex",
6684 base: "bar",
6685 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006686 `)
6687
Jooyung Hana0503a52023-08-23 13:12:50 +09006688 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006689 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006690 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6691 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6692 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6693 }
6694
Jooyung Hana0503a52023-08-23 13:12:50 +09006695 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006696 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006697 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6698 barActualDefaultVersion := barManifestRule.Args["default_version"]
6699 if barActualDefaultVersion != barExpectedDefaultVersion {
6700 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6701 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006702
Spandan Das50801e22024-05-13 18:29:45 +00006703 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006704 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6705 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6706 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6707 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006708}
6709
Sam Delmericoca816532023-06-02 14:09:50 -04006710func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006711 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006712 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 -07006713 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006714 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6715 apex {
6716 name: "myapex_sminus",
6717 key: "myapex.key",
6718 apps: ["AppFoo"],
6719 apex_available_name: "myapex",
6720 updatable: false,
6721 }
6722 apex {
6723 name: "myapex",
6724 key: "myapex.key",
6725 apps: ["AppFoo"],
6726 updatable: false,
6727 }
6728 apex_key {
6729 name: "myapex.key",
6730 public_key: "testkey.avbpubkey",
6731 private_key: "testkey.pem",
6732 }
6733 android_app {
6734 name: "AppFoo",
6735 srcs: ["foo/bar/MyClass.java"],
6736 sdk_version: "none",
6737 system_modules: "none",
6738 apex_available: [ "myapex_sminus" ],
6739 }`,
6740 android.FixtureMergeMockFs(android.MockFS{
6741 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6742 }),
6743 )
6744 })
6745
6746 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 -07006747 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006748 testApex(t, `
6749 apex {
6750 name: "myapex_sminus",
6751 key: "myapex.key",
6752 apps: ["AppFoo"],
6753 apex_available_name: "myapex",
6754 updatable: false,
6755 }
6756 apex {
6757 name: "myapex",
6758 key: "myapex.key",
6759 apps: ["AppFoo"],
6760 updatable: false,
6761 }
6762 apex_key {
6763 name: "myapex.key",
6764 public_key: "testkey.avbpubkey",
6765 private_key: "testkey.pem",
6766 }
6767 android_app {
6768 name: "AppFoo",
6769 srcs: ["foo/bar/MyClass.java"],
6770 sdk_version: "none",
6771 system_modules: "none",
6772 apex_available: [ "myapex" ],
6773 }`,
6774 android.FixtureMergeMockFs(android.MockFS{
6775 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6776 }),
6777 )
6778 })
6779
6780 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006781 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006782 testApex(t, `
6783 override_apex {
6784 name: "myoverrideapex_sminus",
6785 base: "myapex_sminus",
6786 key: "myapex.key",
6787 apps: ["AppFooOverride"],
6788 }
6789 override_apex {
6790 name: "myoverrideapex",
6791 base: "myapex",
6792 key: "myapex.key",
6793 apps: ["AppFooOverride"],
6794 }
6795 apex {
6796 name: "myapex_sminus",
6797 key: "myapex.key",
6798 apps: ["AppFoo"],
6799 apex_available_name: "myapex",
6800 updatable: false,
6801 }
6802 apex {
6803 name: "myapex",
6804 key: "myapex.key",
6805 apps: ["AppFoo"],
6806 updatable: false,
6807 }
6808 apex_key {
6809 name: "myapex.key",
6810 public_key: "testkey.avbpubkey",
6811 private_key: "testkey.pem",
6812 }
6813 android_app {
6814 name: "AppFooOverride",
6815 srcs: ["foo/bar/MyClass.java"],
6816 sdk_version: "none",
6817 system_modules: "none",
6818 apex_available: [ "myapex" ],
6819 }
6820 android_app {
6821 name: "AppFoo",
6822 srcs: ["foo/bar/MyClass.java"],
6823 sdk_version: "none",
6824 system_modules: "none",
6825 apex_available: [ "myapex" ],
6826 }`,
6827 android.FixtureMergeMockFs(android.MockFS{
6828 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6829 }),
6830 )
6831 })
6832}
6833
6834func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006835 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006836 context := android.GroupFixturePreparers(
6837 android.PrepareForIntegrationTestWithAndroid,
6838 PrepareForTestWithApexBuildComponents,
6839 java.PrepareForTestWithDexpreopt,
6840 android.FixtureMergeMockFs(android.MockFS{
6841 "system/sepolicy/apex/myapex-file_contexts": nil,
6842 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6843 }),
6844 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6845 variables.BuildId = proptools.StringPtr("buildid")
6846 }),
6847 )
6848 context.RunTestWithBp(t, `
6849 override_apex {
6850 name: "myoverrideapex_sminus",
6851 base: "myapex_sminus",
6852 }
6853 override_apex {
6854 name: "myoverrideapex",
6855 base: "myapex",
6856 }
6857 apex {
6858 name: "myapex",
6859 key: "myapex.key",
6860 apps: ["AppFoo"],
6861 updatable: false,
6862 }
6863 apex {
6864 name: "myapex_sminus",
6865 apex_available_name: "myapex",
6866 key: "myapex.key",
6867 apps: ["AppFoo_sminus"],
6868 updatable: false,
6869 }
6870 apex_key {
6871 name: "myapex.key",
6872 public_key: "testkey.avbpubkey",
6873 private_key: "testkey.pem",
6874 }
6875 android_app {
6876 name: "AppFoo",
6877 srcs: ["foo/bar/MyClass.java"],
6878 sdk_version: "none",
6879 system_modules: "none",
6880 apex_available: [ "myapex" ],
6881 }
6882 android_app {
6883 name: "AppFoo_sminus",
6884 srcs: ["foo/bar/MyClass.java"],
6885 sdk_version: "none",
6886 min_sdk_version: "29",
6887 system_modules: "none",
6888 apex_available: [ "myapex" ],
6889 }`)
6890}
6891
Jiyong Park89e850a2020-04-07 16:37:39 +09006892func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006894 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006895 apex {
6896 name: "myapex",
6897 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006898 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006899 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006900 }
6901
6902 apex_key {
6903 name: "myapex.key",
6904 public_key: "testkey.avbpubkey",
6905 private_key: "testkey.pem",
6906 }
6907
6908 cc_library {
6909 name: "libfoo",
6910 stl: "none",
6911 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006912 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006913 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006914 }
6915
6916 cc_library {
6917 name: "libfoo2",
6918 stl: "none",
6919 system_shared_libs: [],
6920 shared_libs: ["libbaz"],
6921 apex_available: ["//apex_available:platform"],
6922 }
6923
6924 cc_library {
6925 name: "libbar",
6926 stl: "none",
6927 system_shared_libs: [],
6928 apex_available: ["myapex"],
6929 }
6930
6931 cc_library {
6932 name: "libbaz",
6933 stl: "none",
6934 system_shared_libs: [],
6935 apex_available: ["myapex"],
6936 stubs: {
6937 versions: ["1"],
6938 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006939 }`)
6940
Jiyong Park89e850a2020-04-07 16:37:39 +09006941 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6942 // because it depends on libbar which isn't available to platform
6943 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6944 if libfoo.NotAvailableForPlatform() != true {
6945 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6946 }
6947
6948 // libfoo2 however can be available to platform because it depends on libbaz which provides
6949 // stubs
6950 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6951 if libfoo2.NotAvailableForPlatform() == true {
6952 t.Errorf("%q should be available to platform", libfoo2.String())
6953 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006954}
Jiyong Parka90ca002019-10-07 15:47:24 +09006955
Paul Duffine52e66f2020-03-30 17:54:29 +01006956func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006957 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006958 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006959 apex {
6960 name: "myapex",
6961 key: "myapex.key",
6962 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006963 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006964 }
6965
6966 apex_key {
6967 name: "myapex.key",
6968 public_key: "testkey.avbpubkey",
6969 private_key: "testkey.pem",
6970 }
6971
6972 cc_library {
6973 name: "libfoo",
6974 stl: "none",
6975 system_shared_libs: [],
6976 apex_available: ["myapex"],
6977 static: {
6978 apex_available: ["//apex_available:platform"],
6979 },
6980 }`)
6981
Jiyong Park89e850a2020-04-07 16:37:39 +09006982 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6983 if libfooShared.NotAvailableForPlatform() != true {
6984 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6985 }
6986 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6987 if libfooStatic.NotAvailableForPlatform() != false {
6988 t.Errorf("%q should be available to platform", libfooStatic.String())
6989 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006990}
6991
Jooyung Han9a419e22024-08-16 17:14:21 +09006992func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006993 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006994
6995 for _, tc := range []struct {
6996 name string
6997 apexAvailable string
6998 expectedError string
6999 }{
7000 {
7001 name: "prefix matches correctly",
7002 apexAvailable: "com.foo.*",
7003 },
7004 {
7005 name: "prefix doesn't match",
7006 apexAvailable: "com.bar.*",
7007 expectedError: `Consider .* "com.foo\.\*"`,
7008 },
7009 {
7010 name: "short prefix",
7011 apexAvailable: "com.*",
7012 expectedError: "requires two or more components",
7013 },
7014 {
7015 name: "wildcard not in the end",
7016 apexAvailable: "com.*.foo",
7017 expectedError: "should end with .*",
7018 },
7019 {
7020 name: "wildcard in the middle",
7021 apexAvailable: "com.foo*.*",
7022 expectedError: "not allowed in the middle",
7023 },
7024 {
7025 name: "hint with prefix pattern",
7026 apexAvailable: "//apex_available:platform",
7027 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7028 },
7029 } {
7030 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007031 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007032 errorHandler := android.FixtureExpectsNoErrors
7033 if tc.expectedError != "" {
7034 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7035 }
7036 context := android.GroupFixturePreparers(
7037 prepareForApexTest,
7038 android.FixtureMergeMockFs(android.MockFS{
7039 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7040 }),
7041 ).ExtendWithErrorHandler(errorHandler)
7042
7043 context.RunTestWithBp(t, `
7044 apex {
7045 name: "com.foo.bar",
7046 key: "myapex.key",
7047 native_shared_libs: ["libfoo"],
7048 updatable: false,
7049 }
7050
7051 apex_key {
7052 name: "myapex.key",
7053 public_key: "testkey.avbpubkey",
7054 private_key: "testkey.pem",
7055 }
7056
7057 cc_library {
7058 name: "libfoo",
7059 stl: "none",
7060 system_shared_libs: [],
7061 apex_available: ["`+tc.apexAvailable+`"],
7062 }`)
7063 })
7064 }
7065 testApexError(t, `Consider adding "com.foo" to`, `
7066 apex {
7067 name: "com.foo", // too short for a partner apex
7068 key: "myapex.key",
7069 native_shared_libs: ["libfoo"],
7070 updatable: false,
7071 }
7072
7073 apex_key {
7074 name: "myapex.key",
7075 public_key: "testkey.avbpubkey",
7076 private_key: "testkey.pem",
7077 }
7078
7079 cc_library {
7080 name: "libfoo",
7081 stl: "none",
7082 system_shared_libs: [],
7083 }
7084 `)
7085}
7086
Jiyong Park5d790c32019-11-15 18:40:32 +09007087func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007088 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007089 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007090 apex {
7091 name: "myapex",
7092 key: "myapex.key",
7093 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007094 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007095 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007096 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007097 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007098 }
7099
7100 override_apex {
7101 name: "override_myapex",
7102 base: "myapex",
7103 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007104 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007105 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007106 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007107 compile_multilib: "first",
7108 multilib: {
7109 lib32: {
7110 native_shared_libs: ["mylib32"],
7111 },
7112 lib64: {
7113 native_shared_libs: ["mylib64"],
7114 },
7115 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007116 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007117 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007118 key: "mynewapex.key",
7119 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007120 }
7121
7122 apex_key {
7123 name: "myapex.key",
7124 public_key: "testkey.avbpubkey",
7125 private_key: "testkey.pem",
7126 }
7127
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007128 apex_key {
7129 name: "mynewapex.key",
7130 public_key: "testkey2.avbpubkey",
7131 private_key: "testkey2.pem",
7132 }
7133
7134 android_app_certificate {
7135 name: "myapex.certificate",
7136 certificate: "testkey",
7137 }
7138
Jiyong Park5d790c32019-11-15 18:40:32 +09007139 android_app {
7140 name: "app",
7141 srcs: ["foo/bar/MyClass.java"],
7142 package_name: "foo",
7143 sdk_version: "none",
7144 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007145 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007146 }
7147
7148 override_android_app {
7149 name: "override_app",
7150 base: "app",
7151 package_name: "bar",
7152 }
markchien7c803b82021-08-26 22:10:06 +08007153
7154 bpf {
7155 name: "bpf",
7156 srcs: ["bpf.c"],
7157 }
7158
7159 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007160 name: "overrideBpf",
7161 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007162 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007163
7164 prebuilt_etc {
7165 name: "myetc",
7166 src: "myprebuilt",
7167 }
7168
7169 prebuilt_etc {
7170 name: "override_myetc",
7171 src: "override_myprebuilt",
7172 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007173
7174 cc_library {
7175 name: "mylib32",
7176 apex_available: [ "myapex" ],
7177 }
7178
7179 cc_library {
7180 name: "mylib64",
7181 apex_available: [ "myapex" ],
7182 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007183 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007184
Jooyung Hana0503a52023-08-23 13:12:50 +09007185 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007186 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007187 if originalVariant.GetOverriddenBy() != "" {
7188 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7189 }
7190 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7191 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7192 }
7193
Spandan Das50801e22024-05-13 18:29:45 +00007194 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007195 apexRule := module.Rule("apexRule")
7196 copyCmds := apexRule.Args["copy_commands"]
7197
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007198 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7199 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007200
markchien7c803b82021-08-26 22:10:06 +08007201 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007202 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007203
Daniel Norman5a3ce132021-08-26 15:44:43 -07007204 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7205 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7206
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007207 apexBundle := module.Module().(*apexBundle)
7208 name := apexBundle.Name()
7209 if name != "override_myapex" {
7210 t.Errorf("name should be \"override_myapex\", but was %q", name)
7211 }
7212
Baligh Uddin004d7172020-02-19 21:29:28 -08007213 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7214 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7215 }
7216
Jiyong Park20bacab2020-03-03 11:45:41 +09007217 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007218 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007219 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7220
7221 signApkRule := module.Rule("signapk")
7222 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007223
Colin Crossaa255532020-07-03 13:18:24 -07007224 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007225 var builder strings.Builder
7226 data.Custom(&builder, name, "TARGET_", "", data)
7227 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007228 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7229 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007230 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007231 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007232 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007233 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007234 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007235 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007236}
7237
Albert Martineefabcf2022-03-21 20:11:16 +00007238func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007239 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007240 // Override from 29 to 31
7241 minSdkOverride31 := "31"
7242 ctx := testApex(t, `
7243 apex {
7244 name: "myapex",
7245 key: "myapex.key",
7246 native_shared_libs: ["mylib"],
7247 updatable: true,
7248 min_sdk_version: "29"
7249 }
7250
7251 override_apex {
7252 name: "override_myapex",
7253 base: "myapex",
7254 logging_parent: "com.foo.bar",
7255 package_name: "test.overridden.package"
7256 }
7257
7258 apex_key {
7259 name: "myapex.key",
7260 public_key: "testkey.avbpubkey",
7261 private_key: "testkey.pem",
7262 }
7263
7264 cc_library {
7265 name: "mylib",
7266 srcs: ["mylib.cpp"],
7267 runtime_libs: ["libbar"],
7268 system_shared_libs: [],
7269 stl: "none",
7270 apex_available: [ "myapex" ],
7271 min_sdk_version: "apex_inherit"
7272 }
7273
7274 cc_library {
7275 name: "libbar",
7276 srcs: ["mylib.cpp"],
7277 system_shared_libs: [],
7278 stl: "none",
7279 apex_available: [ "myapex" ],
7280 min_sdk_version: "apex_inherit"
7281 }
7282
7283 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7284
Jooyung Hana0503a52023-08-23 13:12:50 +09007285 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007286 copyCmds := apexRule.Args["copy_commands"]
7287
7288 // Ensure that direct non-stubs dep is always included
7289 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7290
7291 // Ensure that runtime_libs dep in included
7292 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7293
7294 // Ensure libraries target overridden min_sdk_version value
7295 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7296}
7297
7298func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007299 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007300 // Attempt to override from 31 to 29, should be a NOOP
7301 minSdkOverride29 := "29"
7302 ctx := testApex(t, `
7303 apex {
7304 name: "myapex",
7305 key: "myapex.key",
7306 native_shared_libs: ["mylib"],
7307 updatable: true,
7308 min_sdk_version: "31"
7309 }
7310
7311 override_apex {
7312 name: "override_myapex",
7313 base: "myapex",
7314 logging_parent: "com.foo.bar",
7315 package_name: "test.overridden.package"
7316 }
7317
7318 apex_key {
7319 name: "myapex.key",
7320 public_key: "testkey.avbpubkey",
7321 private_key: "testkey.pem",
7322 }
7323
7324 cc_library {
7325 name: "mylib",
7326 srcs: ["mylib.cpp"],
7327 runtime_libs: ["libbar"],
7328 system_shared_libs: [],
7329 stl: "none",
7330 apex_available: [ "myapex" ],
7331 min_sdk_version: "apex_inherit"
7332 }
7333
7334 cc_library {
7335 name: "libbar",
7336 srcs: ["mylib.cpp"],
7337 system_shared_libs: [],
7338 stl: "none",
7339 apex_available: [ "myapex" ],
7340 min_sdk_version: "apex_inherit"
7341 }
7342
7343 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7344
Jooyung Hana0503a52023-08-23 13:12:50 +09007345 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007346 copyCmds := apexRule.Args["copy_commands"]
7347
7348 // Ensure that direct non-stubs dep is always included
7349 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7350
7351 // Ensure that runtime_libs dep in included
7352 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7353
7354 // Ensure libraries target the original min_sdk_version value rather than the overridden
7355 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7356}
7357
Jooyung Han214bf372019-11-12 13:03:50 +09007358func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007359 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007360 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007361 apex {
7362 name: "myapex",
7363 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007364 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007365 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007366 }
7367
7368 apex_key {
7369 name: "myapex.key",
7370 public_key: "testkey.avbpubkey",
7371 private_key: "testkey.pem",
7372 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007373
7374 cc_library {
7375 name: "mylib",
7376 srcs: ["mylib.cpp"],
7377 stl: "libc++",
7378 system_shared_libs: [],
7379 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007380 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007381 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007382 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007383
Jooyung Hana0503a52023-08-23 13:12:50 +09007384 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007385 args := module.Rule("apexRule").Args
7386 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007387 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007388
7389 // The copies of the libraries in the apex should have one more dependency than
7390 // the ones outside the apex, namely the unwinder. Ideally we should check
7391 // the dependency names directly here but for some reason the names are blank in
7392 // this test.
7393 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007394 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007395 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7396 if len(apexImplicits) != len(nonApexImplicits)+1 {
7397 t.Errorf("%q missing unwinder dep", lib)
7398 }
7399 }
Jooyung Han214bf372019-11-12 13:03:50 +09007400}
7401
Paul Duffine05480a2021-03-08 15:07:14 +00007402var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007403 "api/current.txt": nil,
7404 "api/removed.txt": nil,
7405 "api/system-current.txt": nil,
7406 "api/system-removed.txt": nil,
7407 "api/test-current.txt": nil,
7408 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007409
Anton Hanssondff2c782020-12-21 17:10:01 +00007410 "100/public/api/foo.txt": nil,
7411 "100/public/api/foo-removed.txt": nil,
7412 "100/system/api/foo.txt": nil,
7413 "100/system/api/foo-removed.txt": nil,
7414
Paul Duffineedc5d52020-06-12 17:46:39 +01007415 // For java_sdk_library_import
7416 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007417}
7418
Jooyung Han58f26ab2019-12-18 15:34:32 +09007419func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007420 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007421 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007422 apex {
7423 name: "myapex",
7424 key: "myapex.key",
7425 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007426 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007427 }
7428
7429 apex_key {
7430 name: "myapex.key",
7431 public_key: "testkey.avbpubkey",
7432 private_key: "testkey.pem",
7433 }
7434
7435 java_sdk_library {
7436 name: "foo",
7437 srcs: ["a.java"],
7438 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007439 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007440 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007441
7442 prebuilt_apis {
7443 name: "sdk",
7444 api_dirs: ["100"],
7445 }
Paul Duffin9b879592020-05-26 13:21:35 +01007446 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007447
7448 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007449 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007450 "javalib/foo.jar",
7451 "etc/permissions/foo.xml",
7452 })
7453 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007454 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7455 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7456 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007457}
7458
Spandan Das3ee19692024-06-19 04:47:40 +00007459func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007460 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007461 ctx := testApex(t, `
7462 override_apex {
7463 name: "mycompanyapex",
7464 base: "myapex",
7465 }
7466 apex {
7467 name: "myapex",
7468 key: "myapex.key",
7469 java_libs: ["foo"],
7470 updatable: false,
7471 }
7472
7473 apex_key {
7474 name: "myapex.key",
7475 public_key: "testkey.avbpubkey",
7476 private_key: "testkey.pem",
7477 }
7478
7479 java_sdk_library {
7480 name: "foo",
7481 srcs: ["a.java"],
7482 api_packages: ["foo"],
7483 apex_available: [ "myapex" ],
7484 }
7485
7486 prebuilt_apis {
7487 name: "sdk",
7488 api_dirs: ["100"],
7489 }
7490 `, withFiles(filesForSdkLibrary))
7491
7492 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7493 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7494 // (com.android.foo), the filepath should not contain override apex name.
7495 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7496 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7497 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7498}
7499
Paul Duffin9b879592020-05-26 13:21:35 +01007500func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007501 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007502 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007503 apex {
7504 name: "myapex",
7505 key: "myapex.key",
7506 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007507 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007508 }
7509
7510 apex_key {
7511 name: "myapex.key",
7512 public_key: "testkey.avbpubkey",
7513 private_key: "testkey.pem",
7514 }
7515
7516 java_sdk_library {
7517 name: "foo",
7518 srcs: ["a.java"],
7519 api_packages: ["foo"],
7520 apex_available: ["myapex"],
7521 sdk_version: "none",
7522 system_modules: "none",
7523 }
7524
7525 java_library {
7526 name: "bar",
7527 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007528 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007529 apex_available: ["myapex"],
7530 sdk_version: "none",
7531 system_modules: "none",
7532 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007533
7534 prebuilt_apis {
7535 name: "sdk",
7536 api_dirs: ["100"],
7537 }
Paul Duffin9b879592020-05-26 13:21:35 +01007538 `, withFiles(filesForSdkLibrary))
7539
7540 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007541 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007542 "javalib/bar.jar",
7543 "javalib/foo.jar",
7544 "etc/permissions/foo.xml",
7545 })
7546
7547 // The bar library should depend on the implementation jar.
7548 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007549 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007550 t.Errorf("expected %q, found %#q", expected, actual)
7551 }
7552}
7553
7554func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007555 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007556 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007557 apex {
7558 name: "myapex",
7559 key: "myapex.key",
7560 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007561 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007562 }
7563
7564 apex_key {
7565 name: "myapex.key",
7566 public_key: "testkey.avbpubkey",
7567 private_key: "testkey.pem",
7568 }
7569
7570 java_sdk_library {
7571 name: "foo",
7572 srcs: ["a.java"],
7573 api_packages: ["foo"],
7574 apex_available: ["myapex"],
7575 sdk_version: "none",
7576 system_modules: "none",
7577 }
7578
7579 java_library {
7580 name: "bar",
7581 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007582 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007583 sdk_version: "none",
7584 system_modules: "none",
7585 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007586
7587 prebuilt_apis {
7588 name: "sdk",
7589 api_dirs: ["100"],
7590 }
Paul Duffin9b879592020-05-26 13:21:35 +01007591 `, withFiles(filesForSdkLibrary))
7592
7593 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007594 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007595 "javalib/foo.jar",
7596 "etc/permissions/foo.xml",
7597 })
7598
7599 // The bar library should depend on the stubs jar.
7600 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007601 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007602 t.Errorf("expected %q, found %#q", expected, actual)
7603 }
7604}
7605
Paul Duffineedc5d52020-06-12 17:46:39 +01007606func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007607 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007608 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007609 prebuilt_apis {
7610 name: "sdk",
7611 api_dirs: ["100"],
7612 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007613 withFiles(map[string][]byte{
7614 "apex/a.java": nil,
7615 "apex/apex_manifest.json": nil,
7616 "apex/Android.bp": []byte(`
7617 package {
7618 default_visibility: ["//visibility:private"],
7619 }
7620
7621 apex {
7622 name: "myapex",
7623 key: "myapex.key",
7624 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007625 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007626 }
7627
7628 apex_key {
7629 name: "myapex.key",
7630 public_key: "testkey.avbpubkey",
7631 private_key: "testkey.pem",
7632 }
7633
7634 java_library {
7635 name: "bar",
7636 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007637 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007638 apex_available: ["myapex"],
7639 sdk_version: "none",
7640 system_modules: "none",
7641 }
7642`),
7643 "source/a.java": nil,
7644 "source/api/current.txt": nil,
7645 "source/api/removed.txt": nil,
7646 "source/Android.bp": []byte(`
7647 package {
7648 default_visibility: ["//visibility:private"],
7649 }
7650
7651 java_sdk_library {
7652 name: "foo",
7653 visibility: ["//apex"],
7654 srcs: ["a.java"],
7655 api_packages: ["foo"],
7656 apex_available: ["myapex"],
7657 sdk_version: "none",
7658 system_modules: "none",
7659 public: {
7660 enabled: true,
7661 },
7662 }
7663`),
7664 "prebuilt/a.jar": nil,
7665 "prebuilt/Android.bp": []byte(`
7666 package {
7667 default_visibility: ["//visibility:private"],
7668 }
7669
7670 java_sdk_library_import {
7671 name: "foo",
7672 visibility: ["//apex", "//source"],
7673 apex_available: ["myapex"],
7674 prefer: true,
7675 public: {
7676 jars: ["a.jar"],
7677 },
7678 }
7679`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007680 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007681 )
7682
7683 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007684 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007685 "javalib/bar.jar",
7686 "javalib/foo.jar",
7687 "etc/permissions/foo.xml",
7688 })
7689
7690 // The bar library should depend on the implementation jar.
7691 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007692 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007693 t.Errorf("expected %q, found %#q", expected, actual)
7694 }
7695}
7696
7697func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007698 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007699 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7700 apex {
7701 name: "myapex",
7702 key: "myapex.key",
7703 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007704 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007705 }
7706
7707 apex_key {
7708 name: "myapex.key",
7709 public_key: "testkey.avbpubkey",
7710 private_key: "testkey.pem",
7711 }
7712
7713 java_sdk_library_import {
7714 name: "foo",
7715 apex_available: ["myapex"],
7716 prefer: true,
7717 public: {
7718 jars: ["a.jar"],
7719 },
7720 }
7721
7722 `, withFiles(filesForSdkLibrary))
7723}
7724
atrost6e126252020-01-27 17:01:16 +00007725func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007726 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007727 result := android.GroupFixturePreparers(
7728 prepareForApexTest,
7729 java.PrepareForTestWithPlatformCompatConfig,
7730 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007731 apex {
7732 name: "myapex",
7733 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007734 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007735 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007736 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007737 }
7738
7739 apex_key {
7740 name: "myapex.key",
7741 public_key: "testkey.avbpubkey",
7742 private_key: "testkey.pem",
7743 }
7744
7745 platform_compat_config {
7746 name: "myjar-platform-compat-config",
7747 src: ":myjar",
7748 }
7749
7750 java_library {
7751 name: "myjar",
7752 srcs: ["foo/bar/MyClass.java"],
7753 sdk_version: "none",
7754 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007755 apex_available: [ "myapex" ],
7756 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007757
7758 // Make sure that a preferred prebuilt does not affect the apex contents.
7759 prebuilt_platform_compat_config {
7760 name: "myjar-platform-compat-config",
7761 metadata: "compat-config/metadata.xml",
7762 prefer: true,
7763 }
atrost6e126252020-01-27 17:01:16 +00007764 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007765 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007766 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007767 "etc/compatconfig/myjar-platform-compat-config.xml",
7768 "javalib/myjar.jar",
7769 })
7770}
7771
Jooyung Han862c0d62022-12-21 10:15:37 +09007772func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007773 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007774 android.GroupFixturePreparers(
7775 android.PrepareForTestWithAndroidBuildComponents,
7776 PrepareForTestWithApexBuildComponents,
7777 prepareForTestWithMyapex,
7778 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7779 ).
7780 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7781 RunTestWithBp(t, `
7782 apex {
7783 name: "myapex",
7784 key: "myapex.key",
7785 prebuilts: ["foo", "bar"],
7786 updatable: false,
7787 }
7788
7789 apex_key {
7790 name: "myapex.key",
7791 public_key: "testkey.avbpubkey",
7792 private_key: "testkey.pem",
7793 }
7794
7795 prebuilt_etc {
7796 name: "foo",
7797 src: "myprebuilt",
7798 filename_from_src: true,
7799 }
7800
7801 prebuilt_etc {
7802 name: "bar",
7803 src: "myprebuilt",
7804 filename_from_src: true,
7805 }
7806 `)
7807}
7808
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007809func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007810 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007811 bp := `
7812 apex {
7813 name: "myapex",
7814 key: "myapex.key",
7815 native_shared_libs: ["libfoo"],
7816 updatable: false,
7817 unwanted_transitive_deps: ["libbar"],
7818 }
7819
7820 apex_key {
7821 name: "myapex.key",
7822 public_key: "testkey.avbpubkey",
7823 private_key: "testkey.pem",
7824 }
7825
7826 cc_library {
7827 name: "libfoo",
7828 srcs: ["foo.cpp"],
7829 shared_libs: ["libbar"],
7830 apex_available: ["myapex"],
7831 }
7832
7833 cc_library {
7834 name: "libbar",
7835 srcs: ["bar.cpp"],
7836 apex_available: ["myapex"],
7837 }`
7838 ctx := testApex(t, bp)
7839 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7840 "*/libc++.so",
7841 "*/libfoo.so",
7842 // not libbar.so
7843 })
7844}
7845
Jiyong Park479321d2019-12-16 11:47:12 +09007846func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007847 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007848 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7849 apex {
7850 name: "myapex",
7851 key: "myapex.key",
7852 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007853 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007854 }
7855
7856 apex_key {
7857 name: "myapex.key",
7858 public_key: "testkey.avbpubkey",
7859 private_key: "testkey.pem",
7860 }
7861
7862 java_library {
7863 name: "myjar",
7864 srcs: ["foo/bar/MyClass.java"],
7865 sdk_version: "none",
7866 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007867 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007868 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007869 }
7870 `)
7871}
7872
Jiyong Park7afd1072019-12-30 16:56:33 +09007873func TestCarryRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007874 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007875 ctx := testApex(t, `
Jiyong Park7afd1072019-12-30 16:56:33 +09007876 apex {
7877 name: "myapex",
7878 key: "myapex.key",
7879 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007880 updatable: false,
Jiyong Park7afd1072019-12-30 16:56:33 +09007881 }
7882
7883 apex_key {
7884 name: "myapex.key",
7885 public_key: "testkey.avbpubkey",
7886 private_key: "testkey.pem",
7887 }
7888
7889 cc_library {
7890 name: "mylib",
7891 srcs: ["mylib.cpp"],
7892 system_shared_libs: [],
7893 stl: "none",
7894 required: ["a", "b"],
7895 host_required: ["c", "d"],
7896 target_required: ["e", "f"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007897 apex_available: [ "myapex" ],
Jiyong Park7afd1072019-12-30 16:56:33 +09007898 }
7899 `)
7900
Jooyung Hana0503a52023-08-23 13:12:50 +09007901 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007902 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jiyong Park7afd1072019-12-30 16:56:33 +09007903 name := apexBundle.BaseModuleName()
7904 prefix := "TARGET_"
7905 var builder strings.Builder
7906 data.Custom(&builder, name, prefix, "", data)
7907 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007908 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 a b\n")
Sasha Smundakdcb61292022-12-08 10:41:33 -08007909 ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
7910 ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
Jiyong Park7afd1072019-12-30 16:56:33 +09007911}
7912
Jiyong Park7cd10e32020-01-14 09:22:18 +09007913func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007914 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007915 bp := `
7916 apex {
7917 name: "myapex",
7918 key: "myapex.key",
7919 native_shared_libs: ["mylib"],
7920 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007921 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007922 }
7923
Jiyong Park9d677202020-02-19 16:29:35 +09007924 apex {
7925 name: "myapex.updatable",
7926 key: "myapex.key",
7927 native_shared_libs: ["mylib"],
7928 java_libs: ["myjar"],
7929 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007930 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007931 }
7932
Jiyong Park7cd10e32020-01-14 09:22:18 +09007933 apex_key {
7934 name: "myapex.key",
7935 public_key: "testkey.avbpubkey",
7936 private_key: "testkey.pem",
7937 }
7938
7939 cc_library {
7940 name: "mylib",
7941 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007942 shared_libs: [
7943 "myotherlib",
7944 "myotherlib_ext",
7945 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007946 system_shared_libs: [],
7947 stl: "none",
7948 apex_available: [
7949 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007950 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007951 "//apex_available:platform",
7952 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007953 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007954 }
7955
7956 cc_library {
7957 name: "myotherlib",
7958 srcs: ["mylib.cpp"],
7959 system_shared_libs: [],
7960 stl: "none",
7961 apex_available: [
7962 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007963 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007964 "//apex_available:platform",
7965 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007966 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007967 }
7968
Jiyong Parkce243632023-02-17 18:22:25 +09007969 cc_library {
7970 name: "myotherlib_ext",
7971 srcs: ["mylib.cpp"],
7972 system_shared_libs: [],
7973 system_ext_specific: true,
7974 stl: "none",
7975 apex_available: [
7976 "myapex",
7977 "myapex.updatable",
7978 "//apex_available:platform",
7979 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007980 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007981 }
7982
Jiyong Park7cd10e32020-01-14 09:22:18 +09007983 java_library {
7984 name: "myjar",
7985 srcs: ["foo/bar/MyClass.java"],
7986 sdk_version: "none",
7987 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007988 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007989 apex_available: [
7990 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007991 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007992 "//apex_available:platform",
7993 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007994 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007995 }
7996
7997 java_library {
7998 name: "myotherjar",
7999 srcs: ["foo/bar/MyClass.java"],
8000 sdk_version: "none",
8001 system_modules: "none",
8002 apex_available: [
8003 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008004 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008005 "//apex_available:platform",
8006 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008007 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008008 }
8009 `
8010
8011 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8012 for _, f := range files {
8013 if f.path == file {
8014 if f.isLink {
8015 t.Errorf("%q is not a real file", file)
8016 }
8017 return
8018 }
8019 }
8020 t.Errorf("%q is not found", file)
8021 }
8022
Jiyong Parkce243632023-02-17 18:22:25 +09008023 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008024 for _, f := range files {
8025 if f.path == file {
8026 if !f.isLink {
8027 t.Errorf("%q is not a symlink", file)
8028 }
Jiyong Parkce243632023-02-17 18:22:25 +09008029 if f.src != target {
8030 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8031 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008032 return
8033 }
8034 }
8035 t.Errorf("%q is not found", file)
8036 }
8037
Jiyong Park9d677202020-02-19 16:29:35 +09008038 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8039 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008040 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008041 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008042 ensureRealfileExists(t, files, "javalib/myjar.jar")
8043 ensureRealfileExists(t, files, "lib64/mylib.so")
8044 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008045 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008046
Jooyung Hana0503a52023-08-23 13:12:50 +09008047 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008048 ensureRealfileExists(t, files, "javalib/myjar.jar")
8049 ensureRealfileExists(t, files, "lib64/mylib.so")
8050 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008051 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008052
8053 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008054 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008055 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008056 ensureRealfileExists(t, files, "javalib/myjar.jar")
8057 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008058 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8059 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008060
Jooyung Hana0503a52023-08-23 13:12:50 +09008061 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008062 ensureRealfileExists(t, files, "javalib/myjar.jar")
8063 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008064 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8065 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008066}
8067
Yo Chiange8128052020-07-23 20:09:18 +08008068func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008069 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008070 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008071 apex {
8072 name: "myapex",
8073 key: "myapex.key",
8074 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008075 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008076 }
8077
8078 apex_key {
8079 name: "myapex.key",
8080 public_key: "testkey.avbpubkey",
8081 private_key: "testkey.pem",
8082 }
8083
8084 cc_library_shared {
8085 name: "mylib",
8086 srcs: ["mylib.cpp"],
8087 shared_libs: ["myotherlib"],
8088 system_shared_libs: [],
8089 stl: "none",
8090 apex_available: [
8091 "myapex",
8092 "//apex_available:platform",
8093 ],
8094 }
8095
8096 cc_prebuilt_library_shared {
8097 name: "myotherlib",
8098 srcs: ["prebuilt.so"],
8099 system_shared_libs: [],
8100 stl: "none",
8101 apex_available: [
8102 "myapex",
8103 "//apex_available:platform",
8104 ],
8105 }
8106 `)
8107
Jooyung Hana0503a52023-08-23 13:12:50 +09008108 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008109 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008110 var builder strings.Builder
8111 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8112 androidMk := builder.String()
8113 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008114 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008115 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8116 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8117 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008118 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008119}
8120
Jooyung Han643adc42020-02-27 13:50:06 +09008121func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008122 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008123 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008124 apex {
8125 name: "myapex",
8126 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008127 binaries: ["mybin"],
8128 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008129 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008130 }
8131
8132 apex_key {
8133 name: "myapex.key",
8134 public_key: "testkey.avbpubkey",
8135 private_key: "testkey.pem",
8136 }
8137
8138 cc_library {
8139 name: "mylib",
8140 srcs: ["mylib.cpp"],
8141 shared_libs: ["mylib2"],
8142 system_shared_libs: [],
8143 stl: "none",
8144 apex_available: [ "myapex" ],
8145 }
8146
8147 cc_library {
8148 name: "mylib2",
8149 srcs: ["mylib.cpp"],
8150 system_shared_libs: [],
8151 stl: "none",
8152 apex_available: [ "myapex" ],
8153 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008154
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008155 // Used as both a JNI library and a regular shared library.
8156 cc_library {
8157 name: "mylib3",
8158 srcs: ["mylib.cpp"],
8159 system_shared_libs: [],
8160 stl: "none",
8161 apex_available: [ "myapex" ],
8162 }
8163
8164 cc_binary {
8165 name: "mybin",
8166 srcs: ["mybin.cpp"],
8167 shared_libs: ["mylib3"],
8168 system_shared_libs: [],
8169 stl: "none",
8170 apex_available: [ "myapex" ],
8171 }
8172
Jiyong Park34d5c332022-02-24 18:02:44 +09008173 rust_ffi_shared {
8174 name: "libfoo.rust",
8175 crate_name: "foo",
8176 srcs: ["foo.rs"],
8177 shared_libs: ["libfoo.shared_from_rust"],
8178 prefer_rlib: true,
8179 apex_available: ["myapex"],
8180 }
8181
8182 cc_library_shared {
8183 name: "libfoo.shared_from_rust",
8184 srcs: ["mylib.cpp"],
8185 system_shared_libs: [],
8186 stl: "none",
8187 stubs: {
8188 versions: ["10", "11", "12"],
8189 },
8190 }
8191
Jooyung Han643adc42020-02-27 13:50:06 +09008192 `)
8193
Jooyung Hana0503a52023-08-23 13:12:50 +09008194 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008195 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008196 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008197 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008198 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008199 "lib64/mylib.so",
8200 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008201 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008202 "lib64/libfoo.rust.so",
8203 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8204 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008205 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008206
8207 // b/220397949
8208 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008209}
8210
Jooyung Han49f67012020-04-17 13:43:10 +09008211func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008212 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008213 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008214 apex {
8215 name: "myapex",
8216 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008217 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008218 }
8219 apex_key {
8220 name: "myapex.key",
8221 public_key: "testkey.avbpubkey",
8222 private_key: "testkey.pem",
8223 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008224 `,
8225 android.FixtureModifyConfig(func(config android.Config) {
8226 delete(config.Targets, android.Android)
8227 config.AndroidCommonTarget = android.Target{}
8228 }),
8229 )
Jooyung Han49f67012020-04-17 13:43:10 +09008230
8231 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8232 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8233 }
8234}
8235
Jiyong Parkbd159612020-02-28 15:22:21 +09008236func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008237 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008238 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008239 apex {
8240 name: "myapex",
8241 key: "myapex.key",
8242 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008243 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008244 }
8245
8246 apex_key {
8247 name: "myapex.key",
8248 public_key: "testkey.avbpubkey",
8249 private_key: "testkey.pem",
8250 }
8251
8252 android_app {
8253 name: "AppFoo",
8254 srcs: ["foo/bar/MyClass.java"],
8255 sdk_version: "none",
8256 system_modules: "none",
8257 apex_available: [ "myapex" ],
8258 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008259 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008260
Jooyung Hana0503a52023-08-23 13:12:50 +09008261 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008262 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008263
8264 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008265 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 +09008266}
8267
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008268func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008269 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008270 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008271 apex {
8272 name: "myapex",
8273 key: "myapex.key",
8274 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008275 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008276 }
8277
8278 apex_key {
8279 name: "myapex.key",
8280 public_key: "testkey.avbpubkey",
8281 private_key: "testkey.pem",
8282 }
8283
8284 android_app_set {
8285 name: "AppSet",
8286 set: "AppSet.apks",
8287 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008288 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008289 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008290 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008291 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8292 s := mod.Rule("apexRule").Args["copy_commands"]
8293 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008294 if len(copyCmds) != 4 {
8295 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008296 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008297 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8298 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008299 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8300 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008301
8302 // Ensure that canned_fs_config has an entry for the app set zip file
8303 generateFsRule := mod.Rule("generateFsConfig")
8304 cmd := generateFsRule.RuleParams.Command
8305 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008306}
8307
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008308func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008309 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008310 apex_set {
8311 name: "myapex",
8312 filename: "foo_v2.apex",
8313 sanitized: {
8314 none: { set: "myapex.apks", },
8315 hwaddress: { set: "myapex.hwasan.apks", },
8316 },
Paul Duffin24704672021-04-06 16:09:30 +01008317 }
8318 `
8319 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008320
Paul Duffin24704672021-04-06 16:09:30 +01008321 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008322 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008323
Spandan Das9d6e2092024-09-21 02:50:00 +00008324 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008325 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008326
Paul Duffin24704672021-04-06 16:09:30 +01008327 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8328
8329 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008330 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8331 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008332
8333 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008334}
8335
Pranav Guptaeba03b02022-09-27 00:27:08 +00008336func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008337 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008338 ctx := testApex(t, `
8339 apex_set {
8340 name: "myapex",
8341 set: ":myapex_apks_file",
8342 }
8343
8344 filegroup {
8345 name: "myapex_apks_file",
8346 srcs: ["myapex.apks"],
8347 }
8348 `)
8349
Spandan Das9d6e2092024-09-21 02:50:00 +00008350 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008351
8352 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008353 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008354 extractedApex := m.Output(extractorOutput)
8355
8356 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8357}
8358
Paul Duffin89f570a2021-06-16 01:42:33 +01008359func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008360 t.Helper()
8361
Paul Duffin55607122021-03-30 23:32:51 +01008362 fs := android.MockFS{
8363 "a.java": nil,
8364 "a.jar": nil,
8365 "apex_manifest.json": nil,
8366 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008367 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008368 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8369 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8370 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008371 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008372 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008373
Paul Duffin55607122021-03-30 23:32:51 +01008374 errorHandler := android.FixtureExpectsNoErrors
8375 if errmsg != "" {
8376 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008377 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008378
Paul Duffin55607122021-03-30 23:32:51 +01008379 result := android.GroupFixturePreparers(
8380 cc.PrepareForTestWithCcDefaultModules,
8381 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008382 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008383 java.PrepareForTestWithJavaSdkLibraryFiles,
8384 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008385 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008386 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008387 android.FixtureModifyMockFS(func(fs android.MockFS) {
8388 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8389 insert := ""
8390 for _, fragment := range fragments {
8391 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8392 }
8393 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8394 platform_bootclasspath {
8395 name: "platform-bootclasspath",
8396 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008397 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008398 %s
8399 ],
8400 }
8401 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008402 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008403 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008404 // Dexpreopt for boot jars requires the ART boot image profile.
8405 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8406 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008407 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008408 ).
8409 ExtendWithErrorHandler(errorHandler).
8410 RunTestWithBp(t, bp)
8411
8412 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008413}
8414
Jooyung Han548640b2020-04-27 12:10:30 +09008415func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008416 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008417 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8418 apex {
8419 name: "myapex",
8420 key: "myapex.key",
8421 updatable: true,
8422 }
8423
8424 apex_key {
8425 name: "myapex.key",
8426 public_key: "testkey.avbpubkey",
8427 private_key: "testkey.pem",
8428 }
8429 `)
8430}
8431
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008432func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008433 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008434 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8435 apex {
8436 name: "myapex",
8437 key: "myapex.key",
8438 }
8439
8440 apex_key {
8441 name: "myapex.key",
8442 public_key: "testkey.avbpubkey",
8443 private_key: "testkey.pem",
8444 }
8445 `)
8446}
8447
satayevb98371c2021-06-15 16:49:50 +01008448func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008449 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008450 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8451 apex {
8452 name: "myapex",
8453 key: "myapex.key",
8454 systemserverclasspath_fragments: [
8455 "mysystemserverclasspathfragment",
8456 ],
8457 min_sdk_version: "29",
8458 updatable: true,
8459 }
8460
8461 apex_key {
8462 name: "myapex.key",
8463 public_key: "testkey.avbpubkey",
8464 private_key: "testkey.pem",
8465 }
8466
8467 java_library {
8468 name: "foo",
8469 srcs: ["b.java"],
8470 min_sdk_version: "29",
8471 installable: true,
8472 apex_available: [
8473 "myapex",
8474 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008475 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008476 }
8477
8478 systemserverclasspath_fragment {
8479 name: "mysystemserverclasspathfragment",
8480 generate_classpaths_proto: false,
8481 contents: [
8482 "foo",
8483 ],
8484 apex_available: [
8485 "myapex",
8486 ],
8487 }
satayevabcd5972021-08-06 17:49:46 +01008488 `,
8489 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8490 )
satayevb98371c2021-06-15 16:49:50 +01008491}
8492
Paul Duffin064b70c2020-11-02 17:32:38 +00008493func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008494 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008495 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008496 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008497 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008498 fragment := java.ApexVariantReference{
8499 Apex: proptools.StringPtr("myapex"),
8500 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8501 }
8502
Paul Duffin064b70c2020-11-02 17:32:38 +00008503 testDexpreoptWithApexes(t, `
8504 prebuilt_apex {
8505 name: "myapex" ,
8506 arch: {
8507 arm64: {
8508 src: "myapex-arm64.apex",
8509 },
8510 arm: {
8511 src: "myapex-arm.apex",
8512 },
8513 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008514 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8515 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008516
Paul Duffin89f570a2021-06-16 01:42:33 +01008517 prebuilt_bootclasspath_fragment {
8518 name: "my-bootclasspath-fragment",
8519 contents: ["libfoo"],
8520 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008521 hidden_api: {
8522 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8523 metadata: "my-bootclasspath-fragment/metadata.csv",
8524 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008525 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8526 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8527 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008528 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008529 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008530
Spandan Das52c01a12024-09-20 01:09:48 +00008531 java_sdk_library_import {
8532 name: "libfoo",
8533 prefer: true,
8534 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008535 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008536 },
8537 apex_available: ["myapex"],
8538 shared_library: false,
8539 permitted_packages: ["libfoo"],
8540 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008541 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008542 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008543}
8544
Spandan Dasf14e2542021-11-12 00:01:37 +00008545func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008546 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008547 bp += `
8548 apex_key {
8549 name: "myapex.key",
8550 public_key: "testkey.avbpubkey",
8551 private_key: "testkey.pem",
8552 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008553 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008554 "lib1/src/A.java": nil,
8555 "lib2/src/B.java": nil,
8556 "system/sepolicy/apex/myapex-file_contexts": nil,
8557 }
8558
Paul Duffin45338f02021-03-30 23:07:52 +01008559 errorHandler := android.FixtureExpectsNoErrors
8560 if errmsg != "" {
8561 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008562 }
Colin Crossae8600b2020-10-29 17:09:13 -07008563
Paul Duffin45338f02021-03-30 23:07:52 +01008564 android.GroupFixturePreparers(
8565 android.PrepareForTestWithAndroidBuildComponents,
8566 java.PrepareForTestWithJavaBuildComponents,
8567 PrepareForTestWithApexBuildComponents,
8568 android.PrepareForTestWithNeverallowRules(rules),
8569 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008570 apexBootJars := make([]string, 0, len(bootJars))
8571 for _, apexBootJar := range bootJars {
8572 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008573 }
satayevd604b212021-07-21 14:23:52 +01008574 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008575 }),
8576 fs.AddToFixture(),
8577 ).
8578 ExtendWithErrorHandler(errorHandler).
8579 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008580}
8581
8582func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008583 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008584 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008585 name string
8586 expectedError string
8587 bp string
8588 bootJars []string
8589 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008590 }{
8591
8592 {
8593 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8594 expectedError: "",
8595 bp: `
8596 java_library {
8597 name: "bcp_lib1",
8598 srcs: ["lib1/src/*.java"],
8599 permitted_packages: ["foo.bar"],
8600 apex_available: ["myapex"],
8601 sdk_version: "none",
8602 system_modules: "none",
8603 }
8604 java_library {
8605 name: "nonbcp_lib2",
8606 srcs: ["lib2/src/*.java"],
8607 apex_available: ["myapex"],
8608 permitted_packages: ["a.b"],
8609 sdk_version: "none",
8610 system_modules: "none",
8611 }
8612 apex {
8613 name: "myapex",
8614 key: "myapex.key",
8615 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008616 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008617 }`,
8618 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008619 bcpPermittedPackages: map[string][]string{
8620 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008621 "foo.bar",
8622 },
8623 },
8624 },
8625 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008626 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008627 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 +01008628 bp: `
8629 java_library {
8630 name: "bcp_lib1",
8631 srcs: ["lib1/src/*.java"],
8632 apex_available: ["myapex"],
8633 permitted_packages: ["foo.bar"],
8634 sdk_version: "none",
8635 system_modules: "none",
8636 }
8637 java_library {
8638 name: "bcp_lib2",
8639 srcs: ["lib2/src/*.java"],
8640 apex_available: ["myapex"],
8641 permitted_packages: ["foo.bar", "bar.baz"],
8642 sdk_version: "none",
8643 system_modules: "none",
8644 }
8645 apex {
8646 name: "myapex",
8647 key: "myapex.key",
8648 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008649 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008650 }
8651 `,
8652 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008653 bcpPermittedPackages: map[string][]string{
8654 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008655 "foo.bar",
8656 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008657 "bcp_lib2": []string{
8658 "foo.bar",
8659 },
8660 },
8661 },
8662 {
8663 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8664 expectedError: "",
8665 bp: `
8666 java_library {
8667 name: "bcp_lib_restricted",
8668 srcs: ["lib1/src/*.java"],
8669 apex_available: ["myapex"],
8670 permitted_packages: ["foo.bar"],
8671 sdk_version: "none",
8672 min_sdk_version: "29",
8673 system_modules: "none",
8674 }
8675 java_library {
8676 name: "bcp_lib_unrestricted",
8677 srcs: ["lib2/src/*.java"],
8678 apex_available: ["myapex"],
8679 permitted_packages: ["foo.bar", "bar.baz"],
8680 sdk_version: "none",
8681 min_sdk_version: "29",
8682 system_modules: "none",
8683 }
8684 apex {
8685 name: "myapex",
8686 key: "myapex.key",
8687 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8688 updatable: true,
8689 min_sdk_version: "29",
8690 }
8691 `,
8692 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8693 bcpPermittedPackages: map[string][]string{
8694 "bcp_lib1_non_updateable": []string{
8695 "foo.bar",
8696 },
8697 // 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 +01008698 },
8699 },
8700 }
8701 for _, tc := range testcases {
8702 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008703 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008704 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8705 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008706 })
8707 }
8708}
8709
Jiyong Park62304bb2020-04-13 16:19:48 +09008710func TestTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008711 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008712 ctx := testApex(t, `
Jiyong Park62304bb2020-04-13 16:19:48 +09008713 apex {
8714 name: "myapex",
8715 key: "myapex.key",
8716 native_shared_libs: ["mylib", "myprivlib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008717 updatable: false,
Jiyong Park62304bb2020-04-13 16:19:48 +09008718 }
8719
8720 apex_key {
8721 name: "myapex.key",
8722 public_key: "testkey.avbpubkey",
8723 private_key: "testkey.pem",
8724 }
8725
8726 cc_library {
8727 name: "mylib",
8728 srcs: ["mylib.cpp"],
8729 system_shared_libs: [],
8730 stl: "none",
8731 stubs: {
8732 versions: ["1"],
8733 },
8734 apex_available: ["myapex"],
8735 }
8736
8737 cc_library {
8738 name: "myprivlib",
8739 srcs: ["mylib.cpp"],
8740 system_shared_libs: [],
8741 stl: "none",
8742 apex_available: ["myapex"],
8743 }
8744
8745
8746 cc_test {
8747 name: "mytest",
8748 gtest: false,
8749 srcs: ["mylib.cpp"],
8750 system_shared_libs: [],
8751 stl: "none",
Jiyong Park46a512f2020-12-04 18:02:13 +09008752 shared_libs: ["mylib", "myprivlib", "mytestlib"],
Jiyong Park62304bb2020-04-13 16:19:48 +09008753 test_for: ["myapex"]
8754 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008755
8756 cc_library {
8757 name: "mytestlib",
8758 srcs: ["mylib.cpp"],
8759 system_shared_libs: [],
8760 shared_libs: ["mylib", "myprivlib"],
8761 stl: "none",
8762 test_for: ["myapex"],
8763 }
8764
8765 cc_benchmark {
8766 name: "mybench",
8767 srcs: ["mylib.cpp"],
8768 system_shared_libs: [],
8769 shared_libs: ["mylib", "myprivlib"],
8770 stl: "none",
8771 test_for: ["myapex"],
8772 }
Jiyong Park62304bb2020-04-13 16:19:48 +09008773 `)
8774
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008775 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008776 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008777 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8778 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8779 }
8780
8781 // These modules are tests for the apex, therefore are linked to the
Jiyong Park62304bb2020-04-13 16:19:48 +09008782 // actual implementation of mylib instead of its stub.
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008783 ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8784 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8785 ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
8786}
Jiyong Park46a512f2020-12-04 18:02:13 +09008787
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008788func TestIndirectTestFor(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008789 t.Parallel()
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008790 ctx := testApex(t, `
8791 apex {
8792 name: "myapex",
8793 key: "myapex.key",
8794 native_shared_libs: ["mylib", "myprivlib"],
8795 updatable: false,
8796 }
Jiyong Park46a512f2020-12-04 18:02:13 +09008797
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008798 apex_key {
8799 name: "myapex.key",
8800 public_key: "testkey.avbpubkey",
8801 private_key: "testkey.pem",
8802 }
8803
8804 cc_library {
8805 name: "mylib",
8806 srcs: ["mylib.cpp"],
8807 system_shared_libs: [],
8808 stl: "none",
8809 stubs: {
8810 versions: ["1"],
8811 },
8812 apex_available: ["myapex"],
8813 }
8814
8815 cc_library {
8816 name: "myprivlib",
8817 srcs: ["mylib.cpp"],
8818 system_shared_libs: [],
8819 stl: "none",
8820 shared_libs: ["mylib"],
8821 apex_available: ["myapex"],
8822 }
8823
8824 cc_library {
8825 name: "mytestlib",
8826 srcs: ["mylib.cpp"],
8827 system_shared_libs: [],
8828 shared_libs: ["myprivlib"],
8829 stl: "none",
8830 test_for: ["myapex"],
8831 }
8832 `)
8833
8834 ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
Paul Duffina71a67a2021-03-29 00:42:57 +01008835 ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
Martin Stjernholm4e6c2692021-03-25 01:25:06 +00008836 mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
8837 android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
8838 }
8839
8840 // The platform variant of mytestlib links to the platform variant of the
8841 // internal myprivlib.
8842 ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
8843
8844 // The platform variant of myprivlib links to the platform variant of mylib
8845 // and bypasses its stubs.
8846 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 +09008847}
8848
Martin Stjernholmec009002021-03-27 15:18:31 +00008849func TestTestForForLibInOtherApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008850 t.Parallel()
Martin Stjernholmec009002021-03-27 15:18:31 +00008851 // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
8852 _ = testApex(t, `
8853 apex {
8854 name: "com.android.art",
8855 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008856 native_shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008857 updatable: false,
8858 }
8859
8860 apex {
8861 name: "com.android.art.debug",
8862 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00008863 native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008864 updatable: false,
8865 }
8866
8867 apex_key {
8868 name: "myapex.key",
8869 public_key: "testkey.avbpubkey",
8870 private_key: "testkey.pem",
8871 }
8872
8873 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008874 name: "libnativebridge",
8875 srcs: ["libnativebridge.cpp"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008876 system_shared_libs: [],
8877 stl: "none",
8878 stubs: {
8879 versions: ["1"],
8880 },
8881 apex_available: ["com.android.art", "com.android.art.debug"],
8882 }
8883
8884 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00008885 name: "libnativebrdige_test",
Martin Stjernholmec009002021-03-27 15:18:31 +00008886 srcs: ["mylib.cpp"],
8887 system_shared_libs: [],
Spandan Das20fce2d2023-04-12 17:21:39 +00008888 shared_libs: ["libnativebridge"],
Martin Stjernholmec009002021-03-27 15:18:31 +00008889 stl: "none",
8890 apex_available: ["com.android.art.debug"],
8891 test_for: ["com.android.art"],
8892 }
8893 `,
8894 android.MockFS{
8895 "system/sepolicy/apex/com.android.art-file_contexts": nil,
8896 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
8897 }.AddToFixture())
8898}
8899
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008900// TODO(jungjw): Move this to proptools
8901func intPtr(i int) *int {
8902 return &i
8903}
8904
8905func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008906 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008907 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008908 apex_set {
8909 name: "myapex",
8910 set: "myapex.apks",
8911 filename: "foo_v2.apex",
8912 overrides: ["foo"],
8913 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008914 `,
8915 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8916 variables.Platform_sdk_version = intPtr(30)
8917 }),
8918 android.FixtureModifyConfig(func(config android.Config) {
8919 config.Targets[android.Android] = []android.Target{
8920 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8921 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8922 }
8923 }),
8924 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008925
Spandan Das9d6e2092024-09-21 02:50:00 +00008926 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008927
8928 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008929 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008930 actual := extractedApex.Args["abis"]
8931 expected := "ARMEABI_V7A,ARM64_V8A"
8932 if actual != expected {
8933 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8934 }
8935 actual = extractedApex.Args["sdk-version"]
8936 expected = "30"
8937 if actual != expected {
8938 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8939 }
8940
Paul Duffin6717d882021-06-15 19:09:41 +01008941 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008942 a := m.Module().(*ApexSet)
8943 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008944 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008945 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8946 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8947 }
8948}
8949
Anton Hansson805e0a52022-11-25 14:06:46 +00008950func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008951 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008952 ctx := testApex(t, `
8953 apex_set {
8954 name: "myapex",
8955 set: "myapex.apks",
8956 filename: "foo_v2.apex",
8957 overrides: ["foo"],
8958 }
8959 `,
8960 android.FixtureModifyConfig(func(config android.Config) {
8961 config.Targets[android.Android] = []android.Target{
8962 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8963 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8964 }
8965 }),
8966 )
8967
Spandan Das9d6e2092024-09-21 02:50:00 +00008968 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008969
8970 // Check extract_apks tool parameters. No native bridge arch expected
8971 extractedApex := m.Output("extracted/myapex.apks")
8972 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8973}
8974
Jiyong Park7d95a512020-05-10 15:16:24 +09008975func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008976 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008977 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8978 apex {
8979 name: "myapex",
8980 key: "myapex.key",
8981 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008982 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008983 }
8984
8985 apex_key {
8986 name: "myapex.key",
8987 public_key: "testkey.avbpubkey",
8988 private_key: "testkey.pem",
8989 }
8990
8991 cc_library {
8992 name: "mylib",
8993 srcs: ["mylib.cpp"],
8994 static_libs: ["otherlib"],
8995 system_shared_libs: [],
8996 stl: "none",
8997 apex_available: [ "myapex" ],
8998 }
8999
9000 cc_library {
9001 name: "otherlib",
9002 srcs: ["mylib.cpp"],
9003 system_shared_libs: [],
9004 stl: "none",
9005 stubs: {
9006 versions: ["1", "2", "3"],
9007 },
9008 apex_available: [ "myapex" ],
9009 }
9010 `)
9011}
9012
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009013func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009014 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009015 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009016 apex {
9017 name: "myapex",
9018 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009019 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009020 custom_sign_tool: "sign_myapex",
9021 }
9022
9023 apex_key {
9024 name: "myapex.key",
9025 public_key: "testkey.avbpubkey",
9026 private_key: "testkey.pem",
9027 }
9028 `)
9029
Jooyung Han286957d2023-10-30 16:17:56 +09009030 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009031 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009032 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 +09009033}
9034
9035func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009036 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009037 ctx := testApex(t, `
9038 apex {
9039 name: "myapex",
9040 key: "myapex.key",
9041 updatable: false,
9042 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009043 }
9044
9045 apex_key {
9046 name: "myapex.key",
9047 public_key: "testkey.avbpubkey",
9048 private_key: "testkey.pem",
9049 }
9050
9051 prebuilt_apex {
9052 name: "myapex",
9053 prefer: true,
9054 arch: {
9055 arm64: {
9056 src: "myapex-arm64.apex",
9057 },
9058 arm: {
9059 src: "myapex-arm.apex",
9060 },
9061 },
9062 }
9063
9064 apex_set {
9065 name: "myapex_set",
9066 set: "myapex.apks",
9067 filename: "myapex_set.apex",
9068 overrides: ["myapex"],
9069 }
9070 `)
9071
Colin Crossf61d03d2023-11-02 16:56:39 -07009072 content := android.ContentFromFileRuleForTests(t, ctx,
9073 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009074 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 -07009075 content = android.ContentFromFileRuleForTests(t, ctx,
9076 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009077 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 +09009078}
9079
Jooyung Han938b5932020-06-20 12:47:47 +09009080func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009081 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009082 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009083 apex {
9084 name: "myapex",
9085 key: "myapex.key",
9086 apps: ["app"],
9087 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009088 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009089 }
9090
9091 apex_key {
9092 name: "myapex.key",
9093 public_key: "testkey.avbpubkey",
9094 private_key: "testkey.pem",
9095 }
9096
9097 android_app {
9098 name: "app",
9099 srcs: ["foo/bar/MyClass.java"],
9100 package_name: "foo",
9101 sdk_version: "none",
9102 system_modules: "none",
9103 apex_available: [ "myapex" ],
9104 }
9105 `, withFiles(map[string][]byte{
9106 "sub/Android.bp": []byte(`
9107 override_apex {
9108 name: "override_myapex",
9109 base: "myapex",
9110 apps: ["override_app"],
9111 allowed_files: ":allowed",
9112 }
9113 // Overridable "path" property should be referenced indirectly
9114 filegroup {
9115 name: "allowed",
9116 srcs: ["allowed.txt"],
9117 }
9118 override_android_app {
9119 name: "override_app",
9120 base: "app",
9121 package_name: "bar",
9122 }
9123 `),
9124 }))
9125
Jooyung Hana0503a52023-08-23 13:12:50 +09009126 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009127 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9128 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9129 }
9130
Spandan Das50801e22024-05-13 18:29:45 +00009131 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009132 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9133 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9134 }
9135}
9136
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009137func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009139 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009140 apex {
9141 name: "myapex",
9142 key: "myapex.key",
9143 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009144 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009145 }
9146
9147 apex_key {
9148 name: "myapex.key",
9149 public_key: "testkey.avbpubkey",
9150 private_key: "testkey.pem",
9151 }
9152
9153 cc_library {
9154 name: "mylib",
9155 srcs: ["mylib.cpp"],
9156 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009157 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009158 },
9159 apex_available: ["myapex"],
9160 }
9161
9162 cc_prebuilt_library_shared {
9163 name: "mylib",
9164 prefer: false,
9165 srcs: ["prebuilt.so"],
9166 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009167 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009168 },
9169 apex_available: ["myapex"],
9170 }
9171 `)
9172}
9173
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009174func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009175 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009176 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009177 apex {
9178 name: "myapex",
9179 key: "myapex.key",
9180 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009181 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009182 }
9183 apex_key {
9184 name: "myapex.key",
9185 public_key: "testkey.avbpubkey",
9186 private_key: "testkey.pem",
9187 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009188 `,
9189 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9190 variables.CompressedApex = proptools.BoolPtr(true)
9191 }),
9192 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009193
Jooyung Hana0503a52023-08-23 13:12:50 +09009194 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009195 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9196
Jooyung Hana0503a52023-08-23 13:12:50 +09009197 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009198 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9199
9200 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009201 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009202 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9203
9204 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009205 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009206 var builder strings.Builder
9207 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9208 androidMk := builder.String()
9209 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9210}
9211
Jooyung Han26ec8482024-07-31 15:04:05 +09009212func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009213 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009214 for _, compressionEnabled := range []bool{true, false} {
9215 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009216 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009217 ctx := testApex(t, `
9218 apex_set {
9219 name: "com.company.android.myapex",
9220 apex_name: "com.android.myapex",
9221 set: "company-myapex.apks",
9222 }
9223 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9224 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9225 }),
9226 )
9227
9228 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9229 if compressionEnabled {
9230 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9231 } else {
9232 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9233 }
9234 })
9235 }
9236}
9237
Martin Stjernholm2856c662020-12-02 15:03:42 +00009238func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009239 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009240 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009241 apex {
9242 name: "myapex",
9243 key: "myapex.key",
9244 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009245 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009246 }
9247
9248 apex_key {
9249 name: "myapex.key",
9250 public_key: "testkey.avbpubkey",
9251 private_key: "testkey.pem",
9252 }
9253
9254 cc_library {
9255 name: "mylib",
9256 srcs: ["mylib.cpp"],
9257 apex_available: ["myapex"],
9258 shared_libs: ["otherlib"],
9259 system_shared_libs: [],
9260 }
9261
9262 cc_library {
9263 name: "otherlib",
9264 srcs: ["mylib.cpp"],
9265 stubs: {
9266 versions: ["current"],
9267 },
9268 }
9269
9270 cc_prebuilt_library_shared {
9271 name: "otherlib",
9272 prefer: true,
9273 srcs: ["prebuilt.so"],
9274 stubs: {
9275 versions: ["current"],
9276 },
9277 }
9278 `)
9279
Jooyung Hana0503a52023-08-23 13:12:50 +09009280 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009281 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009282 var builder strings.Builder
9283 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9284 androidMk := builder.String()
9285
9286 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9287 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009288 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009289}
9290
Jiyong Parke3867542020-12-03 17:28:25 +09009291func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009292 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009293 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009294 apex {
9295 name: "myapex",
9296 key: "myapex.key",
9297 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009298 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009299 }
9300
9301 apex_key {
9302 name: "myapex.key",
9303 public_key: "testkey.avbpubkey",
9304 private_key: "testkey.pem",
9305 }
9306
9307 cc_library {
9308 name: "mylib",
9309 srcs: ["mylib.cpp"],
9310 system_shared_libs: [],
9311 stl: "none",
9312 apex_available: ["myapex"],
9313 shared_libs: ["mylib2"],
9314 target: {
9315 apex: {
9316 exclude_shared_libs: ["mylib2"],
9317 },
9318 },
9319 }
9320
9321 cc_library {
9322 name: "mylib2",
9323 srcs: ["mylib.cpp"],
9324 system_shared_libs: [],
9325 stl: "none",
9326 }
9327 `)
9328
9329 // Check if mylib is linked to mylib2 for the non-apex target
9330 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9331 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9332
9333 // Make sure that the link doesn't occur for the apex target
9334 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9335 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9336
9337 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009338 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009339 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9340}
9341
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009342func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009343 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009344 bpBase := `
9345 apex {
9346 name: "myapex",
9347 key: "myapex.key",
9348 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009349 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009350 }
9351 apex_key {
9352 name: "myapex.key",
9353 public_key: "testkey.avbpubkey",
9354 private_key: "testkey.pem",
9355 }
9356 cc_library {
9357 name: "mylib",
9358 srcs: ["mylib.cpp"],
9359 apex_available: ["myapex"],
9360 shared_libs: ["stublib"],
9361 system_shared_libs: [],
9362 }
9363 apex {
9364 name: "otherapex",
9365 enabled: %s,
9366 key: "myapex.key",
9367 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009368 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009369 }
9370 `
9371
9372 stublibSourceBp := `
9373 cc_library {
9374 name: "stublib",
9375 srcs: ["mylib.cpp"],
9376 apex_available: ["otherapex"],
9377 system_shared_libs: [],
9378 stl: "none",
9379 stubs: {
9380 versions: ["1"],
9381 },
9382 }
9383 `
9384
9385 stublibPrebuiltBp := `
9386 cc_prebuilt_library_shared {
9387 name: "stublib",
9388 srcs: ["prebuilt.so"],
9389 apex_available: ["otherapex"],
9390 stubs: {
9391 versions: ["1"],
9392 },
9393 %s
9394 }
9395 `
9396
9397 tests := []struct {
9398 name string
9399 stublibBp string
9400 usePrebuilt bool
9401 modNames []string // Modules to collect AndroidMkEntries for
9402 otherApexEnabled []string
9403 }{
9404 {
9405 name: "only_source",
9406 stublibBp: stublibSourceBp,
9407 usePrebuilt: false,
9408 modNames: []string{"stublib"},
9409 otherApexEnabled: []string{"true", "false"},
9410 },
9411 {
9412 name: "source_preferred",
9413 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9414 usePrebuilt: false,
9415 modNames: []string{"stublib", "prebuilt_stublib"},
9416 otherApexEnabled: []string{"true", "false"},
9417 },
9418 {
9419 name: "prebuilt_preferred",
9420 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9421 usePrebuilt: true,
9422 modNames: []string{"stublib", "prebuilt_stublib"},
9423 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9424 },
9425 {
9426 name: "only_prebuilt",
9427 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9428 usePrebuilt: true,
9429 modNames: []string{"stublib"},
9430 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9431 },
9432 }
9433
9434 for _, test := range tests {
9435 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009436 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009437 for _, otherApexEnabled := range test.otherApexEnabled {
9438 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009439 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009440 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009441
9442 type modAndMkEntries struct {
9443 mod *cc.Module
Priyanka Advani (xWF)37e67942024-10-17 18:58:08 +00009444 mkEntries android.AndroidMkEntries
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009445 }
9446 entries := []*modAndMkEntries{}
9447
9448 // Gather shared lib modules that are installable
9449 for _, modName := range test.modNames {
9450 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9451 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9452 continue
9453 }
9454 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009455 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009456 continue
9457 }
Priyanka Advani (xWF)37e67942024-10-17 18:58:08 +00009458 for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009459 if ent.Disabled {
9460 continue
9461 }
9462 entries = append(entries, &modAndMkEntries{
9463 mod: mod,
9464 mkEntries: ent,
9465 })
9466 }
9467 }
9468 }
9469
9470 var entry *modAndMkEntries = nil
9471 for _, ent := range entries {
9472 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9473 if entry != nil {
9474 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9475 } else {
9476 entry = ent
9477 }
9478 }
9479 }
9480
9481 if entry == nil {
9482 t.Errorf("AndroidMk entry for \"stublib\" missing")
9483 } else {
9484 isPrebuilt := entry.mod.Prebuilt() != nil
9485 if isPrebuilt != test.usePrebuilt {
9486 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9487 }
9488 if !entry.mod.IsStubs() {
9489 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9490 }
9491 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9492 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9493 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009494 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009495 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009496 if !android.InList(expected, cflags) {
9497 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9498 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009499 }
9500 })
9501 }
9502 })
9503 }
9504}
9505
Colin Crossc33e5212021-05-25 18:16:02 -07009506func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009507 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009508 bp := `
9509 apex {
9510 name: "myapex",
9511 key: "myapex.key",
9512 java_libs: ["mylib"],
9513 bootclasspath_fragments: ["mybootclasspathfragment"],
9514 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9515 updatable: false,
9516 }
9517
9518 apex_key {
9519 name: "myapex.key",
9520 public_key: "testkey.avbpubkey",
9521 private_key: "testkey.pem",
9522 }
9523
9524 java_library {
9525 name: "mylib",
9526 srcs: ["mylib.java"],
9527 apex_available: ["myapex"],
9528 compile_dex: true,
9529 }
9530
9531 bootclasspath_fragment {
9532 name: "mybootclasspathfragment",
9533 contents: ["mybootclasspathlib"],
9534 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009535 hidden_api: {
9536 split_packages: ["*"],
9537 },
Colin Crossc33e5212021-05-25 18:16:02 -07009538 }
9539
9540 java_library {
9541 name: "mybootclasspathlib",
9542 srcs: ["mybootclasspathlib.java"],
9543 apex_available: ["myapex"],
9544 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009545 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009546 }
9547
9548 systemserverclasspath_fragment {
9549 name: "mysystemserverclasspathfragment",
9550 contents: ["mysystemserverclasspathlib"],
9551 apex_available: ["myapex"],
9552 }
9553
9554 java_library {
9555 name: "mysystemserverclasspathlib",
9556 srcs: ["mysystemserverclasspathlib.java"],
9557 apex_available: ["myapex"],
9558 compile_dex: true,
9559 }
9560 `
9561
9562 result := android.GroupFixturePreparers(
9563 PrepareForTestWithApexBuildComponents,
9564 prepareForTestWithMyapex,
9565 java.PrepareForTestWithJavaDefaultModules,
9566 android.PrepareForTestWithAndroidBuildComponents,
9567 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009568 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9569 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009570 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009571 ).RunTest(t)
9572
9573 // Make sure jacoco ran on both mylib and mybootclasspathlib
9574 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9575 t.Errorf("Failed to find jacoco rule for mylib")
9576 }
9577 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9578 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9579 }
9580 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9581 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9582 }
9583}
9584
Jiyong Park192600a2021-08-03 07:52:17 +00009585func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009586 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009587 testApexError(t, `executable mybin is static`, `
9588 apex {
9589 name: "myapex",
9590 key: "myapex.key",
9591 binaries: ["mybin"],
9592 min_sdk_version: "29",
9593 }
9594
9595 apex_key {
9596 name: "myapex.key",
9597 public_key: "testkey.avbpubkey",
9598 private_key: "testkey.pem",
9599 }
9600
9601 cc_binary {
9602 name: "mybin",
9603 srcs: ["mylib.cpp"],
9604 relative_install_path: "foo/bar",
9605 static_executable: true,
9606 system_shared_libs: [],
9607 stl: "none",
9608 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009609 min_sdk_version: "29",
9610 }
9611 `)
9612
9613 testApexError(t, `executable mybin.rust is static`, `
9614 apex {
9615 name: "myapex",
9616 key: "myapex.key",
9617 binaries: ["mybin.rust"],
9618 min_sdk_version: "29",
9619 }
9620
9621 apex_key {
9622 name: "myapex.key",
9623 public_key: "testkey.avbpubkey",
9624 private_key: "testkey.pem",
9625 }
9626
9627 rust_binary {
9628 name: "mybin.rust",
9629 srcs: ["foo.rs"],
9630 static_executable: true,
9631 apex_available: ["myapex"],
9632 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009633 }
9634 `)
9635}
9636
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009637func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009638 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009639 ctx := testApex(t, `
9640 apex {
9641 name: "myapex",
9642 key: "myapex.key",
9643 updatable: false,
9644 java_libs: ["foo"],
9645 }
9646
9647 apex_key {
9648 name: "myapex.key",
9649 public_key: "testkey.avbpubkey",
9650 private_key: "testkey.pem",
9651 }
9652
9653 java_library {
9654 name: "foo",
9655 srcs: ["foo.java"],
9656 apex_available: ["myapex"],
9657 installable: true,
9658 }
9659 `,
9660 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9661 )
9662
Jooyung Hana0503a52023-08-23 13:12:50 +09009663 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009664 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9665 var builder strings.Builder
9666 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9667 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009668 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 +00009669}
9670
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009671func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009672 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009673 ctx := testApex(t, `
9674 apex {
9675 name: "myapex",
9676 key: "myapex.key",
9677 updatable: false,
9678 java_libs: ["foo"],
9679 required: ["otherapex"],
9680 }
9681
9682 apex {
9683 name: "otherapex",
9684 key: "myapex.key",
9685 updatable: false,
9686 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009687 }
9688
9689 apex_key {
9690 name: "myapex.key",
9691 public_key: "testkey.avbpubkey",
9692 private_key: "testkey.pem",
9693 }
9694
9695 java_library {
9696 name: "foo",
9697 srcs: ["foo.java"],
9698 apex_available: ["myapex", "otherapex"],
9699 installable: true,
9700 }
9701 `)
9702
Jooyung Hana0503a52023-08-23 13:12:50 +09009703 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009704 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9705 var builder strings.Builder
9706 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9707 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009708 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009709}
9710
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009711func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009712 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009713 ctx := testApex(t, `
9714 apex {
9715 name: "myapex",
9716 key: "myapex.key",
9717 updatable: false,
9718 }
9719
9720 apex_key {
9721 name: "myapex.key",
9722 public_key: "testkey.avbpubkey",
9723 private_key: "testkey.pem",
9724 }
9725 `)
9726
Jooyung Hana0503a52023-08-23 13:12:50 +09009727 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009728 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009729 data := android.AndroidMkDataForTest(t, ctx, bundle)
9730 var builder strings.Builder
9731 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9732 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009733 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009734}
9735
Jooyung Hana6d36672022-02-24 13:58:07 +09009736func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009737 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009738 for _, tc := range []struct {
9739 name string
9740 ref string
9741 expected_data []string
9742 }{
9743 {
9744 name: "test_using_output",
9745 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009746 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009747 },
9748 {
9749 name: "test_using_apex",
9750 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009751 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009752 },
9753 } {
9754 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009755 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009756 ctx := testApex(t, `
9757 apex {
9758 name: "myapex",
9759 key: "myapex.key",
9760 compressible: true,
9761 updatable: false,
9762 }
9763
9764 apex_key {
9765 name: "myapex.key",
9766 public_key: "testkey.avbpubkey",
9767 private_key: "testkey.pem",
9768 }
9769
9770 java_test {
9771 name: "`+tc.name+`",
9772 srcs: ["a.java"],
9773 data: ["`+tc.ref+`"],
9774 }
9775 `,
9776 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9777 variables.CompressedApex = proptools.BoolPtr(true)
9778 }))
9779 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9780 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9781 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9782 })
9783 }
9784}
9785
satayev758968a2021-12-06 11:42:40 +00009786func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009787 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009788 preparer := android.GroupFixturePreparers(
9789 PrepareForTestWithApexBuildComponents,
9790 prepareForTestWithMyapex,
9791 java.PrepareForTestWithJavaSdkLibraryFiles,
9792 java.PrepareForTestWithJavaDefaultModules,
9793 android.PrepareForTestWithAndroidBuildComponents,
9794 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9795 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9796 )
9797
9798 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9799 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009800 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009801 preparer.RunTestWithBp(t, `
9802 apex {
9803 name: "myapex",
9804 key: "myapex.key",
9805 bootclasspath_fragments: ["mybootclasspathfragment"],
9806 min_sdk_version: "30",
9807 updatable: false,
9808 }
9809
9810 apex_key {
9811 name: "myapex.key",
9812 public_key: "testkey.avbpubkey",
9813 private_key: "testkey.pem",
9814 }
9815
9816 bootclasspath_fragment {
9817 name: "mybootclasspathfragment",
9818 contents: ["mybootclasspathlib"],
9819 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009820 hidden_api: {
9821 split_packages: ["*"],
9822 },
satayev758968a2021-12-06 11:42:40 +00009823 }
9824
9825 java_sdk_library {
9826 name: "mybootclasspathlib",
9827 srcs: ["mybootclasspathlib.java"],
9828 apex_available: ["myapex"],
9829 compile_dex: true,
9830 unsafe_ignore_missing_latest_api: true,
9831 min_sdk_version: "31",
9832 static_libs: ["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: "util",
9838 srcs: ["a.java"],
9839 apex_available: ["myapex"],
9840 min_sdk_version: "31",
9841 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009842 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009843 }
9844
9845 java_library {
9846 name: "another_util",
9847 srcs: ["a.java"],
9848 min_sdk_version: "31",
9849 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009850 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009851 }
9852 `)
9853 })
9854
9855 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9856 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009857 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009858 preparer.RunTestWithBp(t, `
9859 apex {
9860 name: "myapex",
9861 key: "myapex.key",
9862 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9863 min_sdk_version: "30",
9864 updatable: false,
9865 }
9866
9867 apex_key {
9868 name: "myapex.key",
9869 public_key: "testkey.avbpubkey",
9870 private_key: "testkey.pem",
9871 }
9872
9873 systemserverclasspath_fragment {
9874 name: "mysystemserverclasspathfragment",
9875 contents: ["mysystemserverclasspathlib"],
9876 apex_available: ["myapex"],
9877 }
9878
9879 java_sdk_library {
9880 name: "mysystemserverclasspathlib",
9881 srcs: ["mysystemserverclasspathlib.java"],
9882 apex_available: ["myapex"],
9883 compile_dex: true,
9884 min_sdk_version: "32",
9885 unsafe_ignore_missing_latest_api: true,
9886 static_libs: ["util"],
9887 }
9888
9889 java_library {
9890 name: "util",
9891 srcs: ["a.java"],
9892 apex_available: ["myapex"],
9893 min_sdk_version: "31",
9894 static_libs: ["another_util"],
9895 }
9896
9897 java_library {
9898 name: "another_util",
9899 srcs: ["a.java"],
9900 min_sdk_version: "31",
9901 apex_available: ["myapex"],
9902 }
9903 `)
9904 })
9905
9906 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009907 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009908 preparer.
satayev758968a2021-12-06 11:42:40 +00009909 RunTestWithBp(t, `
9910 apex {
9911 name: "myapex",
9912 key: "myapex.key",
9913 bootclasspath_fragments: ["mybootclasspathfragment"],
9914 min_sdk_version: "30",
9915 updatable: false,
9916 }
9917
9918 apex_key {
9919 name: "myapex.key",
9920 public_key: "testkey.avbpubkey",
9921 private_key: "testkey.pem",
9922 }
9923
9924 bootclasspath_fragment {
9925 name: "mybootclasspathfragment",
9926 contents: ["mybootclasspathlib"],
9927 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009928 hidden_api: {
9929 split_packages: ["*"],
9930 },
satayev758968a2021-12-06 11:42:40 +00009931 }
9932
9933 java_sdk_library {
9934 name: "mybootclasspathlib",
9935 srcs: ["mybootclasspathlib.java"],
9936 apex_available: ["myapex"],
9937 compile_dex: true,
9938 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009939 sdk_version: "current",
9940 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009941 }
9942 `)
9943 })
9944
9945 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009946 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009947 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9948 RunTestWithBp(t, `
9949 apex {
9950 name: "myapex",
9951 key: "myapex.key",
9952 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9953 min_sdk_version: "30",
9954 updatable: false,
9955 }
9956
9957 apex_key {
9958 name: "myapex.key",
9959 public_key: "testkey.avbpubkey",
9960 private_key: "testkey.pem",
9961 }
9962
9963 systemserverclasspath_fragment {
9964 name: "mysystemserverclasspathfragment",
9965 contents: ["mysystemserverclasspathlib"],
9966 apex_available: ["myapex"],
9967 }
9968
9969 java_sdk_library {
9970 name: "mysystemserverclasspathlib",
9971 srcs: ["mysystemserverclasspathlib.java"],
9972 apex_available: ["myapex"],
9973 compile_dex: true,
9974 unsafe_ignore_missing_latest_api: true,
9975 }
9976 `)
9977 })
9978}
9979
Jiakai Zhang6decef92022-01-12 17:56:19 +00009980// Verifies that the APEX depends on all the Make modules in the list.
9981func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9982 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9983 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009984 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009985 }
9986}
9987
9988// Verifies that the APEX does not depend on any of the Make modules in the list.
9989func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9990 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9991 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009992 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009993 }
9994}
9995
Cole Faust24e25c02024-01-19 14:12:17 -08009996func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009997 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009998 bpTemplate := `
9999 apex {
10000 name: "myapex",
10001 key: "myapex.key",
10002 java_libs: ["myjavalib"],
10003 updatable: %v,
10004 min_sdk_version: "29",
10005 }
10006 apex_key {
10007 name: "myapex.key",
10008 }
10009 java_library {
10010 name: "myjavalib",
10011 srcs: ["MyClass.java"],
10012 apex_available: [ "myapex" ],
10013 lint: {
10014 strict_updatability_linting: %v,
10015 %s
10016 },
10017 sdk_version: "current",
10018 min_sdk_version: "29",
10019 }
10020 `
10021 fs := android.MockFS{
10022 "lint-baseline.xml": nil,
10023 }
10024
10025 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010026 testCaseName string
10027 apexUpdatable bool
10028 javaStrictUpdtabilityLint bool
10029 lintFileExists bool
10030 disallowedFlagExpectedOnApex bool
10031 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010032 }{
10033 {
Colin Cross87427352024-09-25 15:41:19 -070010034 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10035 apexUpdatable: true,
10036 javaStrictUpdtabilityLint: true,
10037 lintFileExists: false,
10038 disallowedFlagExpectedOnApex: false,
10039 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010040 },
10041 {
Colin Cross87427352024-09-25 15:41:19 -070010042 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10043 apexUpdatable: false,
10044 javaStrictUpdtabilityLint: false,
10045 lintFileExists: true,
10046 disallowedFlagExpectedOnApex: false,
10047 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010048 },
10049 {
Colin Cross87427352024-09-25 15:41:19 -070010050 testCaseName: "non-updatable apex respects strict updatability of javalib",
10051 apexUpdatable: false,
10052 javaStrictUpdtabilityLint: true,
10053 lintFileExists: true,
10054 disallowedFlagExpectedOnApex: false,
10055 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010056 },
10057 {
Colin Cross87427352024-09-25 15:41:19 -070010058 testCaseName: "updatable apex checks strict updatability of javalib",
10059 apexUpdatable: true,
10060 javaStrictUpdtabilityLint: false,
10061 lintFileExists: true,
10062 disallowedFlagExpectedOnApex: true,
10063 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010064 },
10065 }
10066
10067 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010068 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010069 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010070 fixtures := []android.FixturePreparer{}
10071 baselineProperty := ""
10072 if testCase.lintFileExists {
10073 fixtures = append(fixtures, fs.AddToFixture())
10074 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10075 }
10076 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010077
Colin Cross87427352024-09-25 15:41:19 -070010078 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010079
Colin Cross87427352024-09-25 15:41:19 -070010080 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10081 if expectStrictUpdatability {
10082 if m.Rule == nil {
10083 t.Errorf("expected strict updatability check rule on %s", name)
10084 } else {
10085 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10086 m.RuleParams.Command, "--disallowed_issues NewApi")
10087 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10088 m.Inputs.Strings(), "lint-baseline.xml")
10089 }
10090 } else {
10091 if m.Rule != nil {
10092 t.Errorf("expected no strict updatability check rule on %s", name)
10093 }
10094 }
10095 }
10096
10097 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10098 apex := result.ModuleForTests("myapex", "android_common_myapex")
10099 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10100 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10101
10102 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10103 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10104 })
Cole Faust24e25c02024-01-19 14:12:17 -080010105 }
10106}
10107
Cole Faust24e25c02024-01-19 14:12:17 -080010108// checks transtive deps of an apex coming from bootclasspath_fragment
10109func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010110 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010111 bp := `
10112 apex {
10113 name: "myapex",
10114 key: "myapex.key",
10115 bootclasspath_fragments: ["mybootclasspathfragment"],
10116 updatable: true,
10117 min_sdk_version: "29",
10118 }
10119 apex_key {
10120 name: "myapex.key",
10121 }
10122 bootclasspath_fragment {
10123 name: "mybootclasspathfragment",
10124 contents: ["myjavalib"],
10125 apex_available: ["myapex"],
10126 hidden_api: {
10127 split_packages: ["*"],
10128 },
10129 }
10130 java_library {
10131 name: "myjavalib",
10132 srcs: ["MyClass.java"],
10133 apex_available: [ "myapex" ],
10134 sdk_version: "current",
10135 min_sdk_version: "29",
10136 compile_dex: true,
10137 lint: {
10138 baseline_filename: "lint-baseline.xml",
10139 }
10140 }
10141 `
10142 fs := android.MockFS{
10143 "lint-baseline.xml": nil,
10144 }
10145
10146 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010147 apex := result.ModuleForTests("myapex", "android_common_myapex")
10148 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10149 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10150 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10151 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10152 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010153}
Spandan Das66773252022-01-15 00:23:18 +000010154
Jihoon Kang784c0052024-06-25 22:15:39 +000010155func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010156 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010157 bp := `
10158 apex {
10159 name: "myapex",
10160 key: "myapex.key",
10161 bootclasspath_fragments: ["mybootclasspathfragment"],
10162 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010163 java_libs: [
10164 "jacocoagent",
10165 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010166 }
10167 apex_key {
10168 name: "myapex.key",
10169 }
10170 bootclasspath_fragment {
10171 name: "mybootclasspathfragment",
10172 contents: ["foo"],
10173 apex_available: ["myapex"],
10174 hidden_api: {
10175 split_packages: ["*"],
10176 },
10177 }
10178 java_sdk_library {
10179 name: "foo",
10180 srcs: ["MyClass.java"],
10181 apex_available: [ "myapex" ],
10182 sdk_version: "current",
10183 min_sdk_version: "29",
10184 compile_dex: true,
10185 }
10186 `
10187 fs := android.MockFS{
10188 "lint-baseline.xml": nil,
10189 }
10190
10191 result := android.GroupFixturePreparers(
10192 prepareForApexTest,
10193 java.PrepareForTestWithJavaSdkLibraryFiles,
10194 java.PrepareForTestWithJacocoInstrumentation,
10195 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010196 android.FixtureMergeMockFs(fs),
10197 ).RunTestWithBp(t, bp)
10198
10199 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10200 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10201 android.AssertStringDoesContain(t,
10202 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10203 lintReportInputs, "foo.impl")
10204}
10205
Spandan Das42e89502022-05-06 22:12:55 +000010206// updatable apexes should propagate updatable=true to its apps
10207func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010208 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010209 bp := `
10210 apex {
10211 name: "myapex",
10212 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010213 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010214 apps: [
10215 "myapp",
10216 ],
10217 min_sdk_version: "30",
10218 }
10219 apex_key {
10220 name: "myapex.key",
10221 }
10222 android_app {
10223 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010224 apex_available: [
10225 "myapex",
10226 ],
10227 sdk_version: "current",
10228 min_sdk_version: "30",
10229 }
10230 `
Colin Cross99939e92024-10-01 16:02:46 -070010231 _ = android.GroupFixturePreparers(
10232 prepareForApexTest,
10233 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10234 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010235}
10236
Dennis Shend4f5d932023-01-31 20:27:21 +000010237func TestTrimmedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010238 t.Parallel()
Dennis Shend4f5d932023-01-31 20:27:21 +000010239 bp := `
10240 apex {
10241 name: "myapex",
10242 key: "myapex.key",
10243 native_shared_libs: ["libfoo","libbaz"],
10244 min_sdk_version: "29",
10245 trim_against: "mydcla",
10246 }
10247 apex {
10248 name: "mydcla",
10249 key: "myapex.key",
10250 native_shared_libs: ["libfoo","libbar"],
10251 min_sdk_version: "29",
10252 file_contexts: ":myapex-file_contexts",
10253 dynamic_common_lib_apex: true,
10254 }
10255 apex_key {
10256 name: "myapex.key",
10257 }
10258 cc_library {
10259 name: "libfoo",
10260 shared_libs: ["libc"],
10261 apex_available: ["myapex","mydcla"],
10262 min_sdk_version: "29",
10263 }
10264 cc_library {
10265 name: "libbar",
10266 shared_libs: ["libc"],
10267 apex_available: ["myapex","mydcla"],
10268 min_sdk_version: "29",
10269 }
10270 cc_library {
10271 name: "libbaz",
10272 shared_libs: ["libc"],
10273 apex_available: ["myapex","mydcla"],
10274 min_sdk_version: "29",
10275 }
Dennis Shend4f5d932023-01-31 20:27:21 +000010276 `
10277 ctx := testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +090010278 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dennis Shend4f5d932023-01-31 20:27:21 +000010279 apexRule := module.MaybeRule("apexRule")
10280 if apexRule.Rule == nil {
10281 t.Errorf("Expecting regular apex rule but a non regular apex rule found")
10282 }
10283
10284 ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
Jooyung Hana0503a52023-08-23 13:12:50 +090010285 trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("TrimmedApexRule")
Dennis Shend4f5d932023-01-31 20:27:21 +000010286 libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
10287 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
10288 android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
10289 android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
10290}
Jingwen Chendea7a642023-03-28 11:30:50 +000010291
10292func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010293 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010294 ctx := testApex(t, `
10295 apex {
10296 name: "myapex",
10297 key: "myapex.key",
10298 updatable: false,
10299 }
10300
10301 apex_key {
10302 name: "myapex.key",
10303 public_key: "testkey.avbpubkey",
10304 private_key: "testkey.pem",
10305 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010306 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010307 generateFsRule := mod.Rule("generateFsConfig")
10308 cmd := generateFsRule.RuleParams.Command
10309
10310 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10311}
10312
10313func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010314 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010315 ctx := testApex(t, `
10316 apex {
10317 name: "myapex",
10318 key: "myapex.key",
10319 canned_fs_config: "my_config",
10320 updatable: false,
10321 }
10322
10323 apex_key {
10324 name: "myapex.key",
10325 public_key: "testkey.avbpubkey",
10326 private_key: "testkey.pem",
10327 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010328 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010329 generateFsRule := mod.Rule("generateFsConfig")
10330 cmd := generateFsRule.RuleParams.Command
10331
10332 // Ensure that canned_fs_config has "cat my_config" at the end
10333 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10334}
Spandan Das20fce2d2023-04-12 17:21:39 +000010335
10336func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010337 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010338 testCases := []struct {
10339 desc string
10340 hasStubs bool
10341 apexAvailable string
10342 expectedError string
10343 }{
10344 {
10345 desc: "non-stub library can have multiple apex_available",
10346 hasStubs: false,
10347 apexAvailable: `["myapex", "otherapex"]`,
10348 },
10349 {
10350 desc: "stub library should not be available to anyapex",
10351 hasStubs: true,
10352 apexAvailable: `["//apex_available:anyapex"]`,
10353 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10354 },
10355 {
10356 desc: "stub library should not be available to multiple apexes",
10357 hasStubs: true,
10358 apexAvailable: `["myapex", "otherapex"]`,
10359 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10360 },
10361 {
10362 desc: "stub library can be available to a core apex and a test apex",
10363 hasStubs: true,
10364 apexAvailable: `["myapex", "test_myapex"]`,
10365 },
10366 }
10367 bpTemplate := `
10368 cc_library {
10369 name: "libfoo",
10370 %v
10371 apex_available: %v,
10372 }
10373 apex {
10374 name: "myapex",
10375 key: "apex.key",
10376 updatable: false,
10377 native_shared_libs: ["libfoo"],
10378 }
10379 apex {
10380 name: "otherapex",
10381 key: "apex.key",
10382 updatable: false,
10383 }
10384 apex_test {
10385 name: "test_myapex",
10386 key: "apex.key",
10387 updatable: false,
10388 native_shared_libs: ["libfoo"],
10389 }
10390 apex_key {
10391 name: "apex.key",
10392 }
10393 `
10394 for _, tc := range testCases {
10395 stubs := ""
10396 if tc.hasStubs {
10397 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10398 }
10399 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10400 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10401 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10402 })
10403 if tc.expectedError == "" {
10404 testApex(t, bp, mockFsFixturePreparer)
10405 } else {
10406 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10407 }
10408 }
10409}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010410
10411func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010412 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010413 context := android.GroupFixturePreparers(
10414 android.PrepareForIntegrationTestWithAndroid,
10415 cc.PrepareForIntegrationTestWithCc,
10416 PrepareForTestWithApexBuildComponents,
10417 prepareForTestWithMyapex,
10418 filesystem.PrepareForTestWithFilesystemBuildComponents,
10419 )
10420 result := context.RunTestWithBp(t, `
10421 android_system_image {
10422 name: "myfilesystem",
10423 deps: [
10424 "libfoo",
10425 ],
10426 linker_config_src: "linker.config.json",
10427 }
10428
10429 cc_library {
10430 name: "libfoo",
10431 shared_libs: [
10432 "libbar",
10433 ],
10434 stl: "none",
10435 }
10436
10437 cc_library {
10438 name: "libbar",
10439 stl: "none",
10440 apex_available: ["myapex"],
10441 }
10442
10443 apex {
10444 name: "myapex",
10445 native_shared_libs: ["libbar"],
10446 key: "myapex.key",
10447 updatable: false,
10448 }
10449
10450 apex_key {
10451 name: "myapex.key",
10452 public_key: "testkey.avbpubkey",
10453 private_key: "testkey.pem",
10454 }
10455 `)
10456
Cole Faust3b806d32024-03-11 15:15:03 -070010457 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010458 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10459 inputs.Strings(),
10460 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10461}
Yu Liueae7b362023-11-16 17:05:47 -080010462
10463var apex_default_bp = `
10464 apex_key {
10465 name: "myapex.key",
10466 public_key: "testkey.avbpubkey",
10467 private_key: "testkey.pem",
10468 }
10469
10470 filegroup {
10471 name: "myapex.manifest",
10472 srcs: ["apex_manifest.json"],
10473 }
10474
10475 filegroup {
10476 name: "myapex.androidmanifest",
10477 srcs: ["AndroidManifest.xml"],
10478 }
10479`
10480
10481func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010482 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010483 ctx := testApex(t, apex_default_bp+`
10484 apex {
10485 name: "myapex",
10486 manifest: ":myapex.manifest",
10487 androidManifest: ":myapex.androidmanifest",
10488 key: "myapex.key",
10489 java_libs: [
10490 "my_java_library_foo",
10491 "my_java_library_bar",
10492 ],
10493 updatable: false,
10494 }
10495
10496 java_library {
10497 name: "my_java_library_foo",
10498 srcs: ["foo/bar/MyClass.java"],
10499 sdk_version: "none",
10500 system_modules: "none",
10501 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010502 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010503 "myapex",
10504 ],
10505 }
10506
10507 java_library {
10508 name: "my_java_library_bar",
10509 srcs: ["foo/bar/MyClass.java"],
10510 sdk_version: "none",
10511 system_modules: "none",
10512 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010513 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010514 "myapex",
10515 ],
10516 }
10517
10518 aconfig_declarations {
10519 name: "my_aconfig_declarations_foo",
10520 package: "com.example.package",
10521 container: "myapex",
10522 srcs: ["foo.aconfig"],
10523 }
10524
10525 java_aconfig_library {
10526 name: "my_java_aconfig_library_foo",
10527 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010528 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010529 "myapex",
10530 ],
10531 }
10532
10533 aconfig_declarations {
10534 name: "my_aconfig_declarations_bar",
10535 package: "com.example.package",
10536 container: "myapex",
10537 srcs: ["bar.aconfig"],
10538 }
10539
10540 java_aconfig_library {
10541 name: "my_java_aconfig_library_bar",
10542 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010543 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010544 "myapex",
10545 ],
10546 }
10547 `)
10548
10549 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10550 s := mod.Rule("apexRule").Args["copy_commands"]
10551 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010552 if len(copyCmds) != 14 {
10553 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010554 }
10555
Jooyung Hana3fddf42024-09-03 13:22:21 +090010556 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10557 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10558 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10559 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010560 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010561
Yu Liubba555e2024-02-17 00:36:42 +000010562 inputs := []string{
10563 "my_aconfig_declarations_foo/intermediate.pb",
10564 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010565 }
Yu Liubba555e2024-02-17 00:36:42 +000010566 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10567 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10568 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10569 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010570 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010571}
10572
10573func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010574 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010575 ctx := testApex(t, apex_default_bp+`
10576 apex {
10577 name: "myapex",
10578 manifest: ":myapex.manifest",
10579 androidManifest: ":myapex.androidmanifest",
10580 key: "myapex.key",
10581 java_libs: [
10582 "my_java_library_foo",
10583 ],
10584 native_shared_libs: [
10585 "my_cc_library_bar",
10586 ],
10587 binaries: [
10588 "my_cc_binary_baz",
10589 ],
10590 updatable: false,
10591 }
10592
10593 java_library {
10594 name: "my_java_library_foo",
10595 srcs: ["foo/bar/MyClass.java"],
10596 sdk_version: "none",
10597 system_modules: "none",
10598 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010599 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010600 "myapex",
10601 ],
10602 }
10603
10604 cc_library {
10605 name: "my_cc_library_bar",
10606 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010607 static_libs: [
10608 "my_cc_aconfig_library_bar",
10609 "my_cc_aconfig_library_baz",
10610 ],
Yu Liueae7b362023-11-16 17:05:47 -080010611 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010612 "myapex",
10613 ],
10614 }
10615
10616 cc_binary {
10617 name: "my_cc_binary_baz",
10618 srcs: ["foo/bar/MyClass.cc"],
10619 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010620 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010621 "myapex",
10622 ],
10623 }
10624
10625 aconfig_declarations {
10626 name: "my_aconfig_declarations_foo",
10627 package: "com.example.package",
10628 container: "myapex",
10629 srcs: ["foo.aconfig"],
10630 }
10631
10632 java_aconfig_library {
10633 name: "my_java_aconfig_library_foo",
10634 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010635 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010636 "myapex",
10637 ],
10638 }
10639
10640 aconfig_declarations {
10641 name: "my_aconfig_declarations_bar",
10642 package: "com.example.package",
10643 container: "myapex",
10644 srcs: ["bar.aconfig"],
10645 }
10646
10647 cc_aconfig_library {
10648 name: "my_cc_aconfig_library_bar",
10649 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010650 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010651 "myapex",
10652 ],
10653 }
10654
10655 aconfig_declarations {
10656 name: "my_aconfig_declarations_baz",
10657 package: "com.example.package",
10658 container: "myapex",
10659 srcs: ["baz.aconfig"],
10660 }
10661
10662 cc_aconfig_library {
10663 name: "my_cc_aconfig_library_baz",
10664 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010665 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010666 "myapex",
10667 ],
10668 }
10669
10670 cc_library {
10671 name: "server_configurable_flags",
10672 srcs: ["server_configurable_flags.cc"],
10673 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010674 cc_library {
10675 name: "libbase",
10676 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010677 apex_available: [
10678 "myapex",
10679 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010680 }
10681 cc_library {
10682 name: "libaconfig_storage_read_api_cc",
10683 srcs: ["libaconfig_storage_read_api_cc.cc"],
10684 }
Yu Liueae7b362023-11-16 17:05:47 -080010685 `)
10686
10687 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10688 s := mod.Rule("apexRule").Args["copy_commands"]
10689 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010690 if len(copyCmds) != 18 {
10691 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010692 }
10693
Jooyung Hana3fddf42024-09-03 13:22:21 +090010694 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10695 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10696 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10697 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010698 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010699
Yu Liubba555e2024-02-17 00:36:42 +000010700 inputs := []string{
10701 "my_aconfig_declarations_foo/intermediate.pb",
10702 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10703 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010704 }
Yu Liubba555e2024-02-17 00:36:42 +000010705 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10706 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10707 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10708 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010709 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010710}
10711
Yu Liucec0e412023-11-30 16:45:50 -080010712func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010713 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010714 ctx := testApex(t, apex_default_bp+`
10715 apex {
10716 name: "myapex",
10717 manifest: ":myapex.manifest",
10718 androidManifest: ":myapex.androidmanifest",
10719 key: "myapex.key",
10720 native_shared_libs: [
10721 "libmy_rust_library",
10722 ],
10723 binaries: [
10724 "my_rust_binary",
10725 ],
10726 rust_dyn_libs: [
10727 "libmy_rust_dylib",
10728 ],
10729 updatable: false,
10730 }
10731
10732 rust_library {
10733 name: "libflags_rust", // test mock
10734 crate_name: "flags_rust",
10735 srcs: ["lib.rs"],
10736 apex_available: [
10737 "myapex",
10738 ],
10739 }
10740
10741 rust_library {
10742 name: "liblazy_static", // test mock
10743 crate_name: "lazy_static",
10744 srcs: ["src/lib.rs"],
10745 apex_available: [
10746 "myapex",
10747 ],
10748 }
10749
Ted Bauer02d475c2024-03-27 20:56:26 +000010750 rust_library {
10751 name: "libaconfig_storage_read_api", // test mock
10752 crate_name: "aconfig_storage_read_api",
10753 srcs: ["src/lib.rs"],
10754 apex_available: [
10755 "myapex",
10756 ],
10757 }
10758
Ted Bauer6ef40db2024-03-29 14:04:10 +000010759 rust_library {
10760 name: "liblogger", // test mock
10761 crate_name: "logger",
10762 srcs: ["src/lib.rs"],
10763 apex_available: [
10764 "myapex",
10765 ],
10766 }
10767
10768 rust_library {
10769 name: "liblog_rust", // test mock
10770 crate_name: "log_rust",
10771 srcs: ["src/lib.rs"],
10772 apex_available: [
10773 "myapex",
10774 ],
10775 }
10776
Yu Liucec0e412023-11-30 16:45:50 -080010777 rust_ffi_shared {
10778 name: "libmy_rust_library",
10779 srcs: ["src/lib.rs"],
10780 rustlibs: ["libmy_rust_aconfig_library_foo"],
10781 crate_name: "my_rust_library",
10782 apex_available: [
10783 "myapex",
10784 ],
10785 }
10786
10787 rust_library_dylib {
10788 name: "libmy_rust_dylib",
10789 srcs: ["foo/bar/MyClass.rs"],
10790 rustlibs: ["libmy_rust_aconfig_library_bar"],
10791 crate_name: "my_rust_dylib",
10792 apex_available: [
10793 "myapex",
10794 ],
10795 }
10796
10797 rust_binary {
10798 name: "my_rust_binary",
10799 srcs: ["foo/bar/MyClass.rs"],
10800 rustlibs: [
10801 "libmy_rust_aconfig_library_baz",
10802 "libmy_rust_dylib",
10803 ],
10804 apex_available: [
10805 "myapex",
10806 ],
10807 }
10808
10809 aconfig_declarations {
10810 name: "my_aconfig_declarations_foo",
10811 package: "com.example.package",
10812 container: "myapex",
10813 srcs: ["foo.aconfig"],
10814 }
10815
10816 aconfig_declarations {
10817 name: "my_aconfig_declarations_bar",
10818 package: "com.example.package",
10819 container: "myapex",
10820 srcs: ["bar.aconfig"],
10821 }
10822
10823 aconfig_declarations {
10824 name: "my_aconfig_declarations_baz",
10825 package: "com.example.package",
10826 container: "myapex",
10827 srcs: ["baz.aconfig"],
10828 }
10829
10830 rust_aconfig_library {
10831 name: "libmy_rust_aconfig_library_foo",
10832 aconfig_declarations: "my_aconfig_declarations_foo",
10833 crate_name: "my_rust_aconfig_library_foo",
10834 apex_available: [
10835 "myapex",
10836 ],
10837 }
10838
10839 rust_aconfig_library {
10840 name: "libmy_rust_aconfig_library_bar",
10841 aconfig_declarations: "my_aconfig_declarations_bar",
10842 crate_name: "my_rust_aconfig_library_bar",
10843 apex_available: [
10844 "myapex",
10845 ],
10846 }
10847
10848 rust_aconfig_library {
10849 name: "libmy_rust_aconfig_library_baz",
10850 aconfig_declarations: "my_aconfig_declarations_baz",
10851 crate_name: "my_rust_aconfig_library_baz",
10852 apex_available: [
10853 "myapex",
10854 ],
10855 }
10856 `)
10857
10858 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10859 s := mod.Rule("apexRule").Args["copy_commands"]
10860 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010861 if len(copyCmds) != 38 {
10862 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010863 }
10864
Jooyung Hana3fddf42024-09-03 13:22:21 +090010865 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10866 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10867 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10868 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010869 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010870
Yu Liubba555e2024-02-17 00:36:42 +000010871 inputs := []string{
10872 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010873 "my_aconfig_declarations_bar/intermediate.pb",
10874 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010875 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10876 }
10877 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10878 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10879 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10880 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010881 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010882}
10883
10884func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10885 aconfigRule := mod.Description(desc)
10886 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010887 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010888 if len(aconfigArgs) != len(inputs) {
10889 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010890 }
Yu Liucec0e412023-11-30 16:45:50 -080010891
Yu Liubba555e2024-02-17 00:36:42 +000010892 ensureEquals(t, container, aconfigRule.Args["container"])
10893 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10894
10895 buildParams := aconfigRule.BuildParams
10896 for _, input := range inputs {
10897 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10898 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010899 }
Yu Liubba555e2024-02-17 00:36:42 +000010900
10901 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010902}
10903
Yu Liueae7b362023-11-16 17:05:47 -080010904func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010905 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010906 ctx := testApex(t, apex_default_bp+`
10907 apex {
10908 name: "myapex",
10909 manifest: ":myapex.manifest",
10910 androidManifest: ":myapex.androidmanifest",
10911 key: "myapex.key",
10912 java_libs: [
10913 "my_java_library_foo",
10914 "other_java_library_bar",
10915 ],
10916 updatable: false,
10917 }
10918
10919 java_library {
10920 name: "my_java_library_foo",
10921 srcs: ["foo/bar/MyClass.java"],
10922 sdk_version: "none",
10923 system_modules: "none",
10924 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010925 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010926 "myapex",
10927 ],
10928 }
10929
10930 java_library {
10931 name: "other_java_library_bar",
10932 srcs: ["foo/bar/MyClass.java"],
10933 sdk_version: "none",
10934 system_modules: "none",
10935 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010936 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010937 "myapex",
10938 ],
10939 }
10940
10941 aconfig_declarations {
10942 name: "my_aconfig_declarations_foo",
10943 package: "com.example.package",
10944 container: "myapex",
10945 srcs: ["foo.aconfig"],
10946 }
10947
10948 java_aconfig_library {
10949 name: "my_java_aconfig_library_foo",
10950 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010951 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010952 "myapex",
10953 ],
10954 }
10955
10956 aconfig_declarations {
10957 name: "other_aconfig_declarations_bar",
10958 package: "com.example.package",
10959 container: "otherapex",
10960 srcs: ["bar.aconfig"],
10961 }
10962
10963 java_aconfig_library {
10964 name: "other_java_aconfig_library_bar",
10965 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010966 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010967 "myapex",
10968 ],
10969 }
10970 `)
10971
10972 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10973 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10974 s := " " + combineAconfigRule.Args["cache_files"]
10975 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10976 if len(aconfigArgs) != 1 {
10977 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10978 }
10979 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10980
10981 buildParams := combineAconfigRule.BuildParams
10982 if len(buildParams.Inputs) != 1 {
10983 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10984 }
10985 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10986 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10987}
10988
10989func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010990 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010991 ctx := testApex(t, apex_default_bp+`
10992 apex {
10993 name: "myapex",
10994 manifest: ":myapex.manifest",
10995 androidManifest: ":myapex.androidmanifest",
10996 key: "myapex.key",
10997 java_libs: [
10998 "my_java_library_foo",
10999 "my_java_library_bar",
11000 ],
11001 updatable: false,
11002 }
11003
11004 java_library {
11005 name: "my_java_library_foo",
11006 srcs: ["foo/bar/MyClass.java"],
11007 sdk_version: "none",
11008 system_modules: "none",
11009 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011010 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011011 "myapex",
11012 ],
11013 }
11014
11015 java_library {
11016 name: "my_java_library_bar",
11017 srcs: ["foo/bar/MyClass.java"],
11018 sdk_version: "none",
11019 system_modules: "none",
11020 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011021 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011022 "myapex",
11023 ],
11024 }
11025
11026 aconfig_declarations {
11027 name: "my_aconfig_declarations_foo",
11028 package: "com.example.package",
11029 container: "myapex",
11030 srcs: ["foo.aconfig"],
11031 }
11032
11033 java_aconfig_library {
11034 name: "my_java_aconfig_library_foo",
11035 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011036 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011037 "myapex",
11038 ],
11039 }
11040
11041 java_aconfig_library {
11042 name: "my_java_aconfig_library_bar",
11043 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011044 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011045 "myapex",
11046 ],
11047 }
11048 `)
11049
11050 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11051 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11052 s := " " + combineAconfigRule.Args["cache_files"]
11053 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11054 if len(aconfigArgs) != 1 {
11055 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11056 }
11057 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11058
11059 buildParams := combineAconfigRule.BuildParams
11060 if len(buildParams.Inputs) != 1 {
11061 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11062 }
11063 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11064 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11065}
Spandan Das5be63332023-12-13 00:06:32 +000011066
11067// Test that the boot jars come from the _selected_ apex prebuilt
11068// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11069func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011070 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011071 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11072 t.Helper()
11073 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11074 foundLibfooJar := false
11075 base := stem + ".jar"
11076 for _, output := range s.AllOutputs() {
11077 if filepath.Base(output) == base {
11078 foundLibfooJar = true
11079 buildRule := s.Output(output)
11080 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11081 }
11082 }
11083 if !foundLibfooJar {
11084 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11085 }
11086 }
11087
Spandan Das64c9e0c2023-12-20 20:13:34 +000011088 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11089 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11090 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11091 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11092 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11093 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)
11094 }
11095
11096 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11097 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11098 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11099 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11100 }
11101
Spandan Das5be63332023-12-13 00:06:32 +000011102 bp := `
11103 // Source APEX.
11104
11105 java_library {
11106 name: "framework-foo",
11107 srcs: ["foo.java"],
11108 installable: true,
11109 apex_available: [
11110 "com.android.foo",
11111 ],
11112 }
11113
11114 bootclasspath_fragment {
11115 name: "foo-bootclasspath-fragment",
11116 contents: ["framework-foo"],
11117 apex_available: [
11118 "com.android.foo",
11119 ],
11120 hidden_api: {
11121 split_packages: ["*"],
11122 },
11123 }
11124
11125 apex_key {
11126 name: "com.android.foo.key",
11127 public_key: "com.android.foo.avbpubkey",
11128 private_key: "com.android.foo.pem",
11129 }
11130
11131 apex {
11132 name: "com.android.foo",
11133 key: "com.android.foo.key",
11134 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11135 updatable: false,
11136 }
11137
11138 // Prebuilt APEX.
11139
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011140 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011141 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011142 public: {
11143 jars: ["foo.jar"],
11144 },
Spandan Das5be63332023-12-13 00:06:32 +000011145 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011146 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011147 }
11148
11149 prebuilt_bootclasspath_fragment {
11150 name: "foo-bootclasspath-fragment",
11151 contents: ["framework-foo"],
11152 hidden_api: {
11153 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11154 metadata: "my-bootclasspath-fragment/metadata.csv",
11155 index: "my-bootclasspath-fragment/index.csv",
11156 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11157 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11158 },
11159 apex_available: [
11160 "com.android.foo",
11161 ],
11162 }
11163
11164 prebuilt_apex {
11165 name: "com.android.foo",
11166 apex_name: "com.android.foo",
11167 src: "com.android.foo-arm.apex",
11168 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11169 }
11170
11171 // Another Prebuilt ART APEX
11172 prebuilt_apex {
11173 name: "com.android.foo.v2",
11174 apex_name: "com.android.foo", // Used to determine the API domain
11175 src: "com.android.foo-arm.apex",
11176 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11177 }
11178
11179 // APEX contribution modules
11180
11181 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011182 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011183 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011184 contents: ["com.android.foo"],
11185 }
11186
11187 apex_contributions {
11188 name: "foo.prebuilt.contributions",
11189 api_domain: "com.android.foo",
11190 contents: ["prebuilt_com.android.foo"],
11191 }
11192
11193 apex_contributions {
11194 name: "foo.prebuilt.v2.contributions",
11195 api_domain: "com.android.foo",
11196 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011197 }
11198 `
11199
11200 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011201 desc string
11202 selectedApexContributions string
11203 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011204 }{
11205 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011206 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11207 selectedApexContributions: "foo.source.contributions",
11208 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011209 },
11210 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011211 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11212 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011213 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 +000011214 },
11215 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011216 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11217 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011218 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 +000011219 },
11220 }
11221
11222 fragment := java.ApexVariantReference{
11223 Apex: proptools.StringPtr("com.android.foo"),
11224 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11225 }
11226
11227 for _, tc := range testCases {
11228 preparer := android.GroupFixturePreparers(
11229 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11230 android.FixtureMergeMockFs(map[string][]byte{
11231 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11232 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011233 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11234 // file creation.
11235 java.FixtureConfigureBootJars("platform:foo"),
11236 android.FixtureModifyMockFS(func(fs android.MockFS) {
11237 fs["platform/Android.bp"] = []byte(`
11238 java_library {
11239 name: "foo",
11240 srcs: ["Test.java"],
11241 compile_dex: true,
11242 }
11243 `)
11244 fs["platform/Test.java"] = nil
11245 }),
11246
Colin Crossa66b4632024-08-08 15:50:47 -070011247 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011248 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011249 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011250 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011251 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11252 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011253 }
11254}
Spandan Das3576e762024-01-03 18:57:03 +000011255
11256// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11257// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11258func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011259 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011260 // for a mainline module family, check that only the flagged soong module is visible to make
11261 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11262 variation := func(moduleName string) string {
11263 ret := "android_common_com.android.foo"
11264 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011265 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011266 }
11267 return ret
11268 }
11269
11270 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11271 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11272
11273 for _, hiddenModuleName := range hiddenModuleNames {
11274 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11275 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11276
11277 }
11278 }
11279
11280 bp := `
11281 apex_key {
11282 name: "com.android.foo.key",
11283 public_key: "com.android.foo.avbpubkey",
11284 private_key: "com.android.foo.pem",
11285 }
11286
11287 // AOSP source apex
11288 apex {
11289 name: "com.android.foo",
11290 key: "com.android.foo.key",
11291 updatable: false,
11292 }
11293
11294 // Google source apex
11295 override_apex {
11296 name: "com.google.android.foo",
11297 base: "com.android.foo",
11298 key: "com.android.foo.key",
11299 }
11300
11301 // Prebuilt Google APEX.
11302
11303 prebuilt_apex {
11304 name: "com.google.android.foo",
11305 apex_name: "com.android.foo",
11306 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 // Another Prebuilt Google APEX
11311 prebuilt_apex {
11312 name: "com.google.android.foo.v2",
11313 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011314 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011315 src: "com.android.foo-arm.apex",
11316 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11317 }
11318
11319 // APEX contribution modules
11320
11321 apex_contributions {
11322 name: "foo.source.contributions",
11323 api_domain: "com.android.foo",
11324 contents: ["com.google.android.foo"],
11325 }
11326
11327 apex_contributions {
11328 name: "foo.prebuilt.contributions",
11329 api_domain: "com.android.foo",
11330 contents: ["prebuilt_com.google.android.foo"],
11331 }
11332
11333 apex_contributions {
11334 name: "foo.prebuilt.v2.contributions",
11335 api_domain: "com.android.foo",
11336 contents: ["prebuilt_com.google.android.foo.v2"],
11337 }
11338
11339 // This is an incompatible module because it selects multiple versions of the same mainline module
11340 apex_contributions {
11341 name: "foo.prebuilt.duplicate.contributions",
11342 api_domain: "com.android.foo",
11343 contents: [
11344 "prebuilt_com.google.android.foo",
11345 "prebuilt_com.google.android.foo.v2",
11346 ],
11347 }
11348 `
11349
11350 testCases := []struct {
11351 desc string
11352 selectedApexContributions string
11353 expectedVisibleModuleName string
11354 expectedHiddenModuleNames []string
11355 expectedError string
11356 }{
11357 {
11358 desc: "Source apex is selected, prebuilts should be hidden from make",
11359 selectedApexContributions: "foo.source.contributions",
11360 expectedVisibleModuleName: "com.google.android.foo",
11361 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11362 },
11363 {
11364 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11365 selectedApexContributions: "foo.prebuilt.contributions",
11366 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11367 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11368 },
11369 {
11370 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11371 selectedApexContributions: "foo.prebuilt.v2.contributions",
11372 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11373 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11374 },
11375 {
11376 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11377 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11378 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11379 },
11380 }
11381
11382 for _, tc := range testCases {
11383 preparer := android.GroupFixturePreparers(
11384 android.FixtureMergeMockFs(map[string][]byte{
11385 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11386 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011387 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011388 )
11389 if tc.expectedError != "" {
11390 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11391 testApex(t, bp, preparer)
11392 return
11393 }
11394 ctx := testApex(t, bp, preparer)
11395
Spandan Das3576e762024-01-03 18:57:03 +000011396 // Check that
11397 // 1. The contents of the selected apex_contributions are visible to make
11398 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11399 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11400 }
11401}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011402
Spandan Das85bd4622024-08-01 00:51:20 +000011403// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11404func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011405 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011406 // for a mainline module family, check that only the flagged soong module is visible to make
11407 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11408 variation := func(moduleName string) string {
11409 ret := "android_common_com.android.adservices"
11410 if moduleName == "com.google.android.foo" {
11411 ret = "android_common_com.google.android.foo_com.google.android.foo"
11412 }
11413 return ret
11414 }
11415
11416 for _, visibleModuleName := range visibleModuleNames {
11417 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11418 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11419 }
11420
11421 for _, hiddenModuleName := range hiddenModuleNames {
11422 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11423 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11424
11425 }
11426 }
11427
11428 bp := `
11429 apex_key {
11430 name: "com.android.adservices.key",
11431 public_key: "com.android.adservices.avbpubkey",
11432 private_key: "com.android.adservices.pem",
11433 }
11434
11435 // AOSP source apex
11436 apex {
11437 name: "com.android.adservices",
11438 key: "com.android.adservices.key",
11439 updatable: false,
11440 }
11441
11442 // Prebuilt Google APEX.
11443
11444 prebuilt_apex {
11445 name: "com.google.android.adservices",
11446 apex_name: "com.android.adservices",
11447 src: "com.android.foo-arm.apex",
11448 }
11449
11450 // Another Prebuilt Google APEX
11451 prebuilt_apex {
11452 name: "com.google.android.adservices.v2",
11453 apex_name: "com.android.adservices",
11454 src: "com.android.foo-arm.apex",
11455 }
11456
11457 // APEX contribution modules
11458
11459
11460 apex_contributions {
11461 name: "adservices.prebuilt.contributions",
11462 api_domain: "com.android.adservices",
11463 contents: ["prebuilt_com.google.android.adservices"],
11464 }
11465
11466 apex_contributions {
11467 name: "adservices.prebuilt.v2.contributions",
11468 api_domain: "com.android.adservices",
11469 contents: ["prebuilt_com.google.android.adservices.v2"],
11470 }
11471 `
11472
11473 testCases := []struct {
11474 desc string
11475 selectedApexContributions string
11476 expectedVisibleModuleNames []string
11477 expectedHiddenModuleNames []string
11478 }{
11479 {
11480 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11481 selectedApexContributions: "",
11482 expectedVisibleModuleNames: []string{"com.android.adservices"},
11483 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11484 },
11485 {
11486 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11487 selectedApexContributions: "adservices.prebuilt.contributions",
11488 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11489 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11490 },
11491 {
11492 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11493 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11494 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11495 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11496 },
11497 }
11498
11499 for _, tc := range testCases {
11500 preparer := android.GroupFixturePreparers(
11501 android.FixtureMergeMockFs(map[string][]byte{
11502 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11503 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011504 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011505 )
11506 ctx := testApex(t, bp, preparer)
11507
11508 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11509 }
11510}
11511
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011512func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011513 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011514 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11515 for _, moduleName := range moduleNames {
11516 ret += fmt.Sprintf(`
11517 aconfig_declarations {
11518 name: "%[1]s",
11519 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011520 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011521 srcs: [
11522 "%[1]s.aconfig",
11523 ],
11524 }
11525 java_aconfig_library {
11526 name: "%[1]s-lib",
11527 aconfig_declarations: "%[1]s",
11528 }
11529 `, moduleName)
11530 }
11531 return ret
11532 }
11533
11534 result := android.GroupFixturePreparers(
11535 prepareForApexTest,
11536 java.PrepareForTestWithJavaSdkLibraryFiles,
11537 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011538 ).RunTestWithBp(t, `
11539 java_library {
11540 name: "baz-java-lib",
11541 static_libs: [
11542 "baz-lib",
11543 ],
11544 }
11545 filegroup {
11546 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011547 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011548 ":qux-lib{.generated_srcjars}",
11549 ],
11550 }
11551 filegroup {
11552 name: "qux-another-filegroup",
11553 srcs: [
11554 ":qux-filegroup",
11555 ],
11556 }
11557 java_library {
11558 name: "quux-java-lib",
11559 srcs: [
11560 "a.java",
11561 ],
11562 libs: [
11563 "quux-lib",
11564 ],
11565 }
11566 java_sdk_library {
11567 name: "foo",
11568 srcs: [
11569 ":qux-another-filegroup",
11570 ],
11571 api_packages: ["foo"],
11572 system: {
11573 enabled: true,
11574 },
11575 module_lib: {
11576 enabled: true,
11577 },
11578 test: {
11579 enabled: true,
11580 },
11581 static_libs: [
11582 "bar-lib",
11583 ],
11584 libs: [
11585 "baz-java-lib",
11586 "quux-java-lib",
11587 ],
11588 aconfig_declarations: [
11589 "bar",
11590 ],
11591 }
11592 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11593
11594 m := result.ModuleForTests("foo.stubs.source", "android_common")
11595 outDir := "out/soong/.intermediates"
11596
11597 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11598 // textproto files
11599 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11600
11601 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11602 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11603 // to aconfig.
11604 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11605 "passed as an input",
11606 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11607
11608 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11609 // to metalava as classpath. Thus the cache file provided by the associated
11610 // aconfig_declarations module "baz" should be passed to aconfig.
11611 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11612 "java_aconfig_library passed as an input",
11613 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11614
11615 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11616 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11617 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11618 "input",
11619 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11620
11621 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11622 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11623 // aconfig_declarations module "quux" should not be passed to aconfig.
11624 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11625 "depend on java_aconfig_library not passed as an input",
11626 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11627}
Cole Faust7c991b42024-05-15 11:17:55 -070011628
11629func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011630 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011631 ctx := testApex(t, `
11632 apex {
11633 name: "myapex",
11634 key: "myapex.key",
11635 prebuilts: ["myetc", "myetc2"],
11636 min_sdk_version: "29",
11637 }
11638 apex_key {
11639 name: "myapex.key",
11640 public_key: "testkey.avbpubkey",
11641 private_key: "testkey.pem",
11642 }
11643
11644 prebuilt_etc {
11645 name: "myetc",
11646 src: "myprebuilt",
11647 filename: "myfilename",
11648 }
11649 prebuilt_etc {
11650 name: "myetc2",
11651 sub_dir: "mysubdir",
11652 src: "myprebuilt",
11653 filename: "myfilename",
11654 }
11655 `, withFiles(android.MockFS{
11656 "packages/modules/common/build/allowed_deps.txt": nil,
11657 }))
11658
11659 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11660 data := android.AndroidMkDataForTest(t, ctx, ab)
11661 var builder strings.Builder
11662 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11663 androidMk := builder.String()
11664
11665 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11666 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11667}
Spandan Das50801e22024-05-13 18:29:45 +000011668
11669func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011670 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011671 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11672 args := module.Rule("apexRule").Args
11673 optFlags := args["opt_flags"]
11674 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11675 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11676 }
11677 }
11678
11679 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11680 t.Helper()
11681 found := false
11682 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11683 if dep == wantDep {
11684 found = true
11685 }
11686 })
11687 if !found {
11688 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11689 }
11690 }
11691
11692 ctx := testApex(t, `
11693 apex {
11694 name: "com.android.apex30",
11695 min_sdk_version: "30",
11696 key: "apex30.key",
11697 java_libs: ["javalib"],
11698 }
11699
11700 java_library {
11701 name: "javalib",
11702 srcs: ["A.java"],
11703 apex_available: ["com.android.apex30"],
11704 min_sdk_version: "30",
11705 sdk_version: "current",
11706 }
11707
11708 override_apex {
11709 name: "com.mycompany.android.apex30",
11710 base: "com.android.apex30",
11711 }
11712
11713 override_apex {
11714 name: "com.mycompany.android.apex31",
11715 base: "com.android.apex30",
11716 min_sdk_version: "31",
11717 }
11718
11719 apex_key {
11720 name: "apex30.key",
11721 public_key: "testkey.avbpubkey",
11722 private_key: "testkey.pem",
11723 }
11724
11725 `, android.FixtureMergeMockFs(android.MockFS{
11726 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11727 }),
11728 )
11729
11730 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11731 checkMinSdkVersion(t, baseModule, "30")
11732
11733 // Override module, but uses same min_sdk_version
11734 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11735 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11736 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11737 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11738
11739 // Override module, uses different min_sdk_version
11740 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11741 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11742 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11743 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11744}
Spandan Das0b28fa02024-05-28 23:40:17 +000011745
11746func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011747 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011748 context := android.GroupFixturePreparers(
11749 android.PrepareForIntegrationTestWithAndroid,
11750 PrepareForTestWithApexBuildComponents,
11751 android.FixtureMergeMockFs(android.MockFS{
11752 "system/sepolicy/apex/foo-file_contexts": nil,
11753 }),
11754 )
11755 res := context.RunTestWithBp(t, `
11756 apex {
11757 name: "foo",
11758 key: "myapex.key",
11759 apex_available_name: "com.android.foo",
11760 variant_version: "0",
11761 updatable: false,
11762 }
11763 apex_key {
11764 name: "myapex.key",
11765 public_key: "testkey.avbpubkey",
11766 private_key: "testkey.pem",
11767 }
11768 prebuilt_apex {
11769 name: "foo",
11770 src: "foo.apex",
11771 prefer: true,
11772 }
11773 override_apex {
11774 name: "myoverrideapex",
11775 base: "foo",
11776 }
11777 `)
11778
11779 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11780}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011781
11782func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011783 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011784 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`, `
11785 apex {
11786 name: "myapex",
11787 key: "myapex.key",
11788 updatable: true,
11789 min_sdk_version: "current",
11790 }
11791
11792 apex_key {
11793 name: "myapex.key",
11794 public_key: "testkey.avbpubkey",
11795 private_key: "testkey.pem",
11796 }
11797 `)
11798}
Spandan Das2f68f192024-07-22 19:25:50 +000011799
11800func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011801 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011802 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11803 result := android.GroupFixturePreparers(
11804 prepareForApexTest,
11805 android.PrepareForTestWithAndroidMk,
11806 android.PrepareForTestWithMakevars,
11807 android.FixtureMergeMockFs(fs),
11808 ).RunTest(t)
11809
11810 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011811 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011812
11813 installRules := result.InstallMakeRulesForTesting(t)
11814
11815 var installedlibRule *android.InstallMakeRule
11816 for i, rule := range installRules {
11817 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11818 if installedlibRule != nil {
11819 t.Errorf("Duplicate install rules for %s", rule.Target)
11820 }
11821 installedlibRule = &installRules[i]
11822 }
11823 }
11824 if installedlibRule == nil {
11825 t.Errorf("No install rule found for installedlib")
11826 return
11827 }
11828
11829 if expectLibfooOnSystemLib {
11830 android.AssertStringListContains(t,
11831 "installedlib doesn't have install dependency on libfoo impl",
11832 installedlibRule.OrderOnlyDeps,
11833 "out/target/product/test_device/system/lib/libfoo.so")
11834 } else {
11835 android.AssertStringListDoesNotContain(t,
11836 "installedlib has install dependency on libfoo stub",
11837 installedlibRule.Deps,
11838 "out/target/product/test_device/system/lib/libfoo.so")
11839 android.AssertStringListDoesNotContain(t,
11840 "installedlib has order-only install dependency on libfoo stub",
11841 installedlibRule.OrderOnlyDeps,
11842 "out/target/product/test_device/system/lib/libfoo.so")
11843 }
11844 }
11845
11846 prebuiltLibfooBp := []byte(`
11847 cc_prebuilt_library {
11848 name: "libfoo",
11849 prefer: true,
11850 srcs: ["libfoo.so"],
11851 stubs: {
11852 versions: ["1"],
11853 },
11854 apex_available: ["apexfoo"],
11855 }
11856 `)
11857
11858 apexfooBp := []byte(`
11859 apex {
11860 name: "apexfoo",
11861 key: "apexfoo.key",
11862 native_shared_libs: ["libfoo"],
11863 updatable: false,
11864 compile_multilib: "both",
11865 }
11866 apex_key {
11867 name: "apexfoo.key",
11868 public_key: "testkey.avbpubkey",
11869 private_key: "testkey.pem",
11870 }
11871 `)
11872
11873 installedlibBp := []byte(`
11874 cc_library {
11875 name: "installedlib",
11876 shared_libs: ["libfoo"],
11877 }
11878 `)
11879
11880 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011881 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011882 testFunc(
11883 t,
11884 /*expectLibfooOnSystemLib=*/ false,
11885 android.MockFS{
11886 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11887 "apexfoo/Android.bp": apexfooBp,
11888 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11889 "Android.bp": installedlibBp,
11890 },
11891 )
11892 })
11893
11894 disabledSourceLibfooBp := []byte(`
11895 cc_library {
11896 name: "libfoo",
11897 enabled: false,
11898 stubs: {
11899 versions: ["1"],
11900 },
11901 apex_available: ["apexfoo"],
11902 }
11903 `)
11904
11905 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011906 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011907 testFunc(
11908 t,
11909 /*expectLibfooOnSystemLib=*/ false,
11910 android.MockFS{
11911 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11912 "impl/Android.bp": disabledSourceLibfooBp,
11913 "apexfoo/Android.bp": apexfooBp,
11914 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11915 "Android.bp": installedlibBp,
11916 },
11917 )
11918 })
11919}
Jihoon Kange246bb72024-09-18 22:26:22 +000011920
11921func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011922 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011923 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11924 // in libs of android_app and java_library does not lead to class loader context device/host
11925 // path mismatch errors.
11926 android.GroupFixturePreparers(
11927 prepareForApexTest,
11928 android.PrepareForIntegrationTestWithAndroid,
11929 PrepareForTestWithApexBuildComponents,
11930 android.FixtureModifyEnv(func(env map[string]string) {
11931 env["DISABLE_CONTAINER_CHECK"] = "true"
11932 }),
11933 withFiles(filesForSdkLibrary),
11934 android.FixtureMergeMockFs(android.MockFS{
11935 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11936 }),
11937 ).RunTestWithBp(t, `
11938 apex {
11939 name: "com.android.foo30",
11940 key: "myapex.key",
11941 updatable: true,
11942 bootclasspath_fragments: [
11943 "foo-bootclasspath-fragment",
11944 ],
11945 java_libs: [
11946 "bar",
11947 ],
11948 apps: [
11949 "bar-app",
11950 ],
11951 min_sdk_version: "30",
11952 }
11953 apex_key {
11954 name: "myapex.key",
11955 public_key: "testkey.avbpubkey",
11956 private_key: "testkey.pem",
11957 }
11958 bootclasspath_fragment {
11959 name: "foo-bootclasspath-fragment",
11960 contents: [
11961 "framework-foo",
11962 ],
11963 apex_available: [
11964 "com.android.foo30",
11965 ],
11966 hidden_api: {
11967 split_packages: ["*"]
11968 },
11969 }
11970
11971 java_sdk_library {
11972 name: "framework-foo",
11973 srcs: [
11974 "A.java"
11975 ],
11976 unsafe_ignore_missing_latest_api: true,
11977 apex_available: [
11978 "com.android.foo30",
11979 ],
11980 compile_dex: true,
11981 sdk_version: "core_current",
11982 shared_library: false,
11983 }
11984
11985 java_library {
11986 name: "bar",
11987 srcs: [
11988 "A.java"
11989 ],
11990 libs: [
11991 "framework-foo.impl",
11992 ],
11993 apex_available: [
11994 "com.android.foo30",
11995 ],
11996 sdk_version: "core_current",
11997 }
11998
11999 java_library {
12000 name: "baz",
12001 srcs: [
12002 "A.java"
12003 ],
12004 libs: [
12005 "bar",
12006 ],
12007 sdk_version: "core_current",
12008 }
12009
12010 android_app {
12011 name: "bar-app",
12012 srcs: [
12013 "A.java"
12014 ],
12015 libs: [
12016 "baz",
12017 "framework-foo.impl",
12018 ],
12019 apex_available: [
12020 "com.android.foo30",
12021 ],
12022 sdk_version: "core_current",
12023 min_sdk_version: "30",
12024 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012025 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012026 }
12027 `)
12028}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012029
12030// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12031func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012032 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012033 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12034 apex {
12035 name: "myapex",
12036 key: "myapex.key",
12037 systemserverclasspath_fragments: [
12038 "mysystemserverclasspathfragment",
12039 ],
12040 min_sdk_version: "29",
12041 updatable: true,
12042 system_ext_specific: true,
12043 }
12044
12045 apex_key {
12046 name: "myapex.key",
12047 public_key: "testkey.avbpubkey",
12048 private_key: "testkey.pem",
12049 }
12050
12051 java_library {
12052 name: "foo",
12053 srcs: ["b.java"],
12054 min_sdk_version: "29",
12055 installable: true,
12056 apex_available: [
12057 "myapex",
12058 ],
12059 sdk_version: "current",
12060 }
12061
12062 systemserverclasspath_fragment {
12063 name: "mysystemserverclasspathfragment",
12064 contents: [
12065 "foo",
12066 ],
12067 apex_available: [
12068 "myapex",
12069 ],
12070 }
12071 `,
12072 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12073 )
12074}
Spandan Das72d86c62024-10-15 19:27:41 +000012075
12076// partitions should not package the artifacts that are included inside the apex.
12077func TestFilesystemWithApexDeps(t *testing.T) {
12078 t.Parallel()
12079 result := testApex(t, `
12080 android_filesystem {
12081 name: "myfilesystem",
12082 deps: ["myapex"],
12083 }
12084 apex {
12085 name: "myapex",
12086 key: "myapex.key",
12087 binaries: ["binfoo"],
12088 native_shared_libs: ["libfoo"],
12089 apps: ["appfoo"],
12090 updatable: false,
12091 }
12092 apex_key {
12093 name: "myapex.key",
12094 }
12095 cc_binary {
12096 name: "binfoo",
12097 apex_available: ["myapex"],
12098 }
12099 cc_library {
12100 name: "libfoo",
12101 apex_available: ["myapex"],
12102 }
12103 android_app {
12104 name: "appfoo",
12105 sdk_version: "current",
12106 apex_available: ["myapex"],
12107 }
12108 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12109
12110 partition := result.ModuleForTests("myfilesystem", "android_common")
12111 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12112 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12113}