blob: 0d6d31999baa54277879075351d265b2aab9d053 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Jooyung Han31c470b2019-10-18 16:26:59 +090023 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090024 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090025 "strings"
26 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090027
Yu Liueae7b362023-11-16 17:05:47 -080028 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090029
Kiyoung Kim487689e2022-07-26 09:48:22 +090030 "github.com/google/blueprint"
Jiyong Parkda6eb592018-12-19 17:12:36 +090031 "github.com/google/blueprint/proptools"
32
33 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080034 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090035 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000036 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070037 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070038 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090039 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090040 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070041 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090042)
43
Jooyung Hand3639552019-08-09 12:57:43 +090044// names returns name list from white space separated string
45func names(s string) (ns []string) {
46 for _, n := range strings.Split(s, " ") {
47 if len(n) > 0 {
48 ns = append(ns, n)
49 }
50 }
51 return
52}
53
Paul Duffin40b62572021-03-20 11:39:01 +000054func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090055 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010056 android.GroupFixturePreparers(
57 prepareForApexTest,
58 android.GroupFixturePreparers(preparers...),
59 ).
Paul Duffine05480a2021-03-08 15:07:14 +000060 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000061 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090062}
63
Paul Duffin40b62572021-03-20 11:39:01 +000064func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090065 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010066
67 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000068 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010069 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000070 }
Paul Duffin284165a2021-03-29 01:50:31 +010071
72 result := android.GroupFixturePreparers(
73 prepareForApexTest,
74 android.GroupFixturePreparers(preparers...),
75 optionalBpPreparer,
76 ).RunTest(t)
77
Paul Duffine05480a2021-03-08 15:07:14 +000078 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090079}
80
Paul Duffin810f33d2021-03-09 14:12:32 +000081func withFiles(files android.MockFS) android.FixturePreparer {
82 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090083}
84
Paul Duffin810f33d2021-03-09 14:12:32 +000085func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
86 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
87 variables.ManifestPackageNameOverrides = specs
88 })
Jooyung Han35155c42020-02-06 17:33:20 +090089}
90
Albert Martineefabcf2022-03-21 20:11:16 +000091func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
92 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
93 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
94 })
95}
96
Paul Duffin810f33d2021-03-09 14:12:32 +000097var withBinder32bit = android.FixtureModifyProductVariables(
98 func(variables android.FixtureProductVariables) {
99 variables.Binder32bit = proptools.BoolPtr(true)
100 },
101)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900102
Paul Duffin810f33d2021-03-09 14:12:32 +0000103var withUnbundledBuild = android.FixtureModifyProductVariables(
104 func(variables android.FixtureProductVariables) {
105 variables.Unbundled_build = proptools.BoolPtr(true)
106 },
107)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900108
Paul Duffin284165a2021-03-29 01:50:31 +0100109// Legacy preparer used for running tests within the apex package.
110//
111// This includes everything that was needed to run any test in the apex package prior to the
112// introduction of the test fixtures. Tests that are being converted to use fixtures directly
113// rather than through the testApex...() methods should avoid using this and instead use the
114// various preparers directly, using android.GroupFixturePreparers(...) to group them when
115// necessary.
116//
117// deprecated
118var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000119 // General preparers in alphabetical order as test infrastructure will enforce correct
120 // registration order.
121 android.PrepareForTestWithAndroidBuildComponents,
122 bpf.PrepareForTestWithBpf,
123 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100124 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000125 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
126 rust.PrepareForTestWithRustDefaultModules,
127 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800128 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000129
130 PrepareForTestWithApexBuildComponents,
131
132 // Additional apex test specific preparers.
133 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
134 filegroup {
135 name: "myapex-file_contexts",
136 srcs: [
137 "apex/myapex-file_contexts",
138 ],
139 }
140 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000141 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000142 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 "a.java": nil,
144 "PrebuiltAppFoo.apk": nil,
145 "PrebuiltAppFooPriv.apk": nil,
146 "apex_manifest.json": nil,
147 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000148 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
149 "system/sepolicy/apex/myapex2-file_contexts": nil,
150 "system/sepolicy/apex/otherapex-file_contexts": nil,
151 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
152 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700153 "mylib.cpp": nil,
154 "mytest.cpp": nil,
155 "mytest1.cpp": nil,
156 "mytest2.cpp": nil,
157 "mytest3.cpp": nil,
158 "myprebuilt": nil,
159 "my_include": nil,
160 "foo/bar/MyClass.java": nil,
161 "prebuilt.jar": nil,
162 "prebuilt.so": nil,
163 "vendor/foo/devkeys/test.x509.pem": nil,
164 "vendor/foo/devkeys/test.pk8": nil,
165 "testkey.x509.pem": nil,
166 "testkey.pk8": nil,
167 "testkey.override.x509.pem": nil,
168 "testkey.override.pk8": nil,
169 "vendor/foo/devkeys/testkey.avbpubkey": nil,
170 "vendor/foo/devkeys/testkey.pem": nil,
171 "NOTICE": nil,
172 "custom_notice": nil,
173 "custom_notice_for_static_lib": nil,
174 "testkey2.avbpubkey": nil,
175 "testkey2.pem": nil,
176 "myapex-arm64.apex": nil,
177 "myapex-arm.apex": nil,
178 "myapex.apks": nil,
179 "frameworks/base/api/current.txt": nil,
180 "framework/aidl/a.aidl": nil,
181 "dummy.txt": nil,
182 "baz": nil,
183 "bar/baz": nil,
184 "testdata/baz": nil,
185 "AppSet.apks": nil,
186 "foo.rs": nil,
187 "libfoo.jar": nil,
188 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000189 },
190 ),
191
192 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000193 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
194 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
195 variables.Platform_sdk_codename = proptools.StringPtr("Q")
196 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000197 // "Tiramisu" needs to be in the next line for compatibility with soong code,
198 // not because of these tests specifically (it's not used by the tests)
199 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000200 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000201 }),
202)
203
Paul Duffin52bfaa42021-03-23 23:40:12 +0000204var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
205 "system/sepolicy/apex/myapex-file_contexts": nil,
206})
207
Colin Crossb614cd42024-10-11 12:52:21 -0700208var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
209 "system/sepolicy/apex/otherapex-file_contexts": nil,
210})
211
Jooyung Han643adc42020-02-27 13:50:06 +0900212// ensure that 'result' equals 'expected'
213func ensureEquals(t *testing.T, result string, expected string) {
214 t.Helper()
215 if result != expected {
216 t.Errorf("%q != %q", expected, result)
217 }
218}
219
Jiyong Park25fc6a92018-11-18 18:02:45 +0900220// ensure that 'result' contains 'expected'
221func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900222 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900223 if !strings.Contains(result, expected) {
224 t.Errorf("%q is not found in %q", expected, result)
225 }
226}
227
Liz Kammer5bd365f2020-05-27 15:15:11 -0700228// ensure that 'result' contains 'expected' exactly one time
229func ensureContainsOnce(t *testing.T, result string, expected string) {
230 t.Helper()
231 count := strings.Count(result, expected)
232 if count != 1 {
233 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
234 }
235}
236
Jiyong Park25fc6a92018-11-18 18:02:45 +0900237// ensures that 'result' does not contain 'notExpected'
238func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900239 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900240 if strings.Contains(result, notExpected) {
241 t.Errorf("%q is found in %q", notExpected, result)
242 }
243}
244
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700245func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900246 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247 ok, err := regexp.MatchString(expectedRex, result)
248 if err != nil {
249 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
250 return
251 }
252 if !ok {
253 t.Errorf("%s does not match regular expession %s", result, expectedRex)
254 }
255}
256
Jooyung Hana3fddf42024-09-03 13:22:21 +0900257func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
258 t.Helper()
259 p := regexp.MustCompile(expectedRex)
260 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
261 t.Errorf("%q is not found in %v", expectedRex, result)
262 }
263}
264
Jiyong Park25fc6a92018-11-18 18:02:45 +0900265func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900266 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267 if !android.InList(expected, result) {
268 t.Errorf("%q is not found in %v", expected, result)
269 }
270}
271
272func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900273 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900274 if android.InList(notExpected, result) {
275 t.Errorf("%q is found in %v", notExpected, result)
276 }
277}
278
Jooyung Hane1633032019-08-01 17:41:43 +0900279func ensureListEmpty(t *testing.T, result []string) {
280 t.Helper()
281 if len(result) > 0 {
282 t.Errorf("%q is expected to be empty", result)
283 }
284}
285
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000286func ensureListNotEmpty(t *testing.T, result []string) {
287 t.Helper()
288 if len(result) == 0 {
289 t.Errorf("%q is expected to be not empty", result)
290 }
291}
292
Jiyong Park25fc6a92018-11-18 18:02:45 +0900293// Minimal test
294func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700295 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800296 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900297 apex_defaults {
298 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900299 manifest: ":myapex.manifest",
300 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900301 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900302 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900303 native_shared_libs: [
304 "mylib",
305 "libfoo.ffi",
306 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900307 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800308 multilib: {
309 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900310 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800311 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900312 },
Jiyong Park77acec62020-06-01 21:39:15 +0900313 java_libs: [
314 "myjar",
315 "myjar_dex",
316 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000317 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900318 }
319
Jiyong Park30ca9372019-02-07 16:27:23 +0900320 apex {
321 name: "myapex",
322 defaults: ["myapex-defaults"],
323 }
324
Jiyong Park25fc6a92018-11-18 18:02:45 +0900325 apex_key {
326 name: "myapex.key",
327 public_key: "testkey.avbpubkey",
328 private_key: "testkey.pem",
329 }
330
Jiyong Park809bb722019-02-13 21:33:49 +0900331 filegroup {
332 name: "myapex.manifest",
333 srcs: ["apex_manifest.json"],
334 }
335
336 filegroup {
337 name: "myapex.androidmanifest",
338 srcs: ["AndroidManifest.xml"],
339 }
340
Jiyong Park25fc6a92018-11-18 18:02:45 +0900341 cc_library {
342 name: "mylib",
343 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900344 shared_libs: [
345 "mylib2",
346 "libbar.ffi",
347 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900348 system_shared_libs: [],
349 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000350 // TODO: remove //apex_available:platform
351 apex_available: [
352 "//apex_available:platform",
353 "myapex",
354 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900355 }
356
Alex Light3d673592019-01-18 14:37:31 -0800357 cc_binary {
358 name: "foo",
359 srcs: ["mylib.cpp"],
360 compile_multilib: "both",
361 multilib: {
362 lib32: {
363 suffix: "32",
364 },
365 lib64: {
366 suffix: "64",
367 },
368 },
369 symlinks: ["foo_link_"],
370 symlink_preferred_arch: true,
371 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800372 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900373 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700374 }
375
Jiyong Park99644e92020-11-17 22:21:02 +0900376 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000377 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900378 srcs: ["foo.rs"],
379 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700380 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900381 apex_available: ["myapex"],
382 }
383
384 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000385 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900386 srcs: ["foo.rs"],
387 crate_name: "foo",
388 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900389 shared_libs: ["libfoo.shared_from_rust"],
390 }
391
392 cc_library_shared {
393 name: "libfoo.shared_from_rust",
394 srcs: ["mylib.cpp"],
395 system_shared_libs: [],
396 stl: "none",
397 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900398 }
399
400 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000401 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900402 srcs: ["foo.rs"],
403 crate_name: "foo",
404 apex_available: ["myapex"],
405 }
406
Colin Cross49f1a8f2024-10-23 13:04:15 -0700407 rust_library_dylib {
408 name: "libfoo.transitive.dylib.rust",
409 srcs: ["foo.rs"],
410 crate_name: "foo",
411 apex_available: ["myapex"],
412 }
413
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900414 rust_ffi_shared {
415 name: "libfoo.ffi",
416 srcs: ["foo.rs"],
417 crate_name: "foo",
418 apex_available: ["myapex"],
419 }
420
421 rust_ffi_shared {
422 name: "libbar.ffi",
423 srcs: ["foo.rs"],
424 crate_name: "bar",
425 apex_available: ["myapex"],
426 }
427
Paul Duffindddd5462020-04-07 15:25:44 +0100428 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900429 name: "mylib2",
430 srcs: ["mylib.cpp"],
431 system_shared_libs: [],
432 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900433 static_libs: ["libstatic"],
434 // TODO: remove //apex_available:platform
435 apex_available: [
436 "//apex_available:platform",
437 "myapex",
438 ],
439 }
440
Paul Duffindddd5462020-04-07 15:25:44 +0100441 cc_prebuilt_library_shared {
442 name: "mylib2",
443 srcs: ["prebuilt.so"],
444 // TODO: remove //apex_available:platform
445 apex_available: [
446 "//apex_available:platform",
447 "myapex",
448 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700449 }
Paul Duffindddd5462020-04-07 15:25:44 +0100450
Jiyong Park9918e1a2020-03-17 19:16:40 +0900451 cc_library_static {
452 name: "libstatic",
453 srcs: ["mylib.cpp"],
454 system_shared_libs: [],
455 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000456 // TODO: remove //apex_available:platform
457 apex_available: [
458 "//apex_available:platform",
459 "myapex",
460 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900461 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900462
463 java_library {
464 name: "myjar",
465 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900466 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900467 sdk_version: "none",
468 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900470 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000471 // TODO: remove //apex_available:platform
472 apex_available: [
473 "//apex_available:platform",
474 "myapex",
475 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800476 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900477 }
478
Jiyong Park77acec62020-06-01 21:39:15 +0900479 dex_import {
480 name: "myjar_dex",
481 jars: ["prebuilt.jar"],
482 apex_available: [
483 "//apex_available:platform",
484 "myapex",
485 ],
486 }
487
Jiyong Park7f7766d2019-07-25 22:02:35 +0900488 java_library {
489 name: "myotherjar",
490 srcs: ["foo/bar/MyClass.java"],
491 sdk_version: "none",
492 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900493 // TODO: remove //apex_available:platform
494 apex_available: [
495 "//apex_available:platform",
496 "myapex",
497 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900498 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900499
500 java_library {
501 name: "mysharedjar",
502 srcs: ["foo/bar/MyClass.java"],
503 sdk_version: "none",
504 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900505 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900506 `)
507
Jooyung Hana0503a52023-08-23 13:12:50 +0900508 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900509
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900510 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900511 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700512 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900513 var builder strings.Builder
514 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
515
516 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000517 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900518 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
519
Jiyong Park42cca6c2019-04-01 11:15:50 +0900520 optFlags := apexRule.Args["opt_flags"]
521 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700522 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900523 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900524
Jiyong Park25fc6a92018-11-18 18:02:45 +0900525 copyCmds := apexRule.Args["copy_commands"]
526
527 // Ensure that main rule creates an output
528 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
529
530 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700531 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
532 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
533 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900534 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900535 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900536
537 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700538 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
539 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900540 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900543 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900545
546 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800547 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
548 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900549 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900550 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900551 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700552 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
554 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900556 // .. but not for java libs
557 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900558 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800559
Colin Cross7113d202019-11-20 16:39:12 -0800560 // Ensure that the platform variant ends with _shared or _common
561 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
562 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900563 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
564 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
566
567 // Ensure that dynamic dependency to java libs are not included
568 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800569
570 // Ensure that all symlinks are present.
571 found_foo_link_64 := false
572 found_foo := false
573 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900574 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800575 if strings.HasSuffix(cmd, "bin/foo") {
576 found_foo = true
577 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
578 found_foo_link_64 = true
579 }
580 }
581 }
582 good := found_foo && found_foo_link_64
583 if !good {
584 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
585 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900586
Colin Crossf61d03d2023-11-02 16:56:39 -0700587 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
588 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100589 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100590 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
591 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
592 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100593
Colin Crossf61d03d2023-11-02 16:56:39 -0700594 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
595 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100596 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100597 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
598 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
599 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800600}
601
Jooyung Hanf21c7972019-12-16 22:32:06 +0900602func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700603 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800604 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900605 apex_defaults {
606 name: "myapex-defaults",
607 key: "myapex.key",
608 prebuilts: ["myetc"],
609 native_shared_libs: ["mylib"],
610 java_libs: ["myjar"],
611 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900612 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800613 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000614 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900615 }
616
617 prebuilt_etc {
618 name: "myetc",
619 src: "myprebuilt",
620 }
621
622 apex {
623 name: "myapex",
624 defaults: ["myapex-defaults"],
625 }
626
627 apex_key {
628 name: "myapex.key",
629 public_key: "testkey.avbpubkey",
630 private_key: "testkey.pem",
631 }
632
633 cc_library {
634 name: "mylib",
635 system_shared_libs: [],
636 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000637 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900638 }
639
640 java_library {
641 name: "myjar",
642 srcs: ["foo/bar/MyClass.java"],
643 sdk_version: "none",
644 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000645 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800646 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900647 }
648
649 android_app {
650 name: "AppFoo",
651 srcs: ["foo/bar/MyClass.java"],
652 sdk_version: "none",
653 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000654 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900655 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900656
657 runtime_resource_overlay {
658 name: "rro",
659 theme: "blue",
660 }
661
markchien2f59ec92020-09-02 16:23:38 +0800662 bpf {
663 name: "bpf",
664 srcs: ["bpf.c", "bpf2.c"],
665 }
666
Ken Chenfad7f9d2021-11-10 22:02:57 +0800667 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800668 name: "netdTest",
669 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800670 sub_dir: "netd",
671 }
672
Jooyung Hanf21c7972019-12-16 22:32:06 +0900673 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900674 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 "etc/myetc",
676 "javalib/myjar.jar",
677 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000678 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900679 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800680 "etc/bpf/bpf.o",
681 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800682 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900683 })
684}
685
Jooyung Han01a3ee22019-11-02 02:52:25 +0900686func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700687 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800688 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900689 apex {
690 name: "myapex",
691 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000692 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900693 }
694
695 apex_key {
696 name: "myapex.key",
697 public_key: "testkey.avbpubkey",
698 private_key: "testkey.pem",
699 }
700 `)
701
Jooyung Hana0503a52023-08-23 13:12:50 +0900702 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900703 args := module.Rule("apexRule").Args
704 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
705 t.Error("manifest should be apex_manifest.pb, but " + manifest)
706 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900707}
708
Liz Kammer4854a7d2021-05-27 14:28:27 -0400709func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700710 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711 ctx := testApex(t, `
712 apex_defaults {
713 name: "my_defaults",
714 key: "myapex.key",
715 product_specific: true,
716 file_contexts: ":my-file-contexts",
717 updatable: false,
718 }
719 apex {
720 name: "myapex_30",
721 min_sdk_version: "30",
722 defaults: ["my_defaults"],
723 }
724
725 apex {
726 name: "myapex_current",
727 min_sdk_version: "current",
728 defaults: ["my_defaults"],
729 }
730
731 apex {
732 name: "myapex_none",
733 defaults: ["my_defaults"],
734 }
735
736 apex_key {
737 name: "myapex.key",
738 public_key: "testkey.avbpubkey",
739 private_key: "testkey.pem",
740 }
741
742 filegroup {
743 name: "my-file-contexts",
744 srcs: ["product_specific_file_contexts"],
745 }
746 `, withFiles(map[string][]byte{
747 "product_specific_file_contexts": nil,
748 }), android.FixtureModifyProductVariables(
749 func(variables android.FixtureProductVariables) {
750 variables.Unbundled_build = proptools.BoolPtr(true)
751 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
752 }), android.FixtureMergeEnv(map[string]string{
753 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
754 }))
755
756 testCases := []struct {
757 module string
758 minSdkVersion string
759 }{
760 {
761 module: "myapex_30",
762 minSdkVersion: "30",
763 },
764 {
765 module: "myapex_current",
766 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
767 },
768 {
769 module: "myapex_none",
770 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
771 },
772 }
773 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900774 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400775 args := module.Rule("apexRule").Args
776 optFlags := args["opt_flags"]
777 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
778 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
779 }
780 }
781}
782
Jihoon Kang842b9992024-02-08 01:41:51 +0000783func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700784 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000785 ctx := testApex(t, `
786 apex_defaults {
787 name: "my_defaults",
788 key: "myapex.key",
789 product_specific: true,
790 file_contexts: ":my-file-contexts",
791 updatable: false,
792 }
793 apex {
794 name: "myapex_30",
795 min_sdk_version: "30",
796 defaults: ["my_defaults"],
797 }
798
799 apex {
800 name: "myapex_current",
801 min_sdk_version: "current",
802 defaults: ["my_defaults"],
803 }
804
805 apex {
806 name: "myapex_none",
807 defaults: ["my_defaults"],
808 }
809
810 apex_key {
811 name: "myapex.key",
812 public_key: "testkey.avbpubkey",
813 private_key: "testkey.pem",
814 }
815
816 filegroup {
817 name: "my-file-contexts",
818 srcs: ["product_specific_file_contexts"],
819 }
820 `, withFiles(map[string][]byte{
821 "product_specific_file_contexts": nil,
822 }), android.FixtureModifyProductVariables(
823 func(variables android.FixtureProductVariables) {
824 variables.Unbundled_build = proptools.BoolPtr(true)
825 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
826 }), android.FixtureMergeEnv(map[string]string{
827 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
828 }))
829
830 testCases := []struct {
831 module string
832 minSdkVersion string
833 }{
834 {
835 module: "myapex_30",
836 minSdkVersion: "30",
837 },
838 {
839 module: "myapex_current",
840 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
841 },
842 {
843 module: "myapex_none",
844 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
845 },
846 }
847 for _, tc := range testCases {
848 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
849 args := module.Rule("apexRule").Args
850 optFlags := args["opt_flags"]
851 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
852 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
853 }
854 }
855}
856
Jooyung Hanaf730952023-02-28 14:13:38 +0900857func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700858 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900859 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900860 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 if vendor {
862 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900863 }
864 ctx := testApex(t, `
865 apex {
866 name: "myapex",
867 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900868 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900869 `+prop+`
870 }
871
872 apex_key {
873 name: "myapex.key",
874 public_key: "testkey.avbpubkey",
875 private_key: "testkey.pem",
876 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900877 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900878
Jooyung Hana0503a52023-08-23 13:12:50 +0900879 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900880 if vendor {
881 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
882 rule.RuleParams.Command,
883 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900884 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900885 android.AssertStringDoesContain(t, "should force-label as system_file",
886 rule.RuleParams.Command,
887 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900888 }
889 }
890}
891
Jiyong Park25fc6a92018-11-18 18:02:45 +0900892func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800894 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900895 apex {
896 name: "myapex",
897 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000898 native_shared_libs: [
899 "mylib",
900 "mylib3",
901 "libmylib3_rs",
902 ],
Jiyong Park105dc322021-06-11 17:22:09 +0900903 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000904 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900905 }
906
907 apex_key {
908 name: "myapex.key",
909 public_key: "testkey.avbpubkey",
910 private_key: "testkey.pem",
911 }
912
913 cc_library {
914 name: "mylib",
915 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000916 shared_libs: [
917 "mylib2",
918 "mylib3#impl",
919 "libmylib2_rs",
920 "libmylib3_rs#impl",
921 "my_prebuilt_platform_lib",
922 "my_prebuilt_platform_stub_only_lib",
923 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000926 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900927 }
928
929 cc_library {
930 name: "mylib2",
931 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900932 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900933 system_shared_libs: [],
934 stl: "none",
935 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000936 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 versions: ["1", "2", "3"],
938 },
939 }
940
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000941 rust_ffi {
942 name: "libmylib2_rs",
943 crate_name: "mylib2",
944 srcs: ["mylib.rs"],
945 stubs: {
946 symbol_file: "mylib2.map.txt",
947 versions: ["1", "2", "3"],
948 },
949 }
950
Jiyong Park25fc6a92018-11-18 18:02:45 +0900951 cc_library {
952 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900953 srcs: ["mylib.cpp"],
954 shared_libs: ["mylib4"],
955 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900956 stl: "none",
957 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000958 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900959 versions: ["10", "11", "12"],
960 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000961 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900962 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900963
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000964 rust_ffi {
965 name: "libmylib3_rs",
966 crate_name: "mylib3",
967 srcs: ["mylib.rs"],
968 shared_libs: ["mylib4.from_rust"],
969 stubs: {
970 symbol_file: "mylib3.map.txt",
971 versions: ["10", "11", "12"],
972 },
973 apex_available: [ "myapex" ],
974 }
975
Jiyong Park28d395a2018-12-07 22:42:47 +0900976 cc_library {
977 name: "mylib4",
978 srcs: ["mylib.cpp"],
979 system_shared_libs: [],
980 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000981 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900982 }
Jiyong Park105dc322021-06-11 17:22:09 +0900983
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000984 cc_library {
985 name: "mylib4.from_rust",
986 srcs: ["mylib.cpp"],
987 system_shared_libs: [],
988 stl: "none",
989 apex_available: [ "myapex" ],
990 }
991
Spandan Das357ffcc2024-07-24 18:07:48 +0000992 cc_prebuilt_library_shared {
993 name: "my_prebuilt_platform_lib",
994 stubs: {
995 symbol_file: "my_prebuilt_platform_lib.map.txt",
996 versions: ["1", "2", "3"],
997 },
998 srcs: ["foo.so"],
999 }
1000
1001 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
1002 cc_prebuilt_library_shared {
1003 name: "my_prebuilt_platform_stub_only_lib",
1004 stubs: {
1005 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
1006 versions: ["1", "2", "3"],
1007 }
1008 }
1009
Jiyong Park105dc322021-06-11 17:22:09 +09001010 rust_binary {
1011 name: "foo.rust",
1012 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001013 shared_libs: [
1014 "libfoo.shared_from_rust",
1015 "libfoo_rs.shared_from_rust",
1016 ],
Jiyong Park105dc322021-06-11 17:22:09 +09001017 prefer_rlib: true,
1018 apex_available: ["myapex"],
1019 }
1020
1021 cc_library_shared {
1022 name: "libfoo.shared_from_rust",
1023 srcs: ["mylib.cpp"],
1024 system_shared_libs: [],
1025 stl: "none",
1026 stubs: {
1027 versions: ["10", "11", "12"],
1028 },
1029 }
1030
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001031 rust_ffi {
1032 name: "libfoo_rs.shared_from_rust",
1033 crate_name: "foo_rs",
1034 srcs: ["mylib.rs"],
1035 stubs: {
1036 versions: ["10", "11", "12"],
1037 },
1038 }
1039
Jiyong Park25fc6a92018-11-18 18:02:45 +09001040 `)
1041
Jooyung Hana0503a52023-08-23 13:12:50 +09001042 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001043 copyCmds := apexRule.Args["copy_commands"]
1044
1045 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001046 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001047
1048 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001049 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001050 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001051
1052 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001053 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001054 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001055
Colin Crossaede88c2020-08-11 12:17:01 -07001056 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001057
1058 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001059 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001060 ensureContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001061 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001062 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001063 ensureNotContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064
Colin Crossea91a172024-11-05 16:14:05 -08001065 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001066 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001067 ensureContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_apex10000/unstripped/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001068 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001069 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001070 ensureNotContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_12/unstripped/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001071
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001072 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1073 // is replaced by sharing of "cFlags" in cc/builder.go.
1074 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1075 // module variable representing "cflags". So it was not detected by ensureNotContains.
1076 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1077 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1078 // including the original cflags's "-include mylib.h".
1079 //
Jiyong Park64379952018-12-13 18:37:29 +09001080 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001081 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1082 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001083
Jiyong Park85cc35a2022-07-17 11:30:47 +09001084 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1085 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001086 ensureContains(t, ctx.ModuleForTests("libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park85cc35a2022-07-17 11:30:47 +09001087 // Ensure that genstub for apex-provided lib is invoked with --apex
1088 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001089 ensureContains(t, ctx.ModuleForTests("libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001090
Jooyung Hana0503a52023-08-23 13:12:50 +09001091 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001092 "lib64/mylib.so",
1093 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001094 "lib64/libmylib3_rs.so",
Jooyung Han671f1ce2019-12-17 12:47:13 +09001095 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001096 "lib64/mylib4.from_rust.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001097 "bin/foo.rust",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001098
1099 "lib64/libstd.dylib.so", // implicit rust ffi dep
Jooyung Han671f1ce2019-12-17 12:47:13 +09001100 })
Jiyong Park105dc322021-06-11 17:22:09 +09001101
1102 // Ensure that stub dependency from a rust module is not included
1103 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001104 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001105 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001106 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001107 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001108 ensureContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001109 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001110 ensureNotContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001111
Jooyung Hana0503a52023-08-23 13:12:50 +09001112 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001113 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001114 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001115
1116 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1117 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1118 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1119 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1120 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1121 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1122
1123 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1124 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1125 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1126 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1127 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1128 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 +09001129}
1130
Jooyung Han20348752023-12-05 15:23:56 +09001131func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001132 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001133 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1134 apex {
1135 name: "myapex",
1136 key: "myapex.key",
1137 vendor: true,
1138 updatable: false,
1139 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1140 }
1141
1142 apex_key {
1143 name: "myapex.key",
1144 public_key: "testkey.avbpubkey",
1145 private_key: "testkey.pem",
1146 }
1147
1148 cc_library {
1149 name: "libbar",
1150 srcs: ["mylib.cpp"],
1151 llndk: {
1152 symbol_file: "libbar.map.txt",
1153 }
1154 }
1155 `)
1156}
1157
Jiyong Park1bc84122021-06-22 20:23:05 +09001158func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001159 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ctx := testApex(t, `
1161 apex {
1162 name: "myapex",
1163 key: "myapex.key",
1164 native_shared_libs: ["mylib"],
1165 binaries: ["foo.rust"],
1166 updatable: false,
1167 platform_apis: true,
1168 }
1169
1170 apex_key {
1171 name: "myapex.key",
1172 public_key: "testkey.avbpubkey",
1173 private_key: "testkey.pem",
1174 }
1175
1176 cc_library {
1177 name: "mylib",
1178 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001179 shared_libs: [
1180 "mylib2",
1181 "libmylib2_rust"
1182 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001183 system_shared_libs: [],
1184 stl: "none",
1185 apex_available: [ "myapex" ],
1186 }
1187
1188 cc_library {
1189 name: "mylib2",
1190 srcs: ["mylib.cpp"],
1191 cflags: ["-include mylib.h"],
1192 system_shared_libs: [],
1193 stl: "none",
1194 stubs: {
1195 versions: ["1", "2", "3"],
1196 },
1197 }
1198
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001199 rust_ffi {
1200 name: "libmylib2_rust",
1201 crate_name: "mylib2_rust",
1202 srcs: ["mylib.rs"],
1203 stubs: {
1204 versions: ["1", "2", "3"],
1205 },
1206 }
1207
Jiyong Park1bc84122021-06-22 20:23:05 +09001208 rust_binary {
1209 name: "foo.rust",
1210 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001211 shared_libs: [
1212 "libfoo.shared_from_rust",
1213 "libmylib_rust.shared_from_rust"
1214 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001215 prefer_rlib: true,
1216 apex_available: ["myapex"],
1217 }
1218
1219 cc_library_shared {
1220 name: "libfoo.shared_from_rust",
1221 srcs: ["mylib.cpp"],
1222 system_shared_libs: [],
1223 stl: "none",
1224 stubs: {
1225 versions: ["10", "11", "12"],
1226 },
1227 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001228 rust_ffi {
1229 name: "libmylib_rust.shared_from_rust",
1230 crate_name: "mylib_rust",
1231 srcs: ["mylib.rs"],
1232 stubs: {
1233 versions: ["1", "2", "3"],
1234 },
1235 }
1236
Jiyong Park1bc84122021-06-22 20:23:05 +09001237 `)
1238
Jooyung Hana0503a52023-08-23 13:12:50 +09001239 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001240 copyCmds := apexRule.Args["copy_commands"]
1241
1242 // Ensure that indirect stubs dep is not included
1243 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001244 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.so")
1245 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001246 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1247
1248 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1249 // of the platform_apis: true)
Colin Cross1115b4b2025-01-21 15:38:58 -08001250 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000_p").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001251 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1252 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001253 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
1254 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross1115b4b2025-01-21 15:38:58 -08001255 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000_p").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001256 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1257 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001258 ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so")
1259 ensureContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001260}
1261
Colin Cross7812fd32020-09-25 12:35:10 -07001262func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1263 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001264 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001265 apex {
1266 name: "myapex",
1267 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001268 native_shared_libs: [
1269 "mylib",
1270 "mylib3",
1271 "libmylib3_rust",
1272 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001273 min_sdk_version: "29",
1274 }
1275
1276 apex_key {
1277 name: "myapex.key",
1278 public_key: "testkey.avbpubkey",
1279 private_key: "testkey.pem",
1280 }
1281
1282 cc_library {
1283 name: "mylib",
1284 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001285 shared_libs: [
1286 "mylib2",
1287 "mylib3#impl",
1288 "libmylib2_rust",
1289 "libmylib3_rust#impl",
1290 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001291 system_shared_libs: [],
1292 stl: "none",
1293 apex_available: [ "myapex" ],
1294 min_sdk_version: "28",
1295 }
1296
1297 cc_library {
1298 name: "mylib2",
1299 srcs: ["mylib.cpp"],
1300 cflags: ["-include mylib.h"],
1301 system_shared_libs: [],
1302 stl: "none",
1303 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001304 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001305 versions: ["28", "29", "30", "current"],
1306 },
1307 min_sdk_version: "28",
1308 }
1309
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001310 rust_ffi {
1311 name: "libmylib2_rust",
1312 crate_name: "mylib2_rust",
1313 srcs: ["mylib.rs"],
1314 stubs: {
1315 symbol_file: "mylib2.map.txt",
1316 versions: ["28", "29", "30", "current"],
1317 },
1318 min_sdk_version: "28",
1319 }
1320
Colin Cross7812fd32020-09-25 12:35:10 -07001321 cc_library {
1322 name: "mylib3",
1323 srcs: ["mylib.cpp"],
1324 shared_libs: ["mylib4"],
1325 system_shared_libs: [],
1326 stl: "none",
1327 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001328 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001329 versions: ["28", "29", "30", "current"],
1330 },
1331 apex_available: [ "myapex" ],
1332 min_sdk_version: "28",
1333 }
1334
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001335 rust_ffi {
1336 name: "libmylib3_rust",
1337 crate_name: "mylib3_rust",
1338 srcs: ["mylib.rs"],
1339 shared_libs: ["libmylib4.from_rust"],
1340 stubs: {
1341 symbol_file: "mylib3.map.txt",
1342 versions: ["28", "29", "30", "current"],
1343 },
1344 apex_available: [ "myapex" ],
1345 min_sdk_version: "28",
1346 }
1347
Colin Cross7812fd32020-09-25 12:35:10 -07001348 cc_library {
1349 name: "mylib4",
1350 srcs: ["mylib.cpp"],
1351 system_shared_libs: [],
1352 stl: "none",
1353 apex_available: [ "myapex" ],
1354 min_sdk_version: "28",
1355 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001356
1357 rust_ffi {
1358 name: "libmylib4.from_rust",
1359 crate_name: "mylib4",
1360 srcs: ["mylib.rs"],
1361 apex_available: [ "myapex" ],
1362 min_sdk_version: "28",
1363 }
Colin Cross7812fd32020-09-25 12:35:10 -07001364 `)
1365
Jooyung Hana0503a52023-08-23 13:12:50 +09001366 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001367 copyCmds := apexRule.Args["copy_commands"]
1368
1369 // Ensure that direct non-stubs dep is always included
1370 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001371 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1372 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001373
1374 // Ensure that indirect stubs dep is not included
1375 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001376 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001377
1378 // Ensure that direct stubs dep is included
1379 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1380
1381 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1382
Jiyong Park55549df2021-02-26 23:57:23 +09001383 // Ensure that mylib is linking with the latest version of stub for mylib2
1384 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001385 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001386 // ... and not linking to the non-stub (impl) variant of mylib2
1387 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001388 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001389
Colin Crossea91a172024-11-05 16:14:05 -08001390 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001391 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001392 ensureContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_apex29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001393 // .. and not linking to the stubs variant of mylib3
1394 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001395 ensureNotContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001396
1397 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001398 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001399 ensureNotContains(t, mylib2Cflags, "-include ")
1400
Jiyong Park85cc35a2022-07-17 11:30:47 +09001401 // Ensure that genstub is invoked with --systemapi
1402 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001403 ensureContains(t, ctx.ModuleForTests("libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001404
Jooyung Hana0503a52023-08-23 13:12:50 +09001405 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001406 "lib64/mylib.so",
1407 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001408 "lib64/libmylib3_rust.so",
Colin Cross7812fd32020-09-25 12:35:10 -07001409 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001410 "lib64/libmylib4.from_rust.so",
1411
1412 "lib64/libstd.dylib.so", // by the implicit dependency from foo.rust
Colin Cross7812fd32020-09-25 12:35:10 -07001413 })
1414}
1415
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001416func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1417 t.Parallel()
1418 // myapex (Z)
1419 // mylib -----------------.
1420 // |
1421 // otherapex (29) |
1422 // libstub's versions: 29 Z current
1423 // |
1424 // <platform> |
1425 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001426 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001427 apex {
1428 name: "myapex",
1429 key: "myapex.key",
1430 native_shared_libs: ["mylib"],
1431 min_sdk_version: "Z", // non-final
1432 }
1433
1434 cc_library {
1435 name: "mylib",
1436 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001437 shared_libs: [
1438 "libstub",
1439 "libstub_rust",
1440 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001441 apex_available: ["myapex"],
1442 min_sdk_version: "Z",
1443 }
1444
1445 apex_key {
1446 name: "myapex.key",
1447 public_key: "testkey.avbpubkey",
1448 private_key: "testkey.pem",
1449 }
1450
1451 apex {
1452 name: "otherapex",
1453 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001454 native_shared_libs: [
1455 "libstub",
1456 "libstub_rust",
1457 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001458 min_sdk_version: "29",
1459 }
1460
1461 cc_library {
1462 name: "libstub",
1463 srcs: ["mylib.cpp"],
1464 stubs: {
1465 versions: ["29", "Z", "current"],
1466 },
1467 apex_available: ["otherapex"],
1468 min_sdk_version: "29",
1469 }
1470
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001471 rust_ffi {
1472 name: "libstub_rust",
1473 crate_name: "stub_rust",
1474 srcs: ["mylib.rs"],
1475 stubs: {
1476 versions: ["29", "Z", "current"],
1477 },
1478 apex_available: ["otherapex"],
1479 min_sdk_version: "29",
1480 }
1481
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001482 // platform module depending on libstub from otherapex should use the latest stub("current")
1483 cc_library {
1484 name: "libplatform",
1485 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001486 shared_libs: [
1487 "libstub",
1488 "libstub_rust",
1489 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001490 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001491 `,
1492 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1493 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1494 variables.Platform_sdk_final = proptools.BoolPtr(false)
1495 variables.Platform_version_active_codenames = []string{"Z"}
1496 }),
1497 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001498
Jiyong Park55549df2021-02-26 23:57:23 +09001499 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001500 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001501 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001502 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1503
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001504 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001505 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001506 ensureContains(t, mylibLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001507
1508 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1509 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1510 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001511 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1512
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001513 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1514 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001515 ensureContains(t, libplatformLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001516}
1517
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001518func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001519 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001520 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001521 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001522 name: "myapex2",
1523 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001524 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001525 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001526 }
1527
1528 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001529 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001530 public_key: "testkey.avbpubkey",
1531 private_key: "testkey.pem",
1532 }
1533
1534 cc_library {
1535 name: "mylib",
1536 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001537 shared_libs: [
1538 "libfoo#10",
1539 "libfoo_rust#10"
1540 ],
Jiyong Park678c8812020-02-07 17:25:49 +09001541 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001542 system_shared_libs: [],
1543 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001544 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001545 }
1546
1547 cc_library {
1548 name: "libfoo",
1549 srcs: ["mylib.cpp"],
1550 shared_libs: ["libbar"],
1551 system_shared_libs: [],
1552 stl: "none",
1553 stubs: {
1554 versions: ["10", "20", "30"],
1555 },
1556 }
1557
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001558 rust_ffi {
1559 name: "libfoo_rust",
1560 crate_name: "foo_rust",
1561 srcs: ["mylib.cpp"],
1562 shared_libs: ["libbar.from_rust"],
1563 stubs: {
1564 versions: ["10", "20", "30"],
1565 },
1566 }
1567
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001568 cc_library {
1569 name: "libbar",
1570 srcs: ["mylib.cpp"],
1571 system_shared_libs: [],
1572 stl: "none",
1573 }
1574
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001575 cc_library {
1576 name: "libbar.from_rust",
1577 srcs: ["mylib.cpp"],
1578 system_shared_libs: [],
1579 stl: "none",
1580 }
1581
Jiyong Park678c8812020-02-07 17:25:49 +09001582 cc_library_static {
1583 name: "libbaz",
1584 srcs: ["mylib.cpp"],
1585 system_shared_libs: [],
1586 stl: "none",
1587 apex_available: [ "myapex2" ],
1588 }
1589
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001590 `)
1591
Jooyung Hana0503a52023-08-23 13:12:50 +09001592 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001593 copyCmds := apexRule.Args["copy_commands"]
1594
1595 // Ensure that direct non-stubs dep is always included
1596 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1597
1598 // Ensure that indirect stubs dep is not included
1599 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001600 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001601
1602 // Ensure that dependency of stubs is not included
1603 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001604 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.from_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001605
Colin Crossaede88c2020-08-11 12:17:01 -07001606 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001607
1608 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001609 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001610 ensureContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared_10/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001611 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001612 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001613 ensureNotContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001614
Jiyong Park3ff16992019-12-27 14:11:47 +09001615 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001616 libFooRustStubsLdFlags := ctx.ModuleForTests("libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001617
1618 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1619 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001620 ensureNotContains(t, libFooRustStubsLdFlags, "libbar.from_rust.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001621
Colin Crossf61d03d2023-11-02 16:56:39 -07001622 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1623 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001624 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001625
Colin Crossf61d03d2023-11-02 16:56:39 -07001626 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1627 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001628 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001629}
1630
Jooyung Hand3639552019-08-09 12:57:43 +09001631func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001632 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001633 /*
1634 myapex
1635 |
1636 v (runtime_libs)
1637 mylib ------+------> libfoo [provides stub]
1638 |
1639 `------> libbar
1640 */
Colin Cross1c460562021-02-16 17:55:47 -08001641 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001642 apex {
1643 name: "myapex",
1644 key: "myapex.key",
1645 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001646 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001647 }
1648
1649 apex_key {
1650 name: "myapex.key",
1651 public_key: "testkey.avbpubkey",
1652 private_key: "testkey.pem",
1653 }
1654
1655 cc_library {
1656 name: "mylib",
1657 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001658 static_libs: ["libstatic"],
1659 shared_libs: ["libshared"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001660 runtime_libs: [
1661 "libfoo",
1662 "libbar",
1663 "libfoo_rs",
1664 ],
Jooyung Hand3639552019-08-09 12:57:43 +09001665 system_shared_libs: [],
1666 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001667 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001668 }
1669
1670 cc_library {
1671 name: "libfoo",
1672 srcs: ["mylib.cpp"],
1673 system_shared_libs: [],
1674 stl: "none",
1675 stubs: {
1676 versions: ["10", "20", "30"],
1677 },
1678 }
1679
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001680 rust_ffi {
1681 name: "libfoo_rs",
1682 crate_name: "foo_rs",
1683 srcs: ["mylib.rs"],
1684 stubs: {
1685 versions: ["10", "20", "30"],
1686 },
1687 }
1688
Jooyung Hand3639552019-08-09 12:57:43 +09001689 cc_library {
1690 name: "libbar",
1691 srcs: ["mylib.cpp"],
1692 system_shared_libs: [],
1693 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001694 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001695 }
1696
Liz Kammer5f108fa2023-05-11 14:33:17 -04001697 cc_library {
1698 name: "libstatic",
1699 srcs: ["mylib.cpp"],
1700 system_shared_libs: [],
1701 stl: "none",
1702 apex_available: [ "myapex" ],
1703 runtime_libs: ["libstatic_to_runtime"],
1704 }
1705
1706 cc_library {
1707 name: "libshared",
1708 srcs: ["mylib.cpp"],
1709 system_shared_libs: [],
1710 stl: "none",
1711 apex_available: [ "myapex" ],
1712 runtime_libs: ["libshared_to_runtime"],
1713 }
1714
1715 cc_library {
1716 name: "libstatic_to_runtime",
1717 srcs: ["mylib.cpp"],
1718 system_shared_libs: [],
1719 stl: "none",
1720 apex_available: [ "myapex" ],
1721 }
1722
1723 cc_library {
1724 name: "libshared_to_runtime",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 apex_available: [ "myapex" ],
1729 }
Jooyung Hand3639552019-08-09 12:57:43 +09001730 `)
1731
Jooyung Hana0503a52023-08-23 13:12:50 +09001732 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001733 copyCmds := apexRule.Args["copy_commands"]
1734
1735 // Ensure that direct non-stubs dep is always included
1736 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1737
1738 // Ensure that indirect stubs dep is not included
1739 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001740 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001741
1742 // Ensure that runtime_libs dep in included
1743 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001744 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1745 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1746
1747 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001748
Jooyung Hana0503a52023-08-23 13:12:50 +09001749 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001750 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1751 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001752 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001753}
1754
Paul Duffina02cae32021-03-09 01:44:06 +00001755var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1756 cc.PrepareForTestWithCcBuildComponents,
1757 PrepareForTestWithApexBuildComponents,
1758 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001759 apex {
1760 name: "com.android.runtime",
1761 key: "com.android.runtime.key",
1762 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001763 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001764 }
1765
1766 apex_key {
1767 name: "com.android.runtime.key",
1768 public_key: "testkey.avbpubkey",
1769 private_key: "testkey.pem",
1770 }
Paul Duffina02cae32021-03-09 01:44:06 +00001771 `),
1772 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1773)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001774
Paul Duffina02cae32021-03-09 01:44:06 +00001775func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001776 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001777 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001778 cc_library {
1779 name: "libc",
1780 no_libcrt: true,
1781 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001782 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001783 stl: "none",
1784 system_shared_libs: [],
1785 stubs: { versions: ["1"] },
1786 apex_available: ["com.android.runtime"],
1787
1788 sanitize: {
1789 hwaddress: true,
1790 }
1791 }
1792
1793 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001794 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001795 no_libcrt: true,
1796 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001797 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001798 stl: "none",
1799 system_shared_libs: [],
1800 srcs: [""],
1801 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001802 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001803
1804 sanitize: {
1805 never: true,
1806 },
Spandan Das4de7b492023-05-05 21:13:01 +00001807 apex_available: [
1808 "//apex_available:anyapex",
1809 "//apex_available:platform",
1810 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001811 } `)
1812 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001813
Jooyung Hana0503a52023-08-23 13:12:50 +09001814 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001815 "lib64/bionic/libc.so",
1816 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1817 })
1818
Colin Cross4c4c1be2022-02-10 11:41:18 -08001819 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001820
1821 installed := hwasan.Description("install libclang_rt.hwasan")
1822 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1823
1824 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1825 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1826 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1827}
1828
1829func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001830 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001831 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001832 prepareForTestOfRuntimeApexWithHwasan,
1833 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1834 variables.SanitizeDevice = []string{"hwaddress"}
1835 }),
1836 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001837 cc_library {
1838 name: "libc",
1839 no_libcrt: true,
1840 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001841 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001842 stl: "none",
1843 system_shared_libs: [],
1844 stubs: { versions: ["1"] },
1845 apex_available: ["com.android.runtime"],
1846 }
1847
1848 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001849 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001850 no_libcrt: true,
1851 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001852 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001853 stl: "none",
1854 system_shared_libs: [],
1855 srcs: [""],
1856 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001857 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001858
1859 sanitize: {
1860 never: true,
1861 },
Spandan Das4de7b492023-05-05 21:13:01 +00001862 apex_available: [
1863 "//apex_available:anyapex",
1864 "//apex_available:platform",
1865 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001866 }
Paul Duffina02cae32021-03-09 01:44:06 +00001867 `)
1868 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001869
Jooyung Hana0503a52023-08-23 13:12:50 +09001870 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001871 "lib64/bionic/libc.so",
1872 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1873 })
1874
Colin Cross4c4c1be2022-02-10 11:41:18 -08001875 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001876
1877 installed := hwasan.Description("install libclang_rt.hwasan")
1878 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1879
1880 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1881 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1882 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1883}
1884
Jooyung Han61b66e92020-03-21 14:21:46 +00001885func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001886 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001887 testcases := []struct {
1888 name string
1889 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001890 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001891 shouldLink string
1892 shouldNotLink []string
1893 }{
1894 {
Jiyong Park55549df2021-02-26 23:57:23 +09001895 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001896 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001897 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001898 shouldLink: "current",
1899 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001900 },
1901 {
Jiyong Park55549df2021-02-26 23:57:23 +09001902 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001903 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001904 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001905 shouldLink: "current",
1906 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001907 },
1908 }
1909 for _, tc := range testcases {
1910 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001911 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001912 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001913 apex {
1914 name: "myapex",
1915 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001916 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001917 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001918 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001919 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001920
Jooyung Han61b66e92020-03-21 14:21:46 +00001921 apex_key {
1922 name: "myapex.key",
1923 public_key: "testkey.avbpubkey",
1924 private_key: "testkey.pem",
1925 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001926
Jooyung Han61b66e92020-03-21 14:21:46 +00001927 cc_library {
1928 name: "mylib",
1929 srcs: ["mylib.cpp"],
1930 vendor_available: true,
1931 shared_libs: ["libbar"],
1932 system_shared_libs: [],
1933 stl: "none",
1934 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001935 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001936 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001937
Jooyung Han61b66e92020-03-21 14:21:46 +00001938 cc_library {
1939 name: "libbar",
1940 srcs: ["mylib.cpp"],
1941 system_shared_libs: [],
1942 stl: "none",
1943 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001944 llndk: {
1945 symbol_file: "libbar.map.txt",
1946 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001947 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001948 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001949 withUnbundledBuild,
1950 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001951
Jooyung Han61b66e92020-03-21 14:21:46 +00001952 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001953 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001954 "lib64/mylib.so",
1955 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001956
Jooyung Han61b66e92020-03-21 14:21:46 +00001957 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001958 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001959 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1960 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001961
Steven Moreland2c4000c2021-04-27 02:08:49 +00001962 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1963 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001964 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001965 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001966 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001967
Steven Moreland2c4000c2021-04-27 02:08:49 +00001968 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001969 ver := tc.shouldLink
1970 if tc.shouldLink == "current" {
1971 ver = strconv.Itoa(android.FutureApiLevelInt)
1972 }
1973 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001974 })
1975 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001976}
1977
Jiyong Park25fc6a92018-11-18 18:02:45 +09001978func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001979 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001980 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001981 apex {
1982 name: "myapex",
1983 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001984 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm", "libmylib_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001985 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001986 }
1987
1988 apex_key {
1989 name: "myapex.key",
1990 public_key: "testkey.avbpubkey",
1991 private_key: "testkey.pem",
1992 }
1993
1994 cc_library {
1995 name: "mylib",
1996 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001997 system_shared_libs: ["libc"],
1998 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001999 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002000 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002001 }
2002
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002003 rust_ffi {
2004 name: "libmylib_rs",
2005 crate_name: "mylib_rs",
2006 shared_libs: ["libvers#27", "libm#impl"],
2007 srcs: ["mylib.rs"],
2008 apex_available: [ "myapex" ],
2009 }
2010
Jiyong Park25fc6a92018-11-18 18:02:45 +09002011 cc_library_shared {
2012 name: "mylib_shared",
2013 srcs: ["mylib.cpp"],
2014 shared_libs: ["libdl#27"],
2015 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002016 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002017 }
2018
2019 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09002020 name: "libBootstrap",
2021 srcs: ["mylib.cpp"],
2022 stl: "none",
2023 bootstrap: true,
2024 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002025
2026 rust_ffi {
2027 name: "libbootstrap_rs",
2028 srcs: ["mylib.cpp"],
2029 crate_name: "bootstrap_rs",
2030 bootstrap: true,
2031 }
2032
2033 cc_library {
2034 name: "libvers",
2035 srcs: ["mylib.cpp"],
2036 stl: "none",
2037 stubs: { versions: ["27","30"] },
2038 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09002039 `)
2040
Jooyung Hana0503a52023-08-23 13:12:50 +09002041 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002042 copyCmds := apexRule.Args["copy_commands"]
2043
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002044 // Ensure that mylib, libmylib_rs, libm, libdl, libstd.dylib.so (from Rust) are included.
Alex Light5098a612018-11-29 17:12:15 -08002045 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002046 ensureContains(t, copyCmds, "image.apex/lib64/libmylib_rs.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09002047 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
2048 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002049 ensureContains(t, copyCmds, "image.apex/lib64/libstd.dylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002050
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002051 // Ensure that libc and liblog (from Rust) is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09002052 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002053 ensureNotContains(t, copyCmds, "image.apex/lib64/liblog.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002054
Colin Crossaede88c2020-08-11 12:17:01 -07002055 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002056 mylibRsFlags := ctx.ModuleForTests("libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"]
Colin Crossaede88c2020-08-11 12:17:01 -07002057 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
2058 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09002059
2060 // For dependency to libc
2061 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002062 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002063 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002064 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002065 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002066 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
2067 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002068
2069 // For dependency to libm
2070 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002071 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002072 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002073 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002074 // ... and is not compiling with the stub
2075 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
2076 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
2077
2078 // For dependency to libdl
2079 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002080 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002081 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002082 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
2083 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002084 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002085 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002086 // ... Cflags from stub is correctly exported to mylib
2087 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
2088 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09002089
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002090 // Rust checks
2091 // For dependency to libc, liblog
2092 // Ensure that libmylib_rs is linking with the latest versions of stubs
2093 ensureContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
2094 ensureContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared_current/liblog.so")
2095 // ... and not linking to the non-stub (impl) variants
2096 ensureNotContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2097 ensureNotContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared/liblog.so")
2098
2099 // For libm dependency (explicit)
2100 // Ensure that mylib is linking with the non-stub (impl) variant
2101 ensureContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
2102 // ... and not linking to the stub variant
2103 ensureNotContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
2104
2105 // For dependency to libvers
2106 // (We do not use libdl#27 as Rust links the system libs implicitly and does
2107 // not currently have a system_shared_libs equivalent to prevent this)
2108 // Ensure that mylib is linking with the specified version of stubs
2109 ensureContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_27/libvers.so")
2110 // ... and not linking to the other versions of stubs
2111 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_30/libvers.so")
2112 // ... and not linking to the non-stub (impl) variant
2113 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_apex10000/libvers.so")
2114
Jiyong Parkb0788572018-12-20 22:10:17 +09002115 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08002116 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
2117 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2118 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2119 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002120
2121 // Ensure that libbootstrap_rs is depending on the platform variant of bionic libs
2122 libRsFlags := ctx.ModuleForTests("libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"]
2123 ensureContains(t, libRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2124 ensureContains(t, libRsFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2125 ensureContains(t, libRsFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002126}
Jiyong Park7c2ee712018-12-07 00:42:25 +09002127
Jooyung Han749dc692020-04-15 11:03:39 +09002128func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002129 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09002130 // there are three links between liba --> libz.
2131 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09002132 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09002133 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08002134 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09002139 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002140 }
2141
2142 apex {
2143 name: "otherapex",
2144 key: "myapex.key",
2145 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09002146 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09002147 }
2148
2149 apex_key {
2150 name: "myapex.key",
2151 public_key: "testkey.avbpubkey",
2152 private_key: "testkey.pem",
2153 }
2154
2155 cc_library {
2156 name: "libx",
2157 shared_libs: ["liba"],
2158 system_shared_libs: [],
2159 stl: "none",
2160 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002161 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002162 }
2163
2164 cc_library {
2165 name: "liby",
2166 shared_libs: ["liba"],
2167 system_shared_libs: [],
2168 stl: "none",
2169 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002170 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002171 }
2172
2173 cc_library {
2174 name: "liba",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002175 shared_libs: ["libz", "libz_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002176 system_shared_libs: [],
2177 stl: "none",
2178 apex_available: [
2179 "//apex_available:anyapex",
2180 "//apex_available:platform",
2181 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002182 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002183 }
2184
2185 cc_library {
2186 name: "libz",
2187 system_shared_libs: [],
2188 stl: "none",
2189 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09002190 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09002191 },
2192 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002193
2194 rust_ffi {
2195 name: "libz_rs",
2196 crate_name: "z_rs",
2197 srcs: ["foo.rs"],
2198 stubs: {
2199 versions: ["28", "30"],
2200 },
2201 }
Jooyung Han749dc692020-04-15 11:03:39 +09002202 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002203
2204 expectLink := func(from, from_variant, to, to_variant string) {
2205 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2206 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2207 }
2208 expectNoLink := func(from, from_variant, to, to_variant string) {
2209 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2210 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2211 }
2212 // platform liba is linked to non-stub version
2213 expectLink("liba", "shared", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002214 expectLink("liba", "shared", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002215 // liba in myapex is linked to current
2216 expectLink("liba", "shared_apex29", "libz", "shared_current")
2217 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09002218 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07002219 expectNoLink("liba", "shared_apex29", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002220 expectLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_current")
2221 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_30")
2222 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_28")
2223 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002224 // liba in otherapex is linked to current
2225 expectLink("liba", "shared_apex30", "libz", "shared_current")
2226 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002227 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
2228 expectNoLink("liba", "shared_apex30", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002229 expectLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_current")
2230 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_30")
2231 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_28")
2232 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002233}
2234
Jooyung Hanaed150d2020-04-02 01:41:41 +09002235func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002236 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002237 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09002238 apex {
2239 name: "myapex",
2240 key: "myapex.key",
2241 native_shared_libs: ["libx"],
2242 min_sdk_version: "R",
2243 }
2244
2245 apex_key {
2246 name: "myapex.key",
2247 public_key: "testkey.avbpubkey",
2248 private_key: "testkey.pem",
2249 }
2250
2251 cc_library {
2252 name: "libx",
2253 shared_libs: ["libz"],
2254 system_shared_libs: [],
2255 stl: "none",
2256 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002257 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09002258 }
2259
2260 cc_library {
2261 name: "libz",
2262 system_shared_libs: [],
2263 stl: "none",
2264 stubs: {
2265 versions: ["29", "R"],
2266 },
2267 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002268 `,
2269 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2270 variables.Platform_version_active_codenames = []string{"R"}
2271 }),
2272 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002273
2274 expectLink := func(from, from_variant, to, to_variant string) {
2275 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2276 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2277 }
2278 expectNoLink := func(from, from_variant, to, to_variant string) {
2279 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2280 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2281 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002282 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2283 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002284 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2285 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002286}
2287
Jooyung Han4c4da062021-06-23 10:23:16 +09002288func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002289 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002290 testApex(t, `
2291 apex {
2292 name: "myapex",
2293 key: "myapex.key",
2294 java_libs: ["libx"],
2295 min_sdk_version: "S",
2296 }
2297
2298 apex_key {
2299 name: "myapex.key",
2300 public_key: "testkey.avbpubkey",
2301 private_key: "testkey.pem",
2302 }
2303
2304 java_library {
2305 name: "libx",
2306 srcs: ["a.java"],
2307 apex_available: [ "myapex" ],
2308 sdk_version: "current",
2309 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002310 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002311 }
2312 `,
2313 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2314 variables.Platform_version_active_codenames = []string{"S"}
2315 variables.Platform_sdk_codename = proptools.StringPtr("S")
2316 }),
2317 )
2318}
2319
Jooyung Han749dc692020-04-15 11:03:39 +09002320func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002321 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002322 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002323 apex {
2324 name: "myapex",
2325 key: "myapex.key",
2326 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002327 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002328 }
2329
2330 apex_key {
2331 name: "myapex.key",
2332 public_key: "testkey.avbpubkey",
2333 private_key: "testkey.pem",
2334 }
2335
2336 cc_library {
2337 name: "libx",
2338 shared_libs: ["libz"],
2339 system_shared_libs: [],
2340 stl: "none",
2341 apex_available: [ "myapex" ],
2342 }
2343
2344 cc_library {
2345 name: "libz",
2346 system_shared_libs: [],
2347 stl: "none",
2348 stubs: {
2349 versions: ["1", "2"],
2350 },
2351 }
2352 `)
2353
2354 expectLink := func(from, from_variant, to, to_variant string) {
2355 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2356 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2357 }
2358 expectNoLink := func(from, from_variant, to, to_variant string) {
2359 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2360 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2361 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002362 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002363 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002364 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002365 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002366}
2367
Jooyung Handfc864c2023-03-20 18:19:07 +09002368func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002369 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002370 ctx := testApex(t, `
2371 apex {
2372 name: "myapex",
2373 key: "myapex.key",
2374 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002375 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002376 vendor: true,
2377 min_sdk_version: "29",
2378 }
2379
2380 apex_key {
2381 name: "myapex.key",
2382 public_key: "testkey.avbpubkey",
2383 private_key: "testkey.pem",
2384 }
2385
2386 cc_library {
2387 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002388 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002389 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002390 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002391 shared_libs: ["libbar"],
2392 }
2393
2394 cc_library {
2395 name: "libbar",
2396 stubs: { versions: ["29", "30"] },
2397 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002398 }
2399 `)
2400
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002401 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002402
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002403 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002404
2405 // Ensure that mylib links with "current" LLNDK
2406 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002407 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002408
2409 // Ensure that mylib is targeting 29
2410 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2411 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2412
2413 // Ensure that the correct variant of crtbegin_so is used.
2414 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2415 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002416
2417 // Ensure that the crtbegin_so used by the APEX is targeting 29
2418 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2419 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2420}
2421
Chan Wang54956a62025-01-14 18:04:39 +00002422func TestTrackAllowedDepsForAndroidApex(t *testing.T) {
2423 t.Parallel()
2424 ctx := testApex(t, `
2425 apex {
2426 name: "com.android.myapex",
2427 key: "myapex.key",
2428 updatable: true,
2429 native_shared_libs: [
2430 "mylib",
2431 "yourlib",
2432 ],
2433 min_sdk_version: "29",
2434 }
2435
2436 apex {
2437 name: "myapex2",
2438 key: "myapex.key",
2439 updatable: false,
2440 native_shared_libs: ["yourlib"],
2441 }
2442
2443 apex_key {
2444 name: "myapex.key",
2445 public_key: "testkey.avbpubkey",
2446 private_key: "testkey.pem",
2447 }
2448
2449 cc_library {
2450 name: "mylib",
2451 srcs: ["mylib.cpp"],
2452 shared_libs: ["libbar", "libbar_rs"],
2453 min_sdk_version: "29",
2454 apex_available: ["com.android.myapex"],
2455 }
2456
2457 cc_library {
2458 name: "libbar",
2459 stubs: { versions: ["29", "30"] },
2460 }
2461
2462 rust_ffi {
2463 name: "libbar_rs",
2464 crate_name: "bar_rs",
2465 srcs: ["bar.rs"],
2466 stubs: { versions: ["29", "30"] },
2467 }
2468
2469 cc_library {
2470 name: "yourlib",
2471 srcs: ["mylib.cpp"],
2472 min_sdk_version: "29",
2473 apex_available: ["com.android.myapex", "myapex2", "//apex_available:platform"],
2474 }
2475 `, withFiles(android.MockFS{
2476 "packages/modules/common/build/allowed_deps.txt": nil,
2477 }),
2478 android.FixtureMergeMockFs(android.MockFS{
2479 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2480 }))
2481
2482 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2483 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2484 android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs,
2485 "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt")
2486 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2487 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2488
2489 myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex")
2490 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2491 myapex.Output("depsinfo/flatlist.txt")), "\n")
2492 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2493 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2494 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2495 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
2496 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2497 flatlist, "mylib:(minSdkVersion:29)")
2498 android.AssertStringListContains(t, "track platform-available lib",
2499 flatlist, "yourlib(minSdkVersion:29)")
2500}
2501
2502func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002503 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002504 ctx := testApex(t, `
2505 apex {
2506 name: "myapex",
2507 key: "myapex.key",
2508 updatable: true,
2509 native_shared_libs: [
2510 "mylib",
2511 "yourlib",
2512 ],
2513 min_sdk_version: "29",
2514 }
2515
2516 apex {
2517 name: "myapex2",
2518 key: "myapex.key",
2519 updatable: false,
2520 native_shared_libs: ["yourlib"],
2521 }
2522
2523 apex_key {
2524 name: "myapex.key",
2525 public_key: "testkey.avbpubkey",
2526 private_key: "testkey.pem",
2527 }
2528
2529 cc_library {
2530 name: "mylib",
2531 srcs: ["mylib.cpp"],
Chan Wang54956a62025-01-14 18:04:39 +00002532 shared_libs: ["libbar"],
Jooyung Han4495f842023-04-25 16:39:59 +09002533 min_sdk_version: "29",
2534 apex_available: ["myapex"],
2535 }
2536
2537 cc_library {
2538 name: "libbar",
2539 stubs: { versions: ["29", "30"] },
2540 }
2541
2542 cc_library {
2543 name: "yourlib",
2544 srcs: ["mylib.cpp"],
2545 min_sdk_version: "29",
2546 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2547 }
2548 `, withFiles(android.MockFS{
2549 "packages/modules/common/build/allowed_deps.txt": nil,
2550 }))
2551
2552 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2553 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Chan Wang54956a62025-01-14 18:04:39 +00002554 android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002555 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002556 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002557 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002558}
2559
2560func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002561 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002562 ctx := testApex(t, `
2563 apex {
Chan Wang54956a62025-01-14 18:04:39 +00002564 name: "com.android.myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002565 key: "myapex.key",
2566 updatable: true,
2567 min_sdk_version: "29",
2568 }
2569
2570 apex_key {
2571 name: "myapex.key",
2572 public_key: "testkey.avbpubkey",
2573 private_key: "testkey.pem",
2574 }
Chan Wang54956a62025-01-14 18:04:39 +00002575 `,
2576 android.FixtureMergeMockFs(android.MockFS{
2577 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2578 }))
Jooyung Han4495f842023-04-25 16:39:59 +09002579 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2580 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2581 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2582 }
2583}
2584
Jooyung Han03b51852020-02-26 22:45:42 +09002585func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002586 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002587 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002588 apex {
2589 name: "myapex",
2590 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002591 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002592 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002593 }
2594
2595 apex_key {
2596 name: "myapex.key",
2597 public_key: "testkey.avbpubkey",
2598 private_key: "testkey.pem",
2599 }
2600
2601 cc_library {
2602 name: "libx",
2603 system_shared_libs: [],
2604 stl: "none",
2605 apex_available: [ "myapex" ],
2606 stubs: {
2607 versions: ["1", "2"],
2608 },
2609 }
2610
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002611 rust_ffi {
2612 name: "libx_rs",
2613 crate_name: "x_rs",
2614 srcs: ["x.rs"],
2615 apex_available: [ "myapex" ],
2616 stubs: {
2617 versions: ["1", "2"],
2618 },
2619 }
2620
Jooyung Han03b51852020-02-26 22:45:42 +09002621 cc_library {
2622 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002623 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002624 system_shared_libs: [],
2625 stl: "none",
2626 }
2627 `)
2628
2629 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002630 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002631 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2632 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2633 }
2634 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002635 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002636 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2637 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2638 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002639 expectLink("libz", "shared", "libx", "shared_current")
2640 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002641 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2642 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002643 expectNoLink("libz", "shared", "libz", "shared_1")
2644 expectNoLink("libz", "shared", "libz", "shared")
2645}
2646
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002647var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2648 func(variables android.FixtureProductVariables) {
2649 variables.SanitizeDevice = []string{"hwaddress"}
2650 },
2651)
2652
Jooyung Han75568392020-03-20 04:29:24 +09002653func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002654 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002655 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002656 apex {
2657 name: "myapex",
2658 key: "myapex.key",
2659 native_shared_libs: ["libx"],
2660 min_sdk_version: "29",
2661 }
2662
2663 apex_key {
2664 name: "myapex.key",
2665 public_key: "testkey.avbpubkey",
2666 private_key: "testkey.pem",
2667 }
2668
2669 cc_library {
2670 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002671 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002672 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002673 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002674 }
2675
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002676 rust_ffi {
2677 name: "libbar_rs",
2678 crate_name: "bar_rs",
2679 srcs: ["bar.rs"],
2680 stubs: { versions: ["29", "30"] },
2681 }
2682
Jooyung Han03b51852020-02-26 22:45:42 +09002683 cc_library {
2684 name: "libbar",
2685 stubs: {
2686 versions: ["29", "30"],
2687 },
2688 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002689 `,
2690 prepareForTestWithSantitizeHwaddress,
2691 )
Jooyung Han03b51852020-02-26 22:45:42 +09002692 expectLink := func(from, from_variant, to, to_variant string) {
2693 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2694 libFlags := ld.Args["libFlags"]
2695 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2696 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002697 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002698 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002699}
2700
Jooyung Han75568392020-03-20 04:29:24 +09002701func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002702 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002703 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002704 apex {
2705 name: "myapex",
2706 key: "myapex.key",
2707 native_shared_libs: ["libx"],
2708 min_sdk_version: "29",
2709 }
2710
2711 apex_key {
2712 name: "myapex.key",
2713 public_key: "testkey.avbpubkey",
2714 private_key: "testkey.pem",
2715 }
2716
2717 cc_library {
2718 name: "libx",
2719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002720 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002721 }
Jooyung Han75568392020-03-20 04:29:24 +09002722 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002723
2724 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002725 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002726 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002727 // note that platform variant is not.
2728 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002729 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002730}
2731
Jooyung Han749dc692020-04-15 11:03:39 +09002732func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002733 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002734 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002735 apex {
2736 name: "myapex",
2737 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002738 native_shared_libs: ["mylib"],
2739 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002740 }
2741
2742 apex_key {
2743 name: "myapex.key",
2744 public_key: "testkey.avbpubkey",
2745 private_key: "testkey.pem",
2746 }
Jooyung Han749dc692020-04-15 11:03:39 +09002747
2748 cc_library {
2749 name: "mylib",
2750 srcs: ["mylib.cpp"],
2751 system_shared_libs: [],
2752 stl: "none",
2753 apex_available: [
2754 "myapex",
2755 ],
2756 min_sdk_version: "30",
2757 }
2758 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002759
2760 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2761 apex {
2762 name: "myapex",
2763 key: "myapex.key",
2764 native_shared_libs: ["libfoo.ffi"],
2765 min_sdk_version: "29",
2766 }
2767
2768 apex_key {
2769 name: "myapex.key",
2770 public_key: "testkey.avbpubkey",
2771 private_key: "testkey.pem",
2772 }
2773
2774 rust_ffi_shared {
2775 name: "libfoo.ffi",
2776 srcs: ["foo.rs"],
2777 crate_name: "foo",
2778 apex_available: [
2779 "myapex",
2780 ],
2781 min_sdk_version: "30",
2782 }
2783 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002784
2785 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2786 apex {
2787 name: "myapex",
2788 key: "myapex.key",
2789 java_libs: ["libfoo"],
2790 min_sdk_version: "29",
2791 }
2792
2793 apex_key {
2794 name: "myapex.key",
2795 public_key: "testkey.avbpubkey",
2796 private_key: "testkey.pem",
2797 }
2798
2799 java_import {
2800 name: "libfoo",
2801 jars: ["libfoo.jar"],
2802 apex_available: [
2803 "myapex",
2804 ],
2805 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002806 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002807 }
2808 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002809
2810 // Skip check for modules compiling against core API surface
2811 testApex(t, `
2812 apex {
2813 name: "myapex",
2814 key: "myapex.key",
2815 java_libs: ["libfoo"],
2816 min_sdk_version: "29",
2817 }
2818
2819 apex_key {
2820 name: "myapex.key",
2821 public_key: "testkey.avbpubkey",
2822 private_key: "testkey.pem",
2823 }
2824
2825 java_library {
2826 name: "libfoo",
2827 srcs: ["Foo.java"],
2828 apex_available: [
2829 "myapex",
2830 ],
2831 // Compile against core API surface
2832 sdk_version: "core_current",
2833 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002834 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002835 }
2836 `)
2837
Jooyung Han749dc692020-04-15 11:03:39 +09002838}
2839
2840func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002841 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002842 testApex(t, `
2843 apex {
2844 name: "myapex",
2845 key: "myapex.key",
2846 native_shared_libs: ["libfoo"],
2847 java_libs: ["libbar"],
2848 min_sdk_version: "29",
2849 }
2850
2851 apex_key {
2852 name: "myapex.key",
2853 public_key: "testkey.avbpubkey",
2854 private_key: "testkey.pem",
2855 }
2856
2857 cc_library {
2858 name: "libfoo",
2859 srcs: ["mylib.cpp"],
2860 shared_libs: ["libfoo_dep"],
2861 apex_available: ["myapex"],
2862 min_sdk_version: "29",
2863 }
2864
2865 cc_library {
2866 name: "libfoo_dep",
2867 srcs: ["mylib.cpp"],
2868 apex_available: ["myapex"],
2869 min_sdk_version: "29",
2870 }
2871
2872 java_library {
2873 name: "libbar",
2874 sdk_version: "current",
2875 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002876 static_libs: [
2877 "libbar_dep",
2878 "libbar_import_dep",
2879 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002880 apex_available: ["myapex"],
2881 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002882 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002883 }
2884
2885 java_library {
2886 name: "libbar_dep",
2887 sdk_version: "current",
2888 srcs: ["a.java"],
2889 apex_available: ["myapex"],
2890 min_sdk_version: "29",
2891 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002892
2893 java_import {
2894 name: "libbar_import_dep",
2895 jars: ["libbar.jar"],
2896 apex_available: ["myapex"],
2897 min_sdk_version: "29",
2898 }
Jooyung Han03b51852020-02-26 22:45:42 +09002899 `)
2900}
2901
Colin Cross8ca61c12022-10-06 21:00:14 -07002902func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002903 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002904 // Tests that an apex dependency with min_sdk_version higher than the
2905 // min_sdk_version of the apex is allowed as long as the dependency's
2906 // min_sdk_version is less than or equal to the api level that the
2907 // architecture was introduced in. In this case, arm64 didn't exist
2908 // until api level 21, so the arm64 code will never need to run on
2909 // an api level 20 device, even if other architectures of the apex
2910 // will.
2911 testApex(t, `
2912 apex {
2913 name: "myapex",
2914 key: "myapex.key",
2915 native_shared_libs: ["libfoo"],
2916 min_sdk_version: "20",
2917 }
2918
2919 apex_key {
2920 name: "myapex.key",
2921 public_key: "testkey.avbpubkey",
2922 private_key: "testkey.pem",
2923 }
2924
2925 cc_library {
2926 name: "libfoo",
2927 srcs: ["mylib.cpp"],
2928 apex_available: ["myapex"],
2929 min_sdk_version: "21",
2930 stl: "none",
2931 }
2932 `)
2933}
2934
Artur Satayev8cf899a2020-04-15 17:29:42 +01002935func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002936 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002937 testCases := []struct {
2938 name string
2939 expectedError string
2940 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002941 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002942 }{
2943 {
2944 name: "Non-updatable apex with non-stable dep",
2945 bp: `
2946 apex {
2947 name: "myapex",
2948 java_libs: ["myjar"],
2949 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002950 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002951 }
2952 apex_key {
2953 name: "myapex.key",
2954 public_key: "testkey.avbpubkey",
2955 private_key: "testkey.pem",
2956 }
2957 java_library {
2958 name: "myjar",
2959 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002960 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002961 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002962 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002963 }
2964 `,
2965 },
2966 {
2967 name: "Updatable apex with stable dep",
2968 bp: `
2969 apex {
2970 name: "myapex",
2971 java_libs: ["myjar"],
2972 key: "myapex.key",
2973 updatable: true,
2974 min_sdk_version: "29",
2975 }
2976 apex_key {
2977 name: "myapex.key",
2978 public_key: "testkey.avbpubkey",
2979 private_key: "testkey.pem",
2980 }
2981 java_library {
2982 name: "myjar",
2983 srcs: ["foo/bar/MyClass.java"],
2984 sdk_version: "current",
2985 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002986 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002987 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002988 }
2989 `,
2990 },
2991 {
2992 name: "Updatable apex with non-stable dep",
2993 expectedError: "cannot depend on \"myjar\"",
2994 bp: `
2995 apex {
2996 name: "myapex",
2997 java_libs: ["myjar"],
2998 key: "myapex.key",
2999 updatable: true,
3000 }
3001 apex_key {
3002 name: "myapex.key",
3003 public_key: "testkey.avbpubkey",
3004 private_key: "testkey.pem",
3005 }
3006 java_library {
3007 name: "myjar",
3008 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003009 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003010 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003011 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003012 }
3013 `,
3014 },
3015 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003016 name: "Updatable apex with non-stable legacy core platform dep",
3017 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
3018 bp: `
3019 apex {
3020 name: "myapex",
3021 java_libs: ["myjar-uses-legacy"],
3022 key: "myapex.key",
3023 updatable: true,
3024 }
3025 apex_key {
3026 name: "myapex.key",
3027 public_key: "testkey.avbpubkey",
3028 private_key: "testkey.pem",
3029 }
3030 java_library {
3031 name: "myjar-uses-legacy",
3032 srcs: ["foo/bar/MyClass.java"],
3033 sdk_version: "core_platform",
3034 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003035 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003036 }
3037 `,
3038 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
3039 },
3040 {
Paul Duffin043f5e72021-03-05 00:00:01 +00003041 name: "Updatable apex with non-stable transitive dep",
3042 // This is not actually detecting that the transitive dependency is unstable, rather it is
3043 // detecting that the transitive dependency is building against a wider API surface than the
3044 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09003045 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003046 bp: `
3047 apex {
3048 name: "myapex",
3049 java_libs: ["myjar"],
3050 key: "myapex.key",
3051 updatable: true,
3052 }
3053 apex_key {
3054 name: "myapex.key",
3055 public_key: "testkey.avbpubkey",
3056 private_key: "testkey.pem",
3057 }
3058 java_library {
3059 name: "myjar",
3060 srcs: ["foo/bar/MyClass.java"],
3061 sdk_version: "current",
3062 apex_available: ["myapex"],
3063 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003064 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003065 }
3066 java_library {
3067 name: "transitive-jar",
3068 srcs: ["foo/bar/MyClass.java"],
3069 sdk_version: "core_platform",
3070 apex_available: ["myapex"],
3071 }
3072 `,
3073 },
3074 }
3075
3076 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003077 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3078 continue
3079 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003080 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003081 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003082 errorHandler := android.FixtureExpectsNoErrors
3083 if test.expectedError != "" {
3084 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003085 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003086 android.GroupFixturePreparers(
3087 java.PrepareForTestWithJavaDefaultModules,
3088 PrepareForTestWithApexBuildComponents,
3089 prepareForTestWithMyapex,
3090 android.OptionalFixturePreparer(test.preparer),
3091 ).
3092 ExtendWithErrorHandler(errorHandler).
3093 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003094 })
3095 }
3096}
3097
Jooyung Han749dc692020-04-15 11:03:39 +09003098func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3099 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3100 apex {
3101 name: "myapex",
3102 key: "myapex.key",
3103 native_shared_libs: ["mylib"],
3104 min_sdk_version: "29",
3105 }
3106
3107 apex_key {
3108 name: "myapex.key",
3109 public_key: "testkey.avbpubkey",
3110 private_key: "testkey.pem",
3111 }
3112
3113 cc_library {
3114 name: "mylib",
3115 srcs: ["mylib.cpp"],
3116 shared_libs: ["mylib2"],
3117 system_shared_libs: [],
3118 stl: "none",
3119 apex_available: [
3120 "myapex",
3121 ],
3122 min_sdk_version: "29",
3123 }
3124
3125 // indirect part of the apex
3126 cc_library {
3127 name: "mylib2",
3128 srcs: ["mylib.cpp"],
3129 system_shared_libs: [],
3130 stl: "none",
3131 apex_available: [
3132 "myapex",
3133 ],
3134 min_sdk_version: "30",
3135 }
3136 `)
3137}
3138
3139func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003140 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003141 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3142 apex {
3143 name: "myapex",
3144 key: "myapex.key",
3145 apps: ["AppFoo"],
3146 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003147 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003148 }
3149
3150 apex_key {
3151 name: "myapex.key",
3152 public_key: "testkey.avbpubkey",
3153 private_key: "testkey.pem",
3154 }
3155
3156 android_app {
3157 name: "AppFoo",
3158 srcs: ["foo/bar/MyClass.java"],
3159 sdk_version: "current",
3160 min_sdk_version: "29",
3161 system_modules: "none",
3162 stl: "none",
3163 static_libs: ["bar"],
3164 apex_available: [ "myapex" ],
3165 }
3166
3167 java_library {
3168 name: "bar",
3169 sdk_version: "current",
3170 srcs: ["a.java"],
3171 apex_available: [ "myapex" ],
3172 }
3173 `)
3174}
3175
3176func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003177 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003178 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003179 apex {
3180 name: "myapex",
3181 key: "myapex.key",
3182 native_shared_libs: ["mylib"],
3183 min_sdk_version: "29",
3184 }
3185
3186 apex_key {
3187 name: "myapex.key",
3188 public_key: "testkey.avbpubkey",
3189 private_key: "testkey.pem",
3190 }
3191
Colin Crossea91a172024-11-05 16:14:05 -08003192 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003193 cc_library {
3194 name: "mylib",
3195 srcs: ["mylib.cpp"],
3196 shared_libs: ["mylib2"],
3197 system_shared_libs: [],
3198 stl: "none",
3199 apex_available: ["myapex", "otherapex"],
3200 min_sdk_version: "29",
3201 }
3202
3203 cc_library {
3204 name: "mylib2",
3205 srcs: ["mylib.cpp"],
3206 system_shared_libs: [],
3207 stl: "none",
3208 apex_available: ["otherapex"],
3209 stubs: { versions: ["29", "30"] },
3210 min_sdk_version: "30",
3211 }
3212
3213 apex {
3214 name: "otherapex",
3215 key: "myapex.key",
3216 native_shared_libs: ["mylib", "mylib2"],
3217 min_sdk_version: "30",
3218 }
3219 `)
3220 expectLink := func(from, from_variant, to, to_variant string) {
3221 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3222 libFlags := ld.Args["libFlags"]
3223 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3224 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003225 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003226 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003227}
3228
Jooyung Haned124c32021-01-26 11:43:46 +09003229func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003230 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003231 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3232 func(variables android.FixtureProductVariables) {
3233 variables.Platform_sdk_codename = proptools.StringPtr("S")
3234 variables.Platform_version_active_codenames = []string{"S"}
3235 },
3236 )
Jooyung Haned124c32021-01-26 11:43:46 +09003237 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3238 apex {
3239 name: "myapex",
3240 key: "myapex.key",
3241 native_shared_libs: ["libfoo"],
3242 min_sdk_version: "S",
3243 }
3244 apex_key {
3245 name: "myapex.key",
3246 public_key: "testkey.avbpubkey",
3247 private_key: "testkey.pem",
3248 }
3249 cc_library {
3250 name: "libfoo",
3251 shared_libs: ["libbar"],
3252 apex_available: ["myapex"],
3253 min_sdk_version: "29",
3254 }
3255 cc_library {
3256 name: "libbar",
3257 apex_available: ["myapex"],
3258 }
3259 `, withSAsActiveCodeNames)
3260}
3261
3262func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003263 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003264 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3265 variables.Platform_sdk_codename = proptools.StringPtr("S")
3266 variables.Platform_version_active_codenames = []string{"S", "T"}
3267 })
Colin Cross1c460562021-02-16 17:55:47 -08003268 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003269 apex {
3270 name: "myapex",
3271 key: "myapex.key",
3272 native_shared_libs: ["libfoo"],
3273 min_sdk_version: "S",
3274 }
3275 apex_key {
3276 name: "myapex.key",
3277 public_key: "testkey.avbpubkey",
3278 private_key: "testkey.pem",
3279 }
3280 cc_library {
3281 name: "libfoo",
3282 shared_libs: ["libbar"],
3283 apex_available: ["myapex"],
3284 min_sdk_version: "S",
3285 }
3286 cc_library {
3287 name: "libbar",
3288 stubs: {
3289 symbol_file: "libbar.map.txt",
3290 versions: ["30", "S", "T"],
3291 },
3292 }
3293 `, withSAsActiveCodeNames)
3294
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003295 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003296 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3297 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003298 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003299}
3300
Jiyong Park7c2ee712018-12-07 00:42:25 +09003301func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003302 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003303 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003304 apex {
3305 name: "myapex",
3306 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003307 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003308 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003309 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003310 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003311 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003312 }
3313
3314 apex_key {
3315 name: "myapex.key",
3316 public_key: "testkey.avbpubkey",
3317 private_key: "testkey.pem",
3318 }
3319
3320 prebuilt_etc {
3321 name: "myetc",
3322 src: "myprebuilt",
3323 sub_dir: "foo/bar",
3324 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003325
3326 cc_library {
3327 name: "mylib",
3328 srcs: ["mylib.cpp"],
3329 relative_install_path: "foo/bar",
3330 system_shared_libs: [],
3331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003332 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003333 }
3334
3335 cc_binary {
3336 name: "mybin",
3337 srcs: ["mylib.cpp"],
3338 relative_install_path: "foo/bar",
3339 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003340 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003341 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003342 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003343
3344 rust_binary {
3345 name: "mybin.rust",
3346 srcs: ["foo.rs"],
3347 relative_install_path: "rust_subdir",
3348 apex_available: [ "myapex" ],
3349 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003350 `)
3351
Jooyung Hana0503a52023-08-23 13:12:50 +09003352 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003353 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003354
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003355 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003356 ensureContains(t, cmd, "/etc ")
3357 ensureContains(t, cmd, "/etc/foo ")
3358 ensureContains(t, cmd, "/etc/foo/bar ")
3359 ensureContains(t, cmd, "/lib64 ")
3360 ensureContains(t, cmd, "/lib64/foo ")
3361 ensureContains(t, cmd, "/lib64/foo/bar ")
3362 ensureContains(t, cmd, "/lib ")
3363 ensureContains(t, cmd, "/lib/foo ")
3364 ensureContains(t, cmd, "/lib/foo/bar ")
3365 ensureContains(t, cmd, "/bin ")
3366 ensureContains(t, cmd, "/bin/foo ")
3367 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003368 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003369}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003370
Jooyung Han35155c42020-02-06 17:33:20 +09003371func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003372 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003373 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003374 apex {
3375 name: "myapex",
3376 key: "myapex.key",
3377 multilib: {
3378 both: {
3379 native_shared_libs: ["mylib"],
3380 binaries: ["mybin"],
3381 },
3382 },
3383 compile_multilib: "both",
3384 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003385 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003386 }
3387
3388 apex_key {
3389 name: "myapex.key",
3390 public_key: "testkey.avbpubkey",
3391 private_key: "testkey.pem",
3392 }
3393
3394 cc_library {
3395 name: "mylib",
3396 relative_install_path: "foo/bar",
3397 system_shared_libs: [],
3398 stl: "none",
3399 apex_available: [ "myapex" ],
3400 native_bridge_supported: true,
3401 }
3402
3403 cc_binary {
3404 name: "mybin",
3405 relative_install_path: "foo/bar",
3406 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003407 stl: "none",
3408 apex_available: [ "myapex" ],
3409 native_bridge_supported: true,
3410 compile_multilib: "both", // default is "first" for binary
3411 multilib: {
3412 lib64: {
3413 suffix: "64",
3414 },
3415 },
3416 }
Spandan Das45e40012024-12-02 22:45:48 +00003417 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003418 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003419 "bin/foo/bar/mybin",
3420 "bin/foo/bar/mybin64",
3421 "bin/arm/foo/bar/mybin",
3422 "bin/arm64/foo/bar/mybin64",
3423 "lib/foo/bar/mylib.so",
3424 "lib/arm/foo/bar/mylib.so",
3425 "lib64/foo/bar/mylib.so",
3426 "lib64/arm64/foo/bar/mylib.so",
3427 })
3428}
3429
Jooyung Han85d61762020-06-24 23:50:26 +09003430func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003431 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003432 result := android.GroupFixturePreparers(
3433 prepareForApexTest,
3434 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3435 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003436 apex {
3437 name: "myapex",
3438 key: "myapex.key",
3439 binaries: ["mybin"],
3440 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003441 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003442 }
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448 cc_binary {
3449 name: "mybin",
3450 vendor: true,
3451 shared_libs: ["libfoo"],
3452 }
3453 cc_library {
3454 name: "libfoo",
3455 proprietary: true,
3456 }
3457 `)
3458
Jooyung Hana0503a52023-08-23 13:12:50 +09003459 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003460 "bin/mybin",
3461 "lib64/libfoo.so",
3462 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3463 "lib64/libc++.so",
3464 })
3465
Jooyung Hana0503a52023-08-23 13:12:50 +09003466 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003467 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003468 name := apexBundle.BaseModuleName()
3469 prefix := "TARGET_"
3470 var builder strings.Builder
3471 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003472 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003473 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003474 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003475
Jooyung Hana0503a52023-08-23 13:12:50 +09003476 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003477 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3478 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003479}
3480
Justin Yun13decfb2021-03-08 19:25:55 +09003481func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003483 ctx := testApex(t, `
3484 apex {
3485 name: "myapex",
3486 key: "myapex.key",
3487 updatable: false,
3488 product_specific: true,
3489 binaries: ["foo"],
3490 }
3491
3492 apex_key {
3493 name: "myapex.key",
3494 public_key: "testkey.avbpubkey",
3495 private_key: "testkey.pem",
3496 }
3497
3498 cc_binary {
3499 name: "foo",
3500 product_available: true,
3501 apex_available: ["myapex"],
3502 srcs: ["foo.cpp"],
3503 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003504 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003505
3506 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003507 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003508 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3509 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3510 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3511 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3512}
3513
Jooyung Han8e5685d2020-09-21 11:02:57 +09003514func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003515 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003516 testCases := []struct {
3517 name string
3518 additionalProp string
3519 }{
3520 {"system apex with prebuilt_firmware", ""},
3521 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3522 }
3523 for _, tc := range testCases {
3524 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003525 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003526 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003527 apex {
3528 name: "myapex",
3529 key: "myapex.key",
3530 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003531 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003532 `+tc.additionalProp+`
3533 }
3534 apex_key {
3535 name: "myapex.key",
3536 public_key: "testkey.avbpubkey",
3537 private_key: "testkey.pem",
3538 }
3539 prebuilt_firmware {
3540 name: "myfirmware",
3541 src: "myfirmware.bin",
3542 filename_from_src: true,
3543 `+tc.additionalProp+`
3544 }
3545 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003546 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003547 "etc/firmware/myfirmware.bin",
3548 })
3549 })
3550 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003551}
3552
Jooyung Hanefb184e2020-06-25 17:14:25 +09003553func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003554 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003555 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003556 apex {
3557 name: "myapex",
3558 key: "myapex.key",
3559 vendor: true,
3560 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003561 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003562 }
3563
3564 apex_key {
3565 name: "myapex.key",
3566 public_key: "testkey.avbpubkey",
3567 private_key: "testkey.pem",
3568 }
3569
3570 cc_library {
3571 name: "mylib",
3572 vendor_available: true,
3573 }
3574 `)
3575
Jooyung Hana0503a52023-08-23 13:12:50 +09003576 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003577 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003578 name := apexBundle.BaseModuleName()
3579 prefix := "TARGET_"
3580 var builder strings.Builder
3581 data.Custom(&builder, name, prefix, "", data)
3582 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003583 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 +09003584}
3585
Jooyung Han2ed99d02020-06-24 23:26:26 +09003586func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003587 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003588 apex {
3589 name: "myapex",
3590 key: "myapex.key",
3591 vintf_fragments: ["fragment.xml"],
3592 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003593 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003594 }
3595 apex_key {
3596 name: "myapex.key",
3597 public_key: "testkey.avbpubkey",
3598 private_key: "testkey.pem",
3599 }
3600 cc_binary {
3601 name: "mybin",
3602 }
3603 `)
3604
Jooyung Hana0503a52023-08-23 13:12:50 +09003605 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003606 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003607 name := apexBundle.BaseModuleName()
3608 prefix := "TARGET_"
3609 var builder strings.Builder
3610 data.Custom(&builder, name, prefix, "", data)
3611 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003612 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003613 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003614}
3615
Jiyong Park16e91a02018-12-20 18:18:08 +09003616func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003617 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003618 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003619 apex {
3620 name: "myapex",
3621 key: "myapex.key",
3622 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003623 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003624 }
3625
3626 apex_key {
3627 name: "myapex.key",
3628 public_key: "testkey.avbpubkey",
3629 private_key: "testkey.pem",
3630 }
3631
3632 cc_library {
3633 name: "mylib",
3634 srcs: ["mylib.cpp"],
3635 system_shared_libs: [],
3636 stl: "none",
3637 stubs: {
3638 versions: ["1", "2", "3"],
3639 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003640 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003641 }
3642
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003643 rust_ffi {
3644 name: "libmylib_rs",
3645 crate_name: "mylib_rs",
3646 srcs: ["mylib.rs"],
3647 stubs: {
3648 versions: ["1", "2", "3"],
3649 },
3650 apex_available: ["myapex"],
3651 }
3652
Jiyong Park16e91a02018-12-20 18:18:08 +09003653 cc_binary {
3654 name: "not_in_apex",
3655 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003656 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003657 static_executable: true,
3658 system_shared_libs: [],
3659 stl: "none",
3660 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003661 `)
3662
Colin Cross7113d202019-11-20 16:39:12 -08003663 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003664
3665 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003666 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003667 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003668}
Jiyong Park9335a262018-12-24 11:31:58 +09003669
3670func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003671 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003672 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003673 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003674 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003675 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003676 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003677 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003678 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003679 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003680 }
3681
3682 cc_library {
3683 name: "mylib",
3684 srcs: ["mylib.cpp"],
3685 system_shared_libs: [],
3686 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003687 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003688 }
3689
3690 apex_key {
3691 name: "myapex.key",
3692 public_key: "testkey.avbpubkey",
3693 private_key: "testkey.pem",
3694 }
3695
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003696 android_app_certificate {
3697 name: "myapex.certificate",
3698 certificate: "testkey",
3699 }
3700
3701 android_app_certificate {
3702 name: "myapex.certificate.override",
3703 certificate: "testkey.override",
3704 }
3705
Jiyong Park9335a262018-12-24 11:31:58 +09003706 `)
3707
3708 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003709 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003710
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003711 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3712 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003713 "vendor/foo/devkeys/testkey.avbpubkey")
3714 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003715 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3716 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003717 "vendor/foo/devkeys/testkey.pem")
3718 }
3719
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003720 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003721 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003722 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003723 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003724 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003725 }
3726}
Jiyong Park58e364a2019-01-19 19:24:06 +09003727
Jooyung Hanf121a652019-12-17 14:30:11 +09003728func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003729 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003730 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003731 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003732 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003733 apex {
3734 name: "myapex",
3735 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003736 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003737 }
3738 apex_key {
3739 name: "myapex.key",
3740 public_key: "testkey.avbpubkey",
3741 private_key: "testkey.pem",
3742 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003743 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003744 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3745 if actual := rule.Args["certificates"]; actual != expected {
3746 t.Errorf("certificates should be %q, not %q", expected, actual)
3747 }
3748 })
3749 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003750 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003751 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003752 apex {
3753 name: "myapex_keytest",
3754 key: "myapex.key",
3755 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003756 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003757 }
3758 apex_key {
3759 name: "myapex.key",
3760 public_key: "testkey.avbpubkey",
3761 private_key: "testkey.pem",
3762 }
3763 android_app_certificate {
3764 name: "myapex.certificate.override",
3765 certificate: "testkey.override",
3766 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003767 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003768 expected := "testkey.override.x509.pem testkey.override.pk8"
3769 if actual := rule.Args["certificates"]; actual != expected {
3770 t.Errorf("certificates should be %q, not %q", expected, actual)
3771 }
3772 })
3773 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003774 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003775 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003776 apex {
3777 name: "myapex",
3778 key: "myapex.key",
3779 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003780 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003781 }
3782 apex_key {
3783 name: "myapex.key",
3784 public_key: "testkey.avbpubkey",
3785 private_key: "testkey.pem",
3786 }
3787 android_app_certificate {
3788 name: "myapex.certificate",
3789 certificate: "testkey",
3790 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003791 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003792 expected := "testkey.x509.pem testkey.pk8"
3793 if actual := rule.Args["certificates"]; actual != expected {
3794 t.Errorf("certificates should be %q, not %q", expected, actual)
3795 }
3796 })
3797 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003799 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003800 apex {
3801 name: "myapex_keytest",
3802 key: "myapex.key",
3803 file_contexts: ":myapex-file_contexts",
3804 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003805 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003806 }
3807 apex_key {
3808 name: "myapex.key",
3809 public_key: "testkey.avbpubkey",
3810 private_key: "testkey.pem",
3811 }
3812 android_app_certificate {
3813 name: "myapex.certificate.override",
3814 certificate: "testkey.override",
3815 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003816 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003817 expected := "testkey.override.x509.pem testkey.override.pk8"
3818 if actual := rule.Args["certificates"]; actual != expected {
3819 t.Errorf("certificates should be %q, not %q", expected, actual)
3820 }
3821 })
3822 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003823 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003824 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003825 apex {
3826 name: "myapex",
3827 key: "myapex.key",
3828 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003829 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003830 }
3831 apex_key {
3832 name: "myapex.key",
3833 public_key: "testkey.avbpubkey",
3834 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003835 }`,
3836 android.MockFS{
3837 "vendor/foo/devkeys/testkey.x509.pem": nil,
3838 }.AddToFixture(),
3839 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003840 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003841 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3842 if actual := rule.Args["certificates"]; actual != expected {
3843 t.Errorf("certificates should be %q, not %q", expected, actual)
3844 }
3845 })
3846 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003847 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003848 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003849 apex {
3850 name: "myapex_keytest",
3851 key: "myapex.key",
3852 file_contexts: ":myapex-file_contexts",
3853 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003854 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003855 }
3856 apex_key {
3857 name: "myapex.key",
3858 public_key: "testkey.avbpubkey",
3859 private_key: "testkey.pem",
3860 }
3861 android_app_certificate {
3862 name: "myapex.certificate.override",
3863 certificate: "testkey.override",
3864 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003865 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003866 expected := "testkey.override.x509.pem testkey.override.pk8"
3867 if actual := rule.Args["certificates"]; actual != expected {
3868 t.Errorf("certificates should be %q, not %q", expected, actual)
3869 }
3870 })
3871}
3872
Jiyong Park58e364a2019-01-19 19:24:06 +09003873func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003874 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003875 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003876 apex {
3877 name: "myapex",
3878 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003879 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003880 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003881 }
3882
3883 apex {
3884 name: "otherapex",
3885 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003886 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003887 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003888 }
3889
3890 apex_key {
3891 name: "myapex.key",
3892 public_key: "testkey.avbpubkey",
3893 private_key: "testkey.pem",
3894 }
3895
3896 cc_library {
3897 name: "mylib",
3898 srcs: ["mylib.cpp"],
3899 system_shared_libs: [],
3900 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003901 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003902 "myapex",
3903 "otherapex",
3904 ],
Jooyung Han24282772020-03-21 23:20:55 +09003905 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003906 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003907 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003908 cc_library {
3909 name: "mylib2",
3910 srcs: ["mylib.cpp"],
3911 system_shared_libs: [],
3912 stl: "none",
3913 apex_available: [
3914 "myapex",
3915 "otherapex",
3916 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003917 static_libs: ["mylib3"],
3918 recovery_available: true,
3919 min_sdk_version: "29",
3920 }
3921 cc_library {
3922 name: "mylib3",
3923 srcs: ["mylib.cpp"],
3924 system_shared_libs: [],
3925 stl: "none",
3926 apex_available: [
3927 "myapex",
3928 "otherapex",
3929 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003930 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003931 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003932 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003933 `)
3934
Jooyung Hanc87a0592020-03-02 17:44:33 +09003935 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003936 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003937 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003938
Vinh Tranf9754732023-01-19 22:41:46 -05003939 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003940 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003941 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003942
Vinh Tranf9754732023-01-19 22:41:46 -05003943 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003944 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003945 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003946
Colin Crossaede88c2020-08-11 12:17:01 -07003947 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3948 // each variant defines additional macros to distinguish which apex variant it is built for
3949
3950 // non-APEX variant does not have __ANDROID_APEX__ defined
3951 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3952 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3953
Vinh Tranf9754732023-01-19 22:41:46 -05003954 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003955 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3956 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003957
Jooyung Hanc87a0592020-03-02 17:44:33 +09003958 // non-APEX variant does not have __ANDROID_APEX__ defined
3959 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3960 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3961
Vinh Tranf9754732023-01-19 22:41:46 -05003962 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003963 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003964 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003965}
Jiyong Park7e636d02019-01-28 16:16:54 +09003966
3967func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003968 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003969 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003970 apex {
3971 name: "myapex",
3972 key: "myapex.key",
3973 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003974 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003975 }
3976
3977 apex_key {
3978 name: "myapex.key",
3979 public_key: "testkey.avbpubkey",
3980 private_key: "testkey.pem",
3981 }
3982
3983 cc_library_headers {
3984 name: "mylib_headers",
3985 export_include_dirs: ["my_include"],
3986 system_shared_libs: [],
3987 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003988 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003989 }
3990
3991 cc_library {
3992 name: "mylib",
3993 srcs: ["mylib.cpp"],
3994 system_shared_libs: [],
3995 stl: "none",
3996 header_libs: ["mylib_headers"],
3997 export_header_lib_headers: ["mylib_headers"],
3998 stubs: {
3999 versions: ["1", "2", "3"],
4000 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004001 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004002 }
4003
4004 cc_library {
4005 name: "otherlib",
4006 srcs: ["mylib.cpp"],
4007 system_shared_libs: [],
4008 stl: "none",
4009 shared_libs: ["mylib"],
4010 }
4011 `)
4012
Colin Cross7113d202019-11-20 16:39:12 -08004013 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09004014
4015 // Ensure that the include path of the header lib is exported to 'otherlib'
4016 ensureContains(t, cFlags, "-Imy_include")
4017}
Alex Light9670d332019-01-29 18:07:33 -08004018
Jiyong Park7cd10e32020-01-14 09:22:18 +09004019type fileInApex struct {
4020 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00004021 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09004022 isLink bool
4023}
4024
Jooyung Han1724d582022-12-21 10:17:44 +09004025func (f fileInApex) String() string {
4026 return f.src + ":" + f.path
4027}
4028
4029func (f fileInApex) match(expectation string) bool {
4030 parts := strings.Split(expectation, ":")
4031 if len(parts) == 1 {
4032 match, _ := path.Match(parts[0], f.path)
4033 return match
4034 }
4035 if len(parts) == 2 {
4036 matchSrc, _ := path.Match(parts[0], f.src)
4037 matchDst, _ := path.Match(parts[1], f.path)
4038 return matchSrc && matchDst
4039 }
4040 panic("invalid expected file specification: " + expectation)
4041}
4042
Jooyung Hana57af4a2020-01-23 05:36:59 +00004043func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09004044 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09004045 module := ctx.ModuleForTests(moduleName, variant)
4046 apexRule := module.MaybeRule("apexRule")
4047 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09004048 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004049 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 for _, cmd := range strings.Split(copyCmds, "&&") {
4051 cmd = strings.TrimSpace(cmd)
4052 if cmd == "" {
4053 continue
4054 }
4055 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00004056 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09004057 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09004058 switch terms[0] {
4059 case "mkdir":
4060 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09004061 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004062 t.Fatal("copyCmds contains invalid cp command", cmd)
4063 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004064 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004065 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004066 isLink = false
4067 case "ln":
4068 if len(terms) != 3 && len(terms) != 4 {
4069 // ln LINK TARGET or ln -s LINK TARGET
4070 t.Fatal("copyCmds contains invalid ln command", cmd)
4071 }
4072 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004073 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004074 isLink = true
4075 default:
4076 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4077 }
4078 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004079 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004080 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004081 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 }
Jooyung Han1724d582022-12-21 10:17:44 +09004083 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004084 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004085 }
4086 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004087 return ret
4088}
4089
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004090func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004091 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004092 var failed bool
4093 var surplus []string
4094 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004095 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004096 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004097 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004098 if file.match(expected) {
4099 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004100 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004101 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004102 }
4103 }
Jooyung Han1724d582022-12-21 10:17:44 +09004104 if !matchFound {
4105 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004106 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004107 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004108
Jooyung Han31c470b2019-10-18 16:26:59 +09004109 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004110 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 t.Log("surplus files", surplus)
4112 failed = true
4113 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004114
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004115 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004116 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004117 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004118 if !filesMatched[expected] {
4119 missing = append(missing, expected)
4120 }
4121 }
4122 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004123 t.Log("missing files", missing)
4124 failed = true
4125 }
4126 if failed {
4127 t.Fail()
4128 }
4129}
4130
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004131func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4132 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4133}
4134
4135func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004136 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004137 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4138 if deapexer.Output != nil {
4139 outputs = append(outputs, deapexer.Output.String())
4140 }
4141 for _, output := range deapexer.ImplicitOutputs {
4142 outputs = append(outputs, output.String())
4143 }
4144 actualFiles := make([]fileInApex, 0, len(outputs))
4145 for _, output := range outputs {
4146 dir := "/deapexer/"
4147 pos := strings.LastIndex(output, dir)
4148 if pos == -1 {
4149 t.Fatal("Unknown deapexer output ", output)
4150 }
4151 path := output[pos+len(dir):]
4152 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4153 }
4154 assertFileListEquals(t, files, actualFiles)
4155}
4156
Jooyung Han39edb6c2019-11-06 16:53:07 +09004157func vndkLibrariesTxtFiles(vers ...string) (result string) {
4158 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004159 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004160 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004161 prebuilt_etc {
4162 name: "` + txt + `.libraries.` + v + `.txt",
4163 src: "dummy.txt",
4164 }
4165 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004166 }
4167 }
4168 return
4169}
4170
Jooyung Han344d5432019-08-23 11:17:39 +09004171func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004172 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004173 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004174 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004175 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004176 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004177 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004178 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004179 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004180 }
4181
4182 apex_key {
4183 name: "myapex.key",
4184 public_key: "testkey.avbpubkey",
4185 private_key: "testkey.pem",
4186 }
4187
Jooyung Han31c470b2019-10-18 16:26:59 +09004188 vndk_prebuilt_shared {
4189 name: "libvndk27",
4190 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004191 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004192 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004193 vndk: {
4194 enabled: true,
4195 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004196 target_arch: "arm64",
4197 arch: {
4198 arm: {
4199 srcs: ["libvndk27_arm.so"],
4200 },
4201 arm64: {
4202 srcs: ["libvndk27_arm64.so"],
4203 },
4204 },
Colin Cross2807f002021-03-02 10:15:29 -08004205 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004206 }
4207
4208 vndk_prebuilt_shared {
4209 name: "libvndk27",
4210 version: "27",
4211 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004212 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004213 vndk: {
4214 enabled: true,
4215 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004216 target_arch: "x86_64",
4217 arch: {
4218 x86: {
4219 srcs: ["libvndk27_x86.so"],
4220 },
4221 x86_64: {
4222 srcs: ["libvndk27_x86_64.so"],
4223 },
4224 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004225 }
4226 `+vndkLibrariesTxtFiles("27"),
4227 withFiles(map[string][]byte{
4228 "libvndk27_arm.so": nil,
4229 "libvndk27_arm64.so": nil,
4230 "libvndk27_x86.so": nil,
4231 "libvndk27_x86_64.so": nil,
4232 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004233
Jooyung Hana0503a52023-08-23 13:12:50 +09004234 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004235 "lib/libvndk27_arm.so",
4236 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004237 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004238 })
Jooyung Han344d5432019-08-23 11:17:39 +09004239}
4240
Jooyung Han90eee022019-10-01 20:02:42 +09004241func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004242 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004243 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004244 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004245 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004246 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004247 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004248 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004249 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004250 }
4251 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004252 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004253 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004254 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004255 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004256 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004257 }
4258 apex_key {
4259 name: "myapex.key",
4260 public_key: "testkey.avbpubkey",
4261 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004262 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004263
4264 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004265 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004266 apexManifestRule := module.Rule("apexManifestRule")
4267 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004268 }
4269
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004270 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004271 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004272}
4273
Jooyung Han344d5432019-08-23 11:17:39 +09004274func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004275 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004276 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004277 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004278 name: "com.android.vndk.v30",
4279 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004280 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004281 native_bridge_supported: true,
4282 }
4283
4284 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004285 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004286 public_key: "testkey.avbpubkey",
4287 private_key: "testkey.pem",
4288 }
4289
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004290 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004291 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004292 version: "30",
4293 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004294 srcs: ["mylib.cpp"],
4295 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004296 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004297 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004298 vndk: {
4299 enabled: true,
4300 },
Jooyung Han344d5432019-08-23 11:17:39 +09004301 }
4302 `)
4303}
4304
Jooyung Han31c470b2019-10-18 16:26:59 +09004305func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004306 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004307 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004308 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004309 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004310 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004311 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004312 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004313 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004314 }
4315
4316 apex_key {
4317 name: "myapex.key",
4318 public_key: "testkey.avbpubkey",
4319 private_key: "testkey.pem",
4320 }
4321
4322 vndk_prebuilt_shared {
4323 name: "libvndk27",
4324 version: "27",
4325 target_arch: "arm",
4326 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004327 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004328 vndk: {
4329 enabled: true,
4330 },
4331 arch: {
4332 arm: {
4333 srcs: ["libvndk27.so"],
4334 }
4335 },
4336 }
4337
4338 vndk_prebuilt_shared {
4339 name: "libvndk27",
4340 version: "27",
4341 target_arch: "arm",
4342 binder32bit: true,
4343 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004344 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004345 vndk: {
4346 enabled: true,
4347 },
4348 arch: {
4349 arm: {
4350 srcs: ["libvndk27binder32.so"],
4351 }
4352 },
Colin Cross2807f002021-03-02 10:15:29 -08004353 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004354 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004355 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004356 withFiles(map[string][]byte{
4357 "libvndk27.so": nil,
4358 "libvndk27binder32.so": nil,
4359 }),
4360 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004361 android.FixtureModifyConfig(func(config android.Config) {
4362 target := android.Target{
4363 Os: android.Android,
4364 Arch: android.Arch{
4365 ArchType: android.Arm,
4366 ArchVariant: "armv7-a-neon",
4367 Abi: []string{"armeabi-v7a"},
4368 },
4369 NativeBridge: android.NativeBridgeDisabled,
4370 NativeBridgeHostArchName: "",
4371 NativeBridgeRelativePath: "",
4372 }
4373 config.Targets[android.Android] = []android.Target{target}
4374 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004375 }),
4376 )
4377
Jooyung Hana0503a52023-08-23 13:12:50 +09004378 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004379 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004380 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004381 })
4382}
4383
Jooyung Hane1633032019-08-01 17:41:43 +09004384func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004385 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004386 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004387 apex {
4388 name: "myapex_nodep",
4389 key: "myapex.key",
4390 native_shared_libs: ["lib_nodep"],
4391 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004392 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004393 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004394 }
4395
4396 apex {
4397 name: "myapex_dep",
4398 key: "myapex.key",
4399 native_shared_libs: ["lib_dep"],
4400 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004401 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004402 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004403 }
4404
4405 apex {
4406 name: "myapex_provider",
4407 key: "myapex.key",
4408 native_shared_libs: ["libfoo"],
4409 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004410 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004411 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004412 }
4413
4414 apex {
4415 name: "myapex_selfcontained",
4416 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004417 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004418 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004419 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004420 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004421 }
4422
4423 apex_key {
4424 name: "myapex.key",
4425 public_key: "testkey.avbpubkey",
4426 private_key: "testkey.pem",
4427 }
4428
4429 cc_library {
4430 name: "lib_nodep",
4431 srcs: ["mylib.cpp"],
4432 system_shared_libs: [],
4433 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004434 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004435 }
4436
4437 cc_library {
4438 name: "lib_dep",
4439 srcs: ["mylib.cpp"],
4440 shared_libs: ["libfoo"],
4441 system_shared_libs: [],
4442 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004443 apex_available: [
4444 "myapex_dep",
4445 "myapex_provider",
4446 "myapex_selfcontained",
4447 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004448 }
4449
4450 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004451 name: "lib_dep_on_bar",
4452 srcs: ["mylib.cpp"],
4453 shared_libs: ["libbar"],
4454 system_shared_libs: [],
4455 stl: "none",
4456 apex_available: [
4457 "myapex_selfcontained",
4458 ],
4459 }
4460
4461
4462 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004463 name: "libfoo",
4464 srcs: ["mytest.cpp"],
4465 stubs: {
4466 versions: ["1"],
4467 },
4468 system_shared_libs: [],
4469 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004470 apex_available: [
4471 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004472 ],
4473 }
4474
4475 cc_library {
4476 name: "libbar",
4477 srcs: ["mytest.cpp"],
4478 stubs: {
4479 versions: ["1"],
4480 },
4481 system_shared_libs: [],
4482 stl: "none",
4483 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004484 "myapex_selfcontained",
4485 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004486 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004487
Jooyung Hane1633032019-08-01 17:41:43 +09004488 `)
4489
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004490 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004491 var provideNativeLibs, requireNativeLibs []string
4492
Jooyung Hana0503a52023-08-23 13:12:50 +09004493 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004494 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4495 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004496 ensureListEmpty(t, provideNativeLibs)
4497 ensureListEmpty(t, requireNativeLibs)
4498
Jooyung Hana0503a52023-08-23 13:12:50 +09004499 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004500 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4501 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004502 ensureListEmpty(t, provideNativeLibs)
4503 ensureListContains(t, requireNativeLibs, "libfoo.so")
4504
Jooyung Hana0503a52023-08-23 13:12:50 +09004505 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004506 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4507 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004508 ensureListContains(t, provideNativeLibs, "libfoo.so")
4509 ensureListEmpty(t, requireNativeLibs)
4510
Jooyung Hana0503a52023-08-23 13:12:50 +09004511 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004512 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4513 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004514 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004515 ensureListEmpty(t, requireNativeLibs)
4516}
4517
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004518func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004519 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004520 ctx := testApex(t, `
4521 apex {
4522 name: "myapex",
4523 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004524 native_shared_libs: ["mylib"],
4525 updatable: false,
4526 }
4527
4528 apex_key {
4529 name: "myapex.key",
4530 public_key: "testkey.avbpubkey",
4531 private_key: "testkey.pem",
4532 }
4533
4534 cc_library {
4535 name: "mylib",
4536 srcs: ["mylib.cpp"],
4537 system_shared_libs: [],
4538 stl: "none",
4539 apex_available: [
4540 "//apex_available:platform",
4541 "myapex",
4542 ],
4543 }
4544 `, android.FixtureMergeEnv(map[string]string{
4545 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4546 }))
4547
Jooyung Hana0503a52023-08-23 13:12:50 +09004548 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004549 apexManifestRule := module.Rule("apexManifestRule")
4550 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4551}
4552
Vinh Tran8f5310f2022-10-07 18:16:47 -04004553func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004554 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004555 testCases := []struct {
4556 compileMultiLibProp string
4557 containedLibs []string
4558 notContainedLibs []string
4559 }{
4560 {
4561 containedLibs: []string{
4562 "image.apex/lib64/mylib.so",
4563 "image.apex/lib/mylib.so",
4564 },
4565 compileMultiLibProp: `compile_multilib: "both",`,
4566 },
4567 {
4568 containedLibs: []string{"image.apex/lib64/mylib.so"},
4569 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4570 compileMultiLibProp: `compile_multilib: "first",`,
4571 },
4572 {
4573 containedLibs: []string{"image.apex/lib64/mylib.so"},
4574 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4575 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4576 },
4577 {
4578 containedLibs: []string{"image.apex/lib64/mylib.so"},
4579 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4580 compileMultiLibProp: `compile_multilib: "64",`,
4581 },
4582 {
4583 containedLibs: []string{"image.apex/lib/mylib.so"},
4584 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4585 compileMultiLibProp: `compile_multilib: "32",`,
4586 },
4587 }
4588 for _, testCase := range testCases {
4589 ctx := testApex(t, fmt.Sprintf(`
4590 apex {
4591 name: "myapex",
4592 key: "myapex.key",
4593 %s
4594 native_shared_libs: ["mylib"],
4595 updatable: false,
4596 }
4597 apex_key {
4598 name: "myapex.key",
4599 public_key: "testkey.avbpubkey",
4600 private_key: "testkey.pem",
4601 }
4602 cc_library {
4603 name: "mylib",
4604 srcs: ["mylib.cpp"],
4605 apex_available: [
4606 "//apex_available:platform",
4607 "myapex",
4608 ],
4609 }
4610 `, testCase.compileMultiLibProp),
4611 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004612 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004613 apexRule := module.Rule("apexRule")
4614 copyCmds := apexRule.Args["copy_commands"]
4615 for _, containedLib := range testCase.containedLibs {
4616 ensureContains(t, copyCmds, containedLib)
4617 }
4618 for _, notContainedLib := range testCase.notContainedLibs {
4619 ensureNotContains(t, copyCmds, notContainedLib)
4620 }
4621 }
4622}
4623
Alex Light0851b882019-02-07 13:20:53 -08004624func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004625 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004626 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004627 apex {
4628 name: "myapex",
4629 key: "myapex.key",
4630 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004631 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004632 }
4633
4634 apex_key {
4635 name: "myapex.key",
4636 public_key: "testkey.avbpubkey",
4637 private_key: "testkey.pem",
4638 }
4639
4640 cc_library {
4641 name: "mylib_common",
4642 srcs: ["mylib.cpp"],
4643 system_shared_libs: [],
4644 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004645 apex_available: [
4646 "//apex_available:platform",
4647 "myapex",
4648 ],
Alex Light0851b882019-02-07 13:20:53 -08004649 }
4650 `)
4651
Jooyung Hana0503a52023-08-23 13:12:50 +09004652 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004653 apexRule := module.Rule("apexRule")
4654 copyCmds := apexRule.Args["copy_commands"]
4655
4656 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4657 t.Log("Apex was a test apex!")
4658 t.Fail()
4659 }
4660 // Ensure that main rule creates an output
4661 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4662
4663 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004664 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004665
4666 // Ensure that both direct and indirect deps are copied into apex
4667 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4668
Colin Cross7113d202019-11-20 16:39:12 -08004669 // Ensure that the platform variant ends with _shared
4670 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004671
Colin Cross56a83212020-09-15 18:30:11 -07004672 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004673 t.Log("Found mylib_common not in any apex!")
4674 t.Fail()
4675 }
4676}
4677
4678func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004679 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004680 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004681 apex_test {
4682 name: "myapex",
4683 key: "myapex.key",
4684 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004685 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004686 }
4687
4688 apex_key {
4689 name: "myapex.key",
4690 public_key: "testkey.avbpubkey",
4691 private_key: "testkey.pem",
4692 }
4693
4694 cc_library {
4695 name: "mylib_common_test",
4696 srcs: ["mylib.cpp"],
4697 system_shared_libs: [],
4698 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004699 // TODO: remove //apex_available:platform
4700 apex_available: [
4701 "//apex_available:platform",
4702 "myapex",
4703 ],
Alex Light0851b882019-02-07 13:20:53 -08004704 }
4705 `)
4706
Jooyung Hana0503a52023-08-23 13:12:50 +09004707 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004708 apexRule := module.Rule("apexRule")
4709 copyCmds := apexRule.Args["copy_commands"]
4710
4711 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4712 t.Log("Apex was not a test apex!")
4713 t.Fail()
4714 }
4715 // Ensure that main rule creates an output
4716 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4717
4718 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004719 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004720
4721 // Ensure that both direct and indirect deps are copied into apex
4722 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4723
Colin Cross7113d202019-11-20 16:39:12 -08004724 // Ensure that the platform variant ends with _shared
4725 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004726}
4727
Jooyung Han85707de2023-12-01 14:21:13 +09004728func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004729 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004730 ctx := testApex(t, `
4731 apex {
4732 name: "myapex",
4733 key: "myapex.key",
4734 updatable: false,
4735 binaries: ["mybin"],
4736 }
4737 apex {
4738 name: "myvendorapex",
4739 key: "myapex.key",
4740 file_contexts: "myvendorapex_file_contexts",
4741 vendor: true,
4742 updatable: false,
4743 binaries: ["mybin"],
4744 }
4745 apex_key {
4746 name: "myapex.key",
4747 public_key: "testkey.avbpubkey",
4748 private_key: "testkey.pem",
4749 }
4750 cc_binary {
4751 name: "mybin",
4752 vendor_available: true,
4753 system_shared_libs: [],
4754 stl: "none",
4755 shared_libs: ["libz"],
4756 apex_available: ["//apex_available:anyapex"],
4757 }
4758 cc_library {
4759 name: "libz",
4760 vendor_available: true,
4761 system_shared_libs: [],
4762 stl: "none",
4763 stubs: {
4764 versions: ["28", "30"],
4765 },
4766 target: {
4767 vendor: {
4768 no_stubs: true,
4769 },
4770 },
4771 }
4772 `, withFiles(map[string][]byte{
4773 "myvendorapex_file_contexts": nil,
4774 }))
4775
4776 // libz provides stubs for core variant.
4777 {
4778 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4779 "bin/mybin",
4780 })
4781 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4782 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4783 }
4784 // libz doesn't provide stubs for vendor variant.
4785 {
4786 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4787 "bin/mybin",
4788 "lib64/libz.so",
4789 })
4790 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4791 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4792 }
4793}
4794
Alex Light9670d332019-01-29 18:07:33 -08004795func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004796 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004797 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004798 apex {
4799 name: "myapex",
4800 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004801 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004802 multilib: {
4803 first: {
4804 native_shared_libs: ["mylib_common"],
4805 }
4806 },
4807 target: {
4808 android: {
4809 multilib: {
4810 first: {
4811 native_shared_libs: ["mylib"],
4812 }
4813 }
4814 },
4815 host: {
4816 multilib: {
4817 first: {
4818 native_shared_libs: ["mylib2"],
4819 }
4820 }
4821 }
4822 }
4823 }
4824
4825 apex_key {
4826 name: "myapex.key",
4827 public_key: "testkey.avbpubkey",
4828 private_key: "testkey.pem",
4829 }
4830
4831 cc_library {
4832 name: "mylib",
4833 srcs: ["mylib.cpp"],
4834 system_shared_libs: [],
4835 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004836 // TODO: remove //apex_available:platform
4837 apex_available: [
4838 "//apex_available:platform",
4839 "myapex",
4840 ],
Alex Light9670d332019-01-29 18:07:33 -08004841 }
4842
4843 cc_library {
4844 name: "mylib_common",
4845 srcs: ["mylib.cpp"],
4846 system_shared_libs: [],
4847 stl: "none",
4848 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004849 // TODO: remove //apex_available:platform
4850 apex_available: [
4851 "//apex_available:platform",
4852 "myapex",
4853 ],
Alex Light9670d332019-01-29 18:07:33 -08004854 }
4855
4856 cc_library {
4857 name: "mylib2",
4858 srcs: ["mylib.cpp"],
4859 system_shared_libs: [],
4860 stl: "none",
4861 compile_multilib: "first",
4862 }
4863 `)
4864
Jooyung Hana0503a52023-08-23 13:12:50 +09004865 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004866 copyCmds := apexRule.Args["copy_commands"]
4867
4868 // Ensure that main rule creates an output
4869 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4870
4871 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004872 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4873 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4874 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004875
4876 // Ensure that both direct and indirect deps are copied into apex
4877 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4878 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4879 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4880
Colin Cross7113d202019-11-20 16:39:12 -08004881 // Ensure that the platform variant ends with _shared
4882 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4883 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004885}
Jiyong Park04480cf2019-02-06 00:16:29 +09004886
Jiyong Park59140302020-12-14 18:44:04 +09004887func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004888 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004889 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004890 apex {
4891 name: "myapex",
4892 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004893 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004894 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004895 arch: {
4896 arm64: {
4897 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004898 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004899 },
4900 x86_64: {
4901 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004902 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004903 },
4904 }
4905 }
4906
4907 apex_key {
4908 name: "myapex.key",
4909 public_key: "testkey.avbpubkey",
4910 private_key: "testkey.pem",
4911 }
4912
4913 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004914 name: "mylib.generic",
4915 srcs: ["mylib.cpp"],
4916 system_shared_libs: [],
4917 stl: "none",
4918 // TODO: remove //apex_available:platform
4919 apex_available: [
4920 "//apex_available:platform",
4921 "myapex",
4922 ],
4923 }
4924
4925 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004926 name: "mylib.arm64",
4927 srcs: ["mylib.cpp"],
4928 system_shared_libs: [],
4929 stl: "none",
4930 // TODO: remove //apex_available:platform
4931 apex_available: [
4932 "//apex_available:platform",
4933 "myapex",
4934 ],
4935 }
4936
4937 cc_library {
4938 name: "mylib.x64",
4939 srcs: ["mylib.cpp"],
4940 system_shared_libs: [],
4941 stl: "none",
4942 // TODO: remove //apex_available:platform
4943 apex_available: [
4944 "//apex_available:platform",
4945 "myapex",
4946 ],
4947 }
4948 `)
4949
Jooyung Hana0503a52023-08-23 13:12:50 +09004950 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004951 copyCmds := apexRule.Args["copy_commands"]
4952
4953 // Ensure that apex variant is created for the direct dep
4954 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004955 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004956 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4957
4958 // Ensure that both direct and indirect deps are copied into apex
4959 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4960 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4961}
4962
Jiyong Park04480cf2019-02-06 00:16:29 +09004963func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004964 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004965 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004966 apex {
4967 name: "myapex",
4968 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004969 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004970 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004971 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004972 }
4973
4974 apex_key {
4975 name: "myapex.key",
4976 public_key: "testkey.avbpubkey",
4977 private_key: "testkey.pem",
4978 }
4979
4980 sh_binary {
4981 name: "myscript",
4982 src: "mylib.cpp",
4983 filename: "myscript.sh",
4984 sub_dir: "script",
4985 }
4986 `)
4987
Jooyung Hana0503a52023-08-23 13:12:50 +09004988 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004989 copyCmds := apexRule.Args["copy_commands"]
4990
4991 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4992}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004993
Jooyung Han91df2082019-11-20 01:49:42 +09004994func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004995 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004996 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004997 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004998 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004999 {"", "system"},
5000 {"product_specific: true", "product"},
5001 {"soc_specific: true", "vendor"},
5002 {"proprietary: true", "vendor"},
5003 {"vendor: true", "vendor"},
5004 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005005 }
5006 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005007 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005008 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005009 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005010 apex {
5011 name: "myapex",
5012 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005013 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005014 `+tc.propName+`
5015 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005016
Jooyung Han91df2082019-11-20 01:49:42 +09005017 apex_key {
5018 name: "myapex.key",
5019 public_key: "testkey.avbpubkey",
5020 private_key: "testkey.pem",
5021 }
5022 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005023
Jooyung Hana0503a52023-08-23 13:12:50 +09005024 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08005025 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005026 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005027 if actual != expected {
5028 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5029 }
Jooyung Han91df2082019-11-20 01:49:42 +09005030 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005031 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005032}
Jiyong Park67882562019-03-21 01:11:21 +09005033
Jooyung Han580eb4f2020-06-24 19:33:06 +09005034func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005035 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005036 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 apex {
5038 name: "myapex",
5039 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005040 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005041 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005042
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043 apex_key {
5044 name: "myapex.key",
5045 public_key: "testkey.avbpubkey",
5046 private_key: "testkey.pem",
5047 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005048 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005049 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005050 rule := module.Output("file_contexts")
5051 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5052}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005053
Jooyung Han580eb4f2020-06-24 19:33:06 +09005054func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005055 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005056 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005057 apex {
5058 name: "myapex",
5059 key: "myapex.key",
5060 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005061 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005062 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005063
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 apex_key {
5065 name: "myapex.key",
5066 public_key: "testkey.avbpubkey",
5067 private_key: "testkey.pem",
5068 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005069 `, withFiles(map[string][]byte{
5070 "my_own_file_contexts": nil,
5071 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005072}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005073
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005075 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005076 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077 apex {
5078 name: "myapex",
5079 key: "myapex.key",
5080 product_specific: true,
5081 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005082 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005083 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005084
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 apex_key {
5086 name: "myapex.key",
5087 public_key: "testkey.avbpubkey",
5088 private_key: "testkey.pem",
5089 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005090 `)
5091
Colin Cross1c460562021-02-16 17:55:47 -08005092 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005093 apex {
5094 name: "myapex",
5095 key: "myapex.key",
5096 product_specific: true,
5097 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005098 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005099 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005100
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 apex_key {
5102 name: "myapex.key",
5103 public_key: "testkey.avbpubkey",
5104 private_key: "testkey.pem",
5105 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005106 `, withFiles(map[string][]byte{
5107 "product_specific_file_contexts": nil,
5108 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005109 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005110 rule := module.Output("file_contexts")
5111 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5112}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005113
Jooyung Han580eb4f2020-06-24 19:33:06 +09005114func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005115 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005116 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005117 apex {
5118 name: "myapex",
5119 key: "myapex.key",
5120 product_specific: true,
5121 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005122 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005123 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005124
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 apex_key {
5126 name: "myapex.key",
5127 public_key: "testkey.avbpubkey",
5128 private_key: "testkey.pem",
5129 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005130
Jooyung Han580eb4f2020-06-24 19:33:06 +09005131 filegroup {
5132 name: "my-file-contexts",
5133 srcs: ["product_specific_file_contexts"],
5134 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005135 `, withFiles(map[string][]byte{
5136 "product_specific_file_contexts": nil,
5137 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005138 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005139 rule := module.Output("file_contexts")
5140 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005141}
5142
Jiyong Park67882562019-03-21 01:11:21 +09005143func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005144 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005145 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005146 apex_key {
5147 name: "myapex.key",
5148 public_key: ":my.avbpubkey",
5149 private_key: ":my.pem",
5150 product_specific: true,
5151 }
5152
5153 filegroup {
5154 name: "my.avbpubkey",
5155 srcs: ["testkey2.avbpubkey"],
5156 }
5157
5158 filegroup {
5159 name: "my.pem",
5160 srcs: ["testkey2.pem"],
5161 }
5162 `)
5163
5164 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5165 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005166 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005167 if actual_pubkey != expected_pubkey {
5168 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5169 }
5170 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005171 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005172 if actual_privkey != expected_privkey {
5173 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5174 }
5175}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005176
5177func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005178 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005179 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005180 prebuilt_apex {
5181 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005182 arch: {
5183 arm64: {
5184 src: "myapex-arm64.apex",
5185 },
5186 arm: {
5187 src: "myapex-arm.apex",
5188 },
5189 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005190 }
5191 `)
5192
Wei Li340ee8e2022-03-18 17:33:24 -07005193 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5194 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005195
Jiyong Parkc95714e2019-03-29 14:23:10 +09005196 expectedInput := "myapex-arm64.apex"
5197 if prebuilt.inputApex.String() != expectedInput {
5198 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5199 }
Wei Li340ee8e2022-03-18 17:33:24 -07005200 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5201 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5202 rule := testingModule.Rule("genProvenanceMetaData")
5203 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5204 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5205 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5206 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005207
5208 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5209 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005210}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005211
Paul Duffinc0609c62021-03-01 17:27:16 +00005212func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005213 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005214 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005215 prebuilt_apex {
5216 name: "myapex",
5217 }
5218 `)
5219}
5220
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005221func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005222 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005223 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005224 prebuilt_apex {
5225 name: "myapex",
5226 src: "myapex-arm.apex",
5227 filename: "notmyapex.apex",
5228 }
5229 `)
5230
Wei Li340ee8e2022-03-18 17:33:24 -07005231 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5232 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005233
5234 expected := "notmyapex.apex"
5235 if p.installFilename != expected {
5236 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5237 }
Wei Li340ee8e2022-03-18 17:33:24 -07005238 rule := testingModule.Rule("genProvenanceMetaData")
5239 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5240 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5241 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5242 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005243}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005244
Samiul Islam7c02e262021-09-08 17:48:28 +01005245func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005246 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005247 testApex(t, `
5248 apex_set {
5249 name: "com.company.android.myapex",
5250 apex_name: "com.android.myapex",
5251 set: "company-myapex.apks",
5252 filename: "com.company.android.myapex.apex"
5253 }
5254 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5255
5256 testApex(t, `
5257 apex_set {
5258 name: "com.company.android.myapex",
5259 apex_name: "com.android.myapex",
5260 set: "company-myapex.apks",
5261 filename: "com.company.android.myapex.capex"
5262 }
5263 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5264
5265 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5266 apex_set {
5267 name: "com.company.android.myapex",
5268 apex_name: "com.android.myapex",
5269 set: "company-myapex.apks",
5270 filename: "some-random-suffix"
5271 }
5272 `)
5273}
5274
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005275func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005276 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005277 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005278 prebuilt_apex {
5279 name: "myapex.prebuilt",
5280 src: "myapex-arm.apex",
5281 overrides: [
5282 "myapex",
5283 ],
5284 }
5285 `)
5286
Wei Li340ee8e2022-03-18 17:33:24 -07005287 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5288 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005289
5290 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005291 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005292 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005293 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005294 }
Wei Li340ee8e2022-03-18 17:33:24 -07005295 rule := testingModule.Rule("genProvenanceMetaData")
5296 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5297 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5298 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5299 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005300}
5301
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005302func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005303 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005304 testApex(t, `
5305 prebuilt_apex {
5306 name: "com.company.android.myapex",
5307 apex_name: "com.android.myapex",
5308 src: "company-myapex-arm.apex",
5309 }
5310 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5311
5312 testApex(t, `
5313 apex_set {
5314 name: "com.company.android.myapex",
5315 apex_name: "com.android.myapex",
5316 set: "company-myapex.apks",
5317 }
5318 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5319}
5320
5321func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005322 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005323 _ = android.GroupFixturePreparers(
5324 java.PrepareForTestWithJavaDefaultModules,
5325 PrepareForTestWithApexBuildComponents,
5326 android.FixtureWithRootAndroidBp(`
5327 platform_bootclasspath {
5328 name: "platform-bootclasspath",
5329 fragments: [
5330 {
5331 apex: "com.android.art",
5332 module: "art-bootclasspath-fragment",
5333 },
5334 ],
5335 }
5336
5337 prebuilt_apex {
5338 name: "com.company.android.art",
5339 apex_name: "com.android.art",
5340 src: "com.company.android.art-arm.apex",
5341 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5342 }
5343
Colin Crossd6495802025-01-14 15:50:48 -08005344 prebuilt_apex {
5345 name: "com.android.art",
5346 src: "com.android.art-arm.apex",
5347 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5348 }
5349
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005350 prebuilt_bootclasspath_fragment {
5351 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005352 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005353 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005354 hidden_api: {
5355 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5356 metadata: "my-bootclasspath-fragment/metadata.csv",
5357 index: "my-bootclasspath-fragment/index.csv",
5358 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5359 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5360 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005361 }
5362
5363 java_import {
5364 name: "core-oj",
5365 jars: ["prebuilt.jar"],
5366 }
5367 `),
5368 ).RunTest(t)
5369}
5370
Spandan Das59a4a2b2024-01-09 21:35:56 +00005371// A minimal context object for use with DexJarBuildPath
5372type moduleErrorfTestCtx struct {
5373}
5374
5375func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5376}
5377
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005378func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005379 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005380 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005381 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005382 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5383 // is disabled.
5384 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005385
5386 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5387 // file creation.
5388 java.FixtureConfigureBootJars("platform:foo"),
5389 android.FixtureModifyMockFS(func(fs android.MockFS) {
5390 fs["platform/Android.bp"] = []byte(`
5391 java_library {
5392 name: "foo",
5393 srcs: ["Test.java"],
5394 compile_dex: true,
5395 }
5396 `)
5397 fs["platform/Test.java"] = nil
5398 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005399 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005400
Paul Duffin40a3f652021-07-19 13:11:24 +01005401 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005402 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005403 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005404 var rule android.TestingBuildParams
5405
5406 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5407 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005408 }
5409
Paul Duffin40a3f652021-07-19 13:11:24 +01005410 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5411 t.Helper()
5412 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5413 var rule android.TestingBuildParams
5414
5415 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5416 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5417 }
5418
Paul Duffin89f570a2021-06-16 01:42:33 +01005419 fragment := java.ApexVariantReference{
5420 Apex: proptools.StringPtr("myapex"),
5421 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5422 }
5423
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005424 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005425 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005426 bp := `
5427 prebuilt_apex {
5428 name: "myapex",
5429 arch: {
5430 arm64: {
5431 src: "myapex-arm64.apex",
5432 },
5433 arm: {
5434 src: "myapex-arm.apex",
5435 },
5436 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005437 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5438 }
5439
5440 prebuilt_bootclasspath_fragment {
5441 name: "my-bootclasspath-fragment",
5442 contents: ["libfoo", "libbar"],
5443 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005444 hidden_api: {
5445 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5446 metadata: "my-bootclasspath-fragment/metadata.csv",
5447 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005448 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5449 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5450 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005451 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005452 }
5453
Spandan Das52c01a12024-09-20 01:09:48 +00005454 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005456 public: {
5457 jars: ["libfoo.jar"],
5458 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005459 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005460 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005461 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005462 }
Paul Duffin37856732021-02-26 14:24:15 +00005463
5464 java_sdk_library_import {
5465 name: "libbar",
5466 public: {
5467 jars: ["libbar.jar"],
5468 },
5469 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005470 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005471 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005472 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005473 `
5474
Paul Duffin89f570a2021-06-16 01:42:33 +01005475 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005476
Paul Duffin537ea3d2021-05-14 10:38:00 +01005477 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005478 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005479 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005480 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005481 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005482 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005483 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 })
5485
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005486 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005487 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005488 bp := `
5489 apex_set {
5490 name: "myapex",
5491 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005492 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005493 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5494 }
5495
Paul Duffin89f570a2021-06-16 01:42:33 +01005496 prebuilt_bootclasspath_fragment {
5497 name: "my-bootclasspath-fragment",
5498 contents: ["libfoo", "libbar"],
5499 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005500 hidden_api: {
5501 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5502 metadata: "my-bootclasspath-fragment/metadata.csv",
5503 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005504 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5505 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5506 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005507 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005508 }
5509
Liz Kammer2dc72442023-04-20 10:10:48 -04005510 prebuilt_systemserverclasspath_fragment {
5511 name: "my-systemserverclasspath-fragment",
5512 contents: ["libbaz"],
5513 apex_available: ["myapex"],
5514 }
5515
Spandan Das52c01a12024-09-20 01:09:48 +00005516 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005517 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005518 public: {
5519 jars: ["libfoo.jar"],
5520 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005521 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005522 shared_library: false,
5523 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005524 }
5525
Spandan Das52c01a12024-09-20 01:09:48 +00005526
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005527 java_sdk_library_import {
5528 name: "libbar",
5529 public: {
5530 jars: ["libbar.jar"],
5531 },
5532 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005533 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005534 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005535 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005536
5537 java_sdk_library_import {
5538 name: "libbaz",
5539 public: {
5540 jars: ["libbaz.jar"],
5541 },
5542 apex_available: ["myapex"],
5543 shared_library: false,
5544 permitted_packages: ["baz"],
5545 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005546 `
5547
Paul Duffin89f570a2021-06-16 01:42:33 +01005548 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005549
Paul Duffin537ea3d2021-05-14 10:38:00 +01005550 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005551 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005552 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005553 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005554 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005555 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005556 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005557
5558 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5559
5560 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005561 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005562 "myjavalib.myapex",
5563 "libfoo.myapex",
5564 "libbar.myapex",
5565 "libbaz.myapex",
5566 }
5567 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5568 for i, e := range mkEntries {
5569 g := e.OverrideName
5570 if w := overrideNames[i]; w != g {
5571 t.Errorf("Expected override name %q, got %q", w, g)
5572 }
5573 }
5574
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005575 })
5576
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005577 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005578 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005579 bp := `
5580 prebuilt_apex {
5581 name: "myapex",
5582 arch: {
5583 arm64: {
5584 src: "myapex-arm64.apex",
5585 },
5586 arm: {
5587 src: "myapex-arm.apex",
5588 },
5589 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005590 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5591 }
5592
5593 prebuilt_bootclasspath_fragment {
5594 name: "my-bootclasspath-fragment",
5595 contents: ["libfoo", "libbar"],
5596 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005597 hidden_api: {
5598 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5599 metadata: "my-bootclasspath-fragment/metadata.csv",
5600 index: "my-bootclasspath-fragment/index.csv",
5601 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5602 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5603 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 }
5605
5606 java_import {
5607 name: "libfoo",
5608 jars: ["libfoo.jar"],
5609 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005610 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005611 }
5612
5613 java_library {
5614 name: "libfoo",
5615 srcs: ["foo/bar/MyClass.java"],
5616 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005617 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005618 }
Paul Duffin37856732021-02-26 14:24:15 +00005619
5620 java_sdk_library_import {
5621 name: "libbar",
5622 public: {
5623 jars: ["libbar.jar"],
5624 },
5625 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005626 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005627 }
5628
5629 java_sdk_library {
5630 name: "libbar",
5631 srcs: ["foo/bar/MyClass.java"],
5632 unsafe_ignore_missing_latest_api: true,
5633 apex_available: ["myapex"],
5634 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005635 `
5636
5637 // In this test the source (java_library) libfoo is active since the
5638 // prebuilt (java_import) defaults to prefer:false. However the
5639 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5640 // find the dex boot jar in it. We either need to disable the source libfoo
5641 // or make the prebuilt libfoo preferred.
Colin Crossd8d8b852024-12-20 16:32:37 -08005642 testDexpreoptWithApexes(t, bp, `module "platform-bootclasspath" variant ".*": module "libfoo" from platform is not allowed in the apex boot jars list`, preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005643 // dexbootjar check is skipped if AllowMissingDependencies is true
5644 preparerAllowMissingDeps := android.GroupFixturePreparers(
5645 preparer,
5646 android.PrepareForTestWithAllowMissingDependencies,
5647 )
5648 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005649 })
5650
5651 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005652 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005653 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005654 apex {
5655 name: "myapex",
5656 key: "myapex.key",
5657 updatable: false,
5658 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5659 }
5660
5661 apex_key {
5662 name: "myapex.key",
5663 public_key: "testkey.avbpubkey",
5664 private_key: "testkey.pem",
5665 }
5666
5667 bootclasspath_fragment {
5668 name: "my-bootclasspath-fragment",
5669 contents: ["libfoo", "libbar"],
5670 apex_available: ["myapex"],
5671 hidden_api: {
5672 split_packages: ["*"],
5673 },
5674 }
5675
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005676 prebuilt_apex {
5677 name: "myapex",
5678 arch: {
5679 arm64: {
5680 src: "myapex-arm64.apex",
5681 },
5682 arm: {
5683 src: "myapex-arm.apex",
5684 },
5685 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005686 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5687 }
5688
5689 prebuilt_bootclasspath_fragment {
5690 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005691 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005692 contents: ["libfoo", "libbar"],
5693 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005694 hidden_api: {
5695 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5696 metadata: "my-bootclasspath-fragment/metadata.csv",
5697 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005698 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5699 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5700 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005701 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005702 }
5703
Spandan Das52c01a12024-09-20 01:09:48 +00005704 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005705 name: "libfoo",
5706 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005707 public: {
5708 jars: ["libfoo.jar"],
5709 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005710 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005711 shared_library: false,
5712 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005713 }
5714
5715 java_library {
5716 name: "libfoo",
5717 srcs: ["foo/bar/MyClass.java"],
5718 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005719 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005720 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005721 }
Paul Duffin37856732021-02-26 14:24:15 +00005722
5723 java_sdk_library_import {
5724 name: "libbar",
5725 prefer: true,
5726 public: {
5727 jars: ["libbar.jar"],
5728 },
5729 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005730 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005731 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005732 }
5733
5734 java_sdk_library {
5735 name: "libbar",
5736 srcs: ["foo/bar/MyClass.java"],
5737 unsafe_ignore_missing_latest_api: true,
5738 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005739 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005740 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005741 `
5742
Paul Duffin89f570a2021-06-16 01:42:33 +01005743 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005744
Paul Duffin537ea3d2021-05-14 10:38:00 +01005745 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005746 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005747 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005748 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005749 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005750 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005751 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005752 })
5753
5754 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005755 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005756 bp := `
5757 apex {
5758 name: "myapex",
5759 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005760 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005761 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005762 }
5763
5764 apex_key {
5765 name: "myapex.key",
5766 public_key: "testkey.avbpubkey",
5767 private_key: "testkey.pem",
5768 }
5769
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005770 bootclasspath_fragment {
5771 name: "my-bootclasspath-fragment",
5772 contents: ["libfoo", "libbar"],
5773 apex_available: ["myapex"],
5774 hidden_api: {
5775 split_packages: ["*"],
5776 },
5777 }
5778
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005779 prebuilt_apex {
5780 name: "myapex",
5781 arch: {
5782 arm64: {
5783 src: "myapex-arm64.apex",
5784 },
5785 arm: {
5786 src: "myapex-arm.apex",
5787 },
5788 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005789 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5790 }
5791
5792 prebuilt_bootclasspath_fragment {
5793 name: "my-bootclasspath-fragment",
5794 contents: ["libfoo", "libbar"],
5795 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005796 hidden_api: {
5797 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5798 metadata: "my-bootclasspath-fragment/metadata.csv",
5799 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005800 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5801 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5802 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005803 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005804 }
5805
5806 java_import {
5807 name: "libfoo",
5808 jars: ["libfoo.jar"],
5809 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005810 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005811 }
5812
5813 java_library {
5814 name: "libfoo",
5815 srcs: ["foo/bar/MyClass.java"],
5816 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005817 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005818 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005819 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005820 }
Paul Duffin37856732021-02-26 14:24:15 +00005821
5822 java_sdk_library_import {
5823 name: "libbar",
5824 public: {
5825 jars: ["libbar.jar"],
5826 },
5827 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005828 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005829 }
5830
5831 java_sdk_library {
5832 name: "libbar",
5833 srcs: ["foo/bar/MyClass.java"],
5834 unsafe_ignore_missing_latest_api: true,
5835 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005836 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005837 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005838 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005839 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005840 `
5841
Paul Duffin89f570a2021-06-16 01:42:33 +01005842 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005843
Paul Duffin537ea3d2021-05-14 10:38:00 +01005844 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005845 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005846 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5847 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005848 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005849 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005850 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 })
5852
5853 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005854 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005855 bp := `
5856 apex {
5857 name: "myapex",
5858 enabled: false,
5859 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005860 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005861 }
5862
5863 apex_key {
5864 name: "myapex.key",
5865 public_key: "testkey.avbpubkey",
5866 private_key: "testkey.pem",
5867 }
5868
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005869 bootclasspath_fragment {
5870 name: "my-bootclasspath-fragment",
5871 enabled: false,
5872 contents: ["libfoo", "libbar"],
5873 apex_available: ["myapex"],
5874 hidden_api: {
5875 split_packages: ["*"],
5876 },
5877 }
5878
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005879 prebuilt_apex {
5880 name: "myapex",
5881 arch: {
5882 arm64: {
5883 src: "myapex-arm64.apex",
5884 },
5885 arm: {
5886 src: "myapex-arm.apex",
5887 },
5888 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005889 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5890 }
5891
5892 prebuilt_bootclasspath_fragment {
5893 name: "my-bootclasspath-fragment",
5894 contents: ["libfoo", "libbar"],
5895 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005896 hidden_api: {
5897 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5898 metadata: "my-bootclasspath-fragment/metadata.csv",
5899 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005900 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5901 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5902 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005903 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005904 }
5905
5906 java_import {
5907 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005908 jars: ["libfoo.jar"],
5909 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005910 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005911 }
5912
5913 java_library {
5914 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005915 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005916 srcs: ["foo/bar/MyClass.java"],
5917 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005918 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005919 }
Paul Duffin37856732021-02-26 14:24:15 +00005920
5921 java_sdk_library_import {
5922 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005923 public: {
5924 jars: ["libbar.jar"],
5925 },
5926 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005927 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005928 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005929 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005930 }
5931
5932 java_sdk_library {
5933 name: "libbar",
5934 srcs: ["foo/bar/MyClass.java"],
5935 unsafe_ignore_missing_latest_api: true,
5936 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005937 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005938 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005939 `
Cole Fausta963b942024-04-11 17:43:00 -07005940 // This test disables libbar, which causes the ComponentDepsMutator to add
5941 // deps on libbar.stubs and other sub-modules that don't exist. We can
5942 // enable AllowMissingDependencies to work around that, but enabling that
5943 // causes extra checks for missing source files to dex_bootjars, so add those
5944 // to the mock fs as well.
5945 preparer2 := android.GroupFixturePreparers(
5946 preparer,
5947 android.PrepareForTestWithAllowMissingDependencies,
5948 android.FixtureMergeMockFs(map[string][]byte{
5949 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005950 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005951 }),
5952 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005953
Cole Fausta963b942024-04-11 17:43:00 -07005954 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005955
Paul Duffin537ea3d2021-05-14 10:38:00 +01005956 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005957 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005958 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005959 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005960 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005961 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005962 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005963 })
Spandan Das3a392012024-01-17 18:26:27 +00005964
Spandan Dasf2c10572024-02-27 04:49:52 +00005965 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005966 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005967 bp := `
5968 // Source
5969 apex {
5970 name: "myapex",
5971 enabled: false,
5972 key: "myapex.key",
5973 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5974 }
5975
5976 apex_key {
5977 name: "myapex.key",
5978 public_key: "testkey.avbpubkey",
5979 private_key: "testkey.pem",
5980 }
5981
5982 // Prebuilt
5983 prebuilt_apex {
5984 name: "myapex.v1",
5985 source_apex_name: "myapex",
5986 arch: {
5987 arm64: {
5988 src: "myapex-arm64.apex",
5989 },
5990 arm: {
5991 src: "myapex-arm.apex",
5992 },
5993 },
5994 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5995 prefer: true,
5996 }
5997 prebuilt_apex {
5998 name: "myapex.v2",
5999 source_apex_name: "myapex",
6000 arch: {
6001 arm64: {
6002 src: "myapex-arm64.apex",
6003 },
6004 arm: {
6005 src: "myapex-arm.apex",
6006 },
6007 },
6008 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6009 prefer: true,
6010 }
6011
6012 prebuilt_bootclasspath_fragment {
6013 name: "my-bootclasspath-fragment",
6014 contents: ["libfoo", "libbar"],
6015 apex_available: ["myapex"],
6016 hidden_api: {
6017 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6018 metadata: "my-bootclasspath-fragment/metadata.csv",
6019 index: "my-bootclasspath-fragment/index.csv",
6020 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6021 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6022 },
6023 prefer: true,
6024 }
6025
6026 java_import {
6027 name: "libfoo",
6028 jars: ["libfoo.jar"],
6029 apex_available: ["myapex"],
6030 prefer: true,
6031 }
6032 java_import {
6033 name: "libbar",
6034 jars: ["libbar.jar"],
6035 apex_available: ["myapex"],
6036 prefer: true,
6037 }
6038 `
6039
Spandan Dasf2c10572024-02-27 04:49:52 +00006040 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 +00006041 })
6042
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006043}
6044
Roland Levillain630846d2019-06-26 12:48:34 +01006045func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006046 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006047 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006048 apex_test {
6049 name: "myapex",
6050 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006051 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006052 tests: [
6053 "mytest",
6054 ],
6055 }
6056
6057 apex_key {
6058 name: "myapex.key",
6059 public_key: "testkey.avbpubkey",
6060 private_key: "testkey.pem",
6061 }
6062
Liz Kammer1c14a212020-05-12 15:26:55 -07006063 filegroup {
6064 name: "fg",
6065 srcs: [
6066 "baz",
6067 "bar/baz"
6068 ],
6069 }
6070
Roland Levillain630846d2019-06-26 12:48:34 +01006071 cc_test {
6072 name: "mytest",
6073 gtest: false,
6074 srcs: ["mytest.cpp"],
6075 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006076 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006077 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006078 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006079 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006080 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006081
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006082 cc_library {
6083 name: "mylib",
6084 srcs: ["mylib.cpp"],
6085 system_shared_libs: [],
6086 stl: "none",
6087 }
6088
Liz Kammer5bd365f2020-05-27 15:15:11 -07006089 filegroup {
6090 name: "fg2",
6091 srcs: [
6092 "testdata/baz"
6093 ],
6094 }
Roland Levillain630846d2019-06-26 12:48:34 +01006095 `)
6096
Jooyung Hana0503a52023-08-23 13:12:50 +09006097 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006098 copyCmds := apexRule.Args["copy_commands"]
6099
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006100 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006101 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006102 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006103
Liz Kammer1c14a212020-05-12 15:26:55 -07006104 //Ensure that test data are copied into apex.
6105 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6106 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6107
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006109 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006110 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006111 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006112 prefix := "TARGET_"
6113 var builder strings.Builder
6114 data.Custom(&builder, name, prefix, "", data)
6115 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006116 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006117 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006118}
6119
Jooyung Hand48f3c32019-08-23 11:18:57 +09006120func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006121 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006122 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6123 apex {
6124 name: "myapex",
6125 key: "myapex.key",
6126 native_shared_libs: ["libfoo"],
6127 }
6128
6129 apex_key {
6130 name: "myapex.key",
6131 public_key: "testkey.avbpubkey",
6132 private_key: "testkey.pem",
6133 }
6134
6135 cc_library {
6136 name: "libfoo",
6137 stl: "none",
6138 system_shared_libs: [],
6139 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006140 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006141 }
6142 `)
6143 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6144 apex {
6145 name: "myapex",
6146 key: "myapex.key",
6147 java_libs: ["myjar"],
6148 }
6149
6150 apex_key {
6151 name: "myapex.key",
6152 public_key: "testkey.avbpubkey",
6153 private_key: "testkey.pem",
6154 }
6155
6156 java_library {
6157 name: "myjar",
6158 srcs: ["foo/bar/MyClass.java"],
6159 sdk_version: "none",
6160 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006161 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006162 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006163 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006164 }
6165 `)
6166}
6167
Bill Peckhama41a6962021-01-11 10:58:54 -08006168func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006169 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006170 apex {
6171 name: "myapex",
6172 key: "myapex.key",
6173 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006174 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006175 }
6176
6177 apex_key {
6178 name: "myapex.key",
6179 public_key: "testkey.avbpubkey",
6180 private_key: "testkey.pem",
6181 }
6182
6183 java_import {
6184 name: "myjavaimport",
6185 apex_available: ["myapex"],
6186 jars: ["my.jar"],
6187 compile_dex: true,
6188 }
6189 `)
6190
Jooyung Hana0503a52023-08-23 13:12:50 +09006191 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006192 apexRule := module.Rule("apexRule")
6193 copyCmds := apexRule.Args["copy_commands"]
6194 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6195}
6196
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006197func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006198 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006199 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006200 apex {
6201 name: "myapex",
6202 key: "myapex.key",
6203 apps: [
6204 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006205 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006206 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006207 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006208 }
6209
6210 apex_key {
6211 name: "myapex.key",
6212 public_key: "testkey.avbpubkey",
6213 private_key: "testkey.pem",
6214 }
6215
6216 android_app {
6217 name: "AppFoo",
6218 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006219 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006220 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006221 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006222 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006223 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006224 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006225 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006226
6227 android_app {
6228 name: "AppFooPriv",
6229 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006230 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006231 system_modules: "none",
6232 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006233 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006234 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006235 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006236 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006237
6238 cc_library_shared {
6239 name: "libjni",
6240 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006241 shared_libs: ["libfoo"],
6242 stl: "none",
6243 system_shared_libs: [],
6244 apex_available: [ "myapex" ],
6245 sdk_version: "current",
6246 }
6247
6248 cc_library_shared {
6249 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006250 stl: "none",
6251 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006252 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006253 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006254 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006255 `)
6256
Jooyung Hana0503a52023-08-23 13:12:50 +09006257 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006258 apexRule := module.Rule("apexRule")
6259 copyCmds := apexRule.Args["copy_commands"]
6260
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006261 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6262 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006263 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006264
Colin Crossaede88c2020-08-11 12:17:01 -07006265 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006267 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006268 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006269 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006270 // JNI libraries including transitive deps are
6271 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006272 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006273 // ... embedded inside APK (jnilibs.zip)
6274 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6275 // ... and not directly inside the APEX
6276 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6277 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006278
6279 apexBundle := module.Module().(*apexBundle)
6280 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6281 var builder strings.Builder
6282 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6283 androidMk := builder.String()
6284 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6285 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6286 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6287 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6288 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6289 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 +01006290}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006291
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006292func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006293 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006294 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6295 for _, id := range invalidBuildIds {
6296 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6297 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6298 variables.BuildId = proptools.StringPtr(id)
6299 })
6300 testApexError(t, message, `apex {
6301 name: "myapex",
6302 key: "myapex.key",
6303 apps: ["AppFooPrebuilt"],
6304 updatable: false,
6305 }
6306
6307 apex_key {
6308 name: "myapex.key",
6309 public_key: "testkey.avbpubkey",
6310 private_key: "testkey.pem",
6311 }
6312
6313 android_app_import {
6314 name: "AppFooPrebuilt",
6315 apk: "PrebuiltAppFoo.apk",
6316 presigned: true,
6317 apex_available: ["myapex"],
6318 }
6319 `, fixture)
6320 }
6321}
6322
Dario Frenicde2a032019-10-27 00:29:22 +01006323func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006324 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006325 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006326 apex {
6327 name: "myapex",
6328 key: "myapex.key",
6329 apps: [
6330 "AppFooPrebuilt",
6331 "AppFooPrivPrebuilt",
6332 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006333 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006334 }
6335
6336 apex_key {
6337 name: "myapex.key",
6338 public_key: "testkey.avbpubkey",
6339 private_key: "testkey.pem",
6340 }
6341
6342 android_app_import {
6343 name: "AppFooPrebuilt",
6344 apk: "PrebuiltAppFoo.apk",
6345 presigned: true,
6346 dex_preopt: {
6347 enabled: false,
6348 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006349 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006350 }
6351
6352 android_app_import {
6353 name: "AppFooPrivPrebuilt",
6354 apk: "PrebuiltAppFooPriv.apk",
6355 privileged: true,
6356 presigned: true,
6357 dex_preopt: {
6358 enabled: false,
6359 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006360 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006361 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006362 }
6363 `)
6364
Jooyung Hana0503a52023-08-23 13:12:50 +09006365 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006366 apexRule := module.Rule("apexRule")
6367 copyCmds := apexRule.Args["copy_commands"]
6368
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006369 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6370 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006371}
6372
6373func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006375 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006376 apex {
6377 name: "myapex",
6378 key: "myapex.key",
6379 apps: [
6380 "AppFoo",
6381 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006382 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006383 }
6384
6385 apex_key {
6386 name: "myapex.key",
6387 public_key: "testkey.avbpubkey",
6388 private_key: "testkey.pem",
6389 }
6390
6391 android_app {
6392 name: "AppFoo",
6393 srcs: ["foo/bar/MyClass.java"],
6394 sdk_version: "none",
6395 system_modules: "none",
6396 apex_available: [ "myapex" ],
6397 }
6398
6399 android_app_import {
6400 name: "AppFoo",
6401 apk: "AppFooPrebuilt.apk",
6402 filename: "AppFooPrebuilt.apk",
6403 presigned: true,
6404 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006405 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006406 }
6407 `, withFiles(map[string][]byte{
6408 "AppFooPrebuilt.apk": nil,
6409 }))
6410
Jooyung Hana0503a52023-08-23 13:12:50 +09006411 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006412 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006413 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006414}
6415
Dario Freni6f3937c2019-12-20 22:58:03 +00006416func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006417 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006418 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006419 apex {
6420 name: "myapex",
6421 key: "myapex.key",
6422 apps: [
6423 "TesterHelpAppFoo",
6424 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006425 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006426 }
6427
6428 apex_key {
6429 name: "myapex.key",
6430 public_key: "testkey.avbpubkey",
6431 private_key: "testkey.pem",
6432 }
6433
6434 android_test_helper_app {
6435 name: "TesterHelpAppFoo",
6436 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006437 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006438 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006439 }
6440
6441 `)
6442
Jooyung Hana0503a52023-08-23 13:12:50 +09006443 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006444 apexRule := module.Rule("apexRule")
6445 copyCmds := apexRule.Args["copy_commands"]
6446
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006447 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006448}
6449
Jooyung Han18020ea2019-11-13 10:50:48 +09006450func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006451 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006452 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006453 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006454 apex {
6455 name: "myapex",
6456 key: "myapex.key",
6457 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006458 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006459 }
6460
6461 apex_key {
6462 name: "myapex.key",
6463 public_key: "testkey.avbpubkey",
6464 private_key: "testkey.pem",
6465 }
6466
6467 apex {
6468 name: "otherapex",
6469 key: "myapex.key",
6470 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006471 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006472 }
6473
6474 cc_defaults {
6475 name: "libfoo-defaults",
6476 apex_available: ["otherapex"],
6477 }
6478
6479 cc_library {
6480 name: "libfoo",
6481 defaults: ["libfoo-defaults"],
6482 stl: "none",
6483 system_shared_libs: [],
6484 }`)
6485}
6486
Paul Duffine52e66f2020-03-30 17:54:29 +01006487func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006488 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006489 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006490 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006491 apex {
6492 name: "myapex",
6493 key: "myapex.key",
6494 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006495 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006496 }
6497
6498 apex_key {
6499 name: "myapex.key",
6500 public_key: "testkey.avbpubkey",
6501 private_key: "testkey.pem",
6502 }
6503
6504 apex {
6505 name: "otherapex",
6506 key: "otherapex.key",
6507 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006508 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006509 }
6510
6511 apex_key {
6512 name: "otherapex.key",
6513 public_key: "testkey.avbpubkey",
6514 private_key: "testkey.pem",
6515 }
6516
6517 cc_library {
6518 name: "libfoo",
6519 stl: "none",
6520 system_shared_libs: [],
6521 apex_available: ["otherapex"],
6522 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006523
6524 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6525 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6526 testApex(t, `
6527 apex {
6528 name: "com.sdv.myapex",
6529 key: "myapex.key",
6530 native_shared_libs: ["libfoo"],
6531 updatable: false,
6532 product_specific: true,
6533 }
6534
6535 apex_key {
6536 name: "myapex.key",
6537 public_key: "testkey.avbpubkey",
6538 private_key: "testkey.pem",
6539 }
6540
6541 apex {
6542 name: "com.any.otherapex",
6543 key: "otherapex.key",
6544 native_shared_libs: ["libfoo"],
6545 updatable: false,
6546 }
6547
6548 apex_key {
6549 name: "otherapex.key",
6550 public_key: "testkey.avbpubkey",
6551 private_key: "testkey.pem",
6552 }
6553
6554 cc_library {
6555 name: "libfoo",
6556 stl: "none",
6557 system_shared_libs: [],
6558 apex_available: ["com.any.otherapex"],
6559 product_specific: true,
6560 }`,
6561 android.FixtureMergeMockFs(android.MockFS{
6562 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6563 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6564 }))
6565
6566 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6567 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6568 apex {
6569 name: "com.sdv.myapex",
6570 key: "myapex.key",
6571 native_shared_libs: ["libfoo"],
6572 updatable: false,
6573 }
6574
6575 apex_key {
6576 name: "myapex.key",
6577 public_key: "testkey.avbpubkey",
6578 private_key: "testkey.pem",
6579 }
6580
6581 apex {
6582 name: "com.any.otherapex",
6583 key: "otherapex.key",
6584 native_shared_libs: ["libfoo"],
6585 updatable: false,
6586 }
6587
6588 apex_key {
6589 name: "otherapex.key",
6590 public_key: "testkey.avbpubkey",
6591 private_key: "testkey.pem",
6592 }
6593
6594 cc_library {
6595 name: "libfoo",
6596 stl: "none",
6597 system_shared_libs: [],
6598 apex_available: ["com.any.otherapex"],
6599 }`,
6600 android.FixtureMergeMockFs(android.MockFS{
6601 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6602 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6603 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006604}
Jiyong Park127b40b2019-09-30 16:04:35 +09006605
Paul Duffine52e66f2020-03-30 17:54:29 +01006606func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006607 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006608 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006609 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006610.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006611.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006612.*via tag cc\.dependencyTag.*
6613.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006614.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006615.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006616.*via tag cc\.dependencyTag.*
6617.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006618.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006619.*-> libbaz.*link:shared.*
6620.*via tag cc\.dependencyTag.*
6621.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006622 apex {
6623 name: "myapex",
6624 key: "myapex.key",
6625 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006626 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006627 }
6628
6629 apex_key {
6630 name: "myapex.key",
6631 public_key: "testkey.avbpubkey",
6632 private_key: "testkey.pem",
6633 }
6634
Jiyong Park127b40b2019-09-30 16:04:35 +09006635 cc_library {
6636 name: "libfoo",
6637 stl: "none",
6638 shared_libs: ["libbar"],
6639 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006640 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006641 }
6642
6643 cc_library {
6644 name: "libbar",
6645 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006646 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006647 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006648 apex_available: ["myapex"],
6649 }
6650
6651 cc_library {
6652 name: "libbaz",
6653 stl: "none",
6654 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006655 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006656
6657 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6658 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6659 testApex(t, `
6660 apex {
6661 name: "com.sdv.myapex",
6662 key: "myapex.key",
6663 native_shared_libs: ["libfoo"],
6664 updatable: false,
6665 product_specific: true,
6666 }
6667
6668 apex_key {
6669 name: "myapex.key",
6670 public_key: "testkey.avbpubkey",
6671 private_key: "testkey.pem",
6672 }
6673
6674 cc_library {
6675 name: "libfoo",
6676 stl: "none",
6677 shared_libs: ["libbar"],
6678 system_shared_libs: [],
6679 apex_available: ["com.sdv.myapex"],
6680 product_specific: true,
6681 }
6682
6683 cc_library {
6684 name: "libbar",
6685 stl: "none",
6686 shared_libs: ["libbaz"],
6687 system_shared_libs: [],
6688 apex_available: ["com.sdv.myapex"],
6689 product_specific: true,
6690 }
6691
6692 cc_library {
6693 name: "libbaz",
6694 stl: "none",
6695 system_shared_libs: [],
6696 product_specific: true,
6697 }`,
6698 android.FixtureMergeMockFs(android.MockFS{
6699 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6700 }))
6701
6702 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6703 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6704 apex {
6705 name: "com.sdv.myapex",
6706 key: "myapex.key",
6707 native_shared_libs: ["libfoo"],
6708 updatable: false,
6709 }
6710
6711 apex_key {
6712 name: "myapex.key",
6713 public_key: "testkey.avbpubkey",
6714 private_key: "testkey.pem",
6715 }
6716
6717 cc_library {
6718 name: "libfoo",
6719 stl: "none",
6720 shared_libs: ["libbar"],
6721 system_shared_libs: [],
6722 apex_available: ["com.sdv.myapex"],
6723 }
6724
6725 cc_library {
6726 name: "libbar",
6727 stl: "none",
6728 shared_libs: ["libbaz"],
6729 system_shared_libs: [],
6730 apex_available: ["com.sdv.myapex"],
6731 }
6732
6733 cc_library {
6734 name: "libbaz",
6735 stl: "none",
6736 system_shared_libs: [],
6737 }`,
6738 android.FixtureMergeMockFs(android.MockFS{
6739 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6740 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006741}
Jiyong Park127b40b2019-09-30 16:04:35 +09006742
Liz Kammer5f108fa2023-05-11 14:33:17 -04006743func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006744 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006745 testApex(t, `
6746 apex {
6747 name: "myapex",
6748 key: "myapex.key",
6749 native_shared_libs: ["libfoo"],
6750 updatable: false,
6751 }
6752
6753 apex_key {
6754 name: "myapex.key",
6755 public_key: "testkey.avbpubkey",
6756 private_key: "testkey.pem",
6757 }
6758
6759 cc_library {
6760 name: "libfoo",
6761 stl: "none",
6762 static_libs: ["libbar"],
6763 system_shared_libs: [],
6764 apex_available: ["myapex"],
6765 }
6766
6767 cc_library {
6768 name: "libbar",
6769 stl: "none",
6770 shared_libs: ["libbaz"],
6771 system_shared_libs: [],
6772 apex_available: ["myapex"],
6773 }
6774
6775 cc_library {
6776 name: "libbaz",
6777 stl: "none",
6778 system_shared_libs: [],
6779 }`)
6780
6781 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6782 apex {
6783 name: "myapex",
6784 key: "myapex.key",
6785 native_shared_libs: ["libfoo"],
6786 updatable: false,
6787 }
6788
6789 apex_key {
6790 name: "myapex.key",
6791 public_key: "testkey.avbpubkey",
6792 private_key: "testkey.pem",
6793 }
6794
6795 cc_library {
6796 name: "libfoo",
6797 stl: "none",
6798 static_libs: ["libbar"],
6799 system_shared_libs: [],
6800 apex_available: ["myapex"],
6801 }
6802
6803 cc_library {
6804 name: "libbar",
6805 stl: "none",
6806 system_shared_libs: [],
6807 }`)
6808}
6809
Paul Duffine52e66f2020-03-30 17:54:29 +01006810func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006811 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006812 testApexError(t, "\"otherapex\" is not a valid module name", `
6813 apex {
6814 name: "myapex",
6815 key: "myapex.key",
6816 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006817 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006818 }
6819
6820 apex_key {
6821 name: "myapex.key",
6822 public_key: "testkey.avbpubkey",
6823 private_key: "testkey.pem",
6824 }
6825
6826 cc_library {
6827 name: "libfoo",
6828 stl: "none",
6829 system_shared_libs: [],
6830 apex_available: ["otherapex"],
6831 }`)
6832
Paul Duffine52e66f2020-03-30 17:54:29 +01006833 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006834 apex {
6835 name: "myapex",
6836 key: "myapex.key",
6837 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006838 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006839 }
6840
6841 apex_key {
6842 name: "myapex.key",
6843 public_key: "testkey.avbpubkey",
6844 private_key: "testkey.pem",
6845 }
6846
6847 cc_library {
6848 name: "libfoo",
6849 stl: "none",
6850 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006851 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006852 apex_available: ["myapex"],
6853 }
6854
6855 cc_library {
6856 name: "libbar",
6857 stl: "none",
6858 system_shared_libs: [],
6859 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006860 }
6861
6862 cc_library {
6863 name: "libbaz",
6864 stl: "none",
6865 system_shared_libs: [],
6866 stubs: {
6867 versions: ["10", "20", "30"],
6868 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006869 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006870}
Jiyong Park127b40b2019-09-30 16:04:35 +09006871
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006872func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006873 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006874 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006875 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006876 testApexError(t, "expected an integer between 0-9; got -1", `
6877 apex {
6878 name: "myapex",
6879 key: "myapex.key",
6880 apex_available_name: "com.android.foo",
6881 variant_version: "-1",
6882 updatable: false,
6883 }
6884 apex_key {
6885 name: "myapex.key",
6886 public_key: "testkey.avbpubkey",
6887 private_key: "testkey.pem",
6888 }
6889 `)
6890 })
6891
6892 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006893 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006894 testApexError(t, "expected an integer between 0-9; got 10", `
6895 apex {
6896 name: "myapex",
6897 key: "myapex.key",
6898 apex_available_name: "com.android.foo",
6899 variant_version: "10",
6900 updatable: false,
6901 }
6902 apex_key {
6903 name: "myapex.key",
6904 public_key: "testkey.avbpubkey",
6905 private_key: "testkey.pem",
6906 }
6907 `)
6908 })
6909}
6910
6911func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006912 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006913 context := android.GroupFixturePreparers(
6914 android.PrepareForIntegrationTestWithAndroid,
6915 PrepareForTestWithApexBuildComponents,
6916 android.FixtureMergeMockFs(android.MockFS{
6917 "system/sepolicy/apex/foo-file_contexts": nil,
6918 "system/sepolicy/apex/bar-file_contexts": nil,
6919 }),
6920 )
6921 result := context.RunTestWithBp(t, `
6922 apex {
6923 name: "foo",
6924 key: "myapex.key",
6925 apex_available_name: "com.android.foo",
6926 variant_version: "0",
6927 updatable: false,
6928 }
6929 apex {
6930 name: "bar",
6931 key: "myapex.key",
6932 apex_available_name: "com.android.foo",
6933 variant_version: "3",
6934 updatable: false,
6935 }
6936 apex_key {
6937 name: "myapex.key",
6938 public_key: "testkey.avbpubkey",
6939 private_key: "testkey.pem",
6940 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006941 override_apex {
6942 name: "myoverrideapex",
6943 base: "bar",
6944 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006945 `)
6946
Jooyung Hana0503a52023-08-23 13:12:50 +09006947 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006948 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006949 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6950 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6951 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6952 }
6953
Jooyung Hana0503a52023-08-23 13:12:50 +09006954 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006955 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006956 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6957 barActualDefaultVersion := barManifestRule.Args["default_version"]
6958 if barActualDefaultVersion != barExpectedDefaultVersion {
6959 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6960 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006961
Spandan Das50801e22024-05-13 18:29:45 +00006962 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006963 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6964 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6965 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6966 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006967}
6968
Sam Delmericoca816532023-06-02 14:09:50 -04006969func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006970 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006971 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 -07006972 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006973 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6974 apex {
6975 name: "myapex_sminus",
6976 key: "myapex.key",
6977 apps: ["AppFoo"],
6978 apex_available_name: "myapex",
6979 updatable: false,
6980 }
6981 apex {
6982 name: "myapex",
6983 key: "myapex.key",
6984 apps: ["AppFoo"],
6985 updatable: false,
6986 }
6987 apex_key {
6988 name: "myapex.key",
6989 public_key: "testkey.avbpubkey",
6990 private_key: "testkey.pem",
6991 }
6992 android_app {
6993 name: "AppFoo",
6994 srcs: ["foo/bar/MyClass.java"],
6995 sdk_version: "none",
6996 system_modules: "none",
6997 apex_available: [ "myapex_sminus" ],
6998 }`,
6999 android.FixtureMergeMockFs(android.MockFS{
7000 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7001 }),
7002 )
7003 })
7004
7005 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 -07007006 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007007 testApex(t, `
7008 apex {
7009 name: "myapex_sminus",
7010 key: "myapex.key",
7011 apps: ["AppFoo"],
7012 apex_available_name: "myapex",
7013 updatable: false,
7014 }
7015 apex {
7016 name: "myapex",
7017 key: "myapex.key",
7018 apps: ["AppFoo"],
7019 updatable: false,
7020 }
7021 apex_key {
7022 name: "myapex.key",
7023 public_key: "testkey.avbpubkey",
7024 private_key: "testkey.pem",
7025 }
7026 android_app {
7027 name: "AppFoo",
7028 srcs: ["foo/bar/MyClass.java"],
7029 sdk_version: "none",
7030 system_modules: "none",
7031 apex_available: [ "myapex" ],
7032 }`,
7033 android.FixtureMergeMockFs(android.MockFS{
7034 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7035 }),
7036 )
7037 })
7038
7039 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007040 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007041 testApex(t, `
7042 override_apex {
7043 name: "myoverrideapex_sminus",
7044 base: "myapex_sminus",
7045 key: "myapex.key",
7046 apps: ["AppFooOverride"],
7047 }
7048 override_apex {
7049 name: "myoverrideapex",
7050 base: "myapex",
7051 key: "myapex.key",
7052 apps: ["AppFooOverride"],
7053 }
7054 apex {
7055 name: "myapex_sminus",
7056 key: "myapex.key",
7057 apps: ["AppFoo"],
7058 apex_available_name: "myapex",
7059 updatable: false,
7060 }
7061 apex {
7062 name: "myapex",
7063 key: "myapex.key",
7064 apps: ["AppFoo"],
7065 updatable: false,
7066 }
7067 apex_key {
7068 name: "myapex.key",
7069 public_key: "testkey.avbpubkey",
7070 private_key: "testkey.pem",
7071 }
7072 android_app {
7073 name: "AppFooOverride",
7074 srcs: ["foo/bar/MyClass.java"],
7075 sdk_version: "none",
7076 system_modules: "none",
7077 apex_available: [ "myapex" ],
7078 }
7079 android_app {
7080 name: "AppFoo",
7081 srcs: ["foo/bar/MyClass.java"],
7082 sdk_version: "none",
7083 system_modules: "none",
7084 apex_available: [ "myapex" ],
7085 }`,
7086 android.FixtureMergeMockFs(android.MockFS{
7087 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7088 }),
7089 )
7090 })
7091}
7092
7093func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007094 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007095 context := android.GroupFixturePreparers(
7096 android.PrepareForIntegrationTestWithAndroid,
7097 PrepareForTestWithApexBuildComponents,
7098 java.PrepareForTestWithDexpreopt,
7099 android.FixtureMergeMockFs(android.MockFS{
7100 "system/sepolicy/apex/myapex-file_contexts": nil,
7101 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7102 }),
7103 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7104 variables.BuildId = proptools.StringPtr("buildid")
7105 }),
7106 )
7107 context.RunTestWithBp(t, `
7108 override_apex {
7109 name: "myoverrideapex_sminus",
7110 base: "myapex_sminus",
7111 }
7112 override_apex {
7113 name: "myoverrideapex",
7114 base: "myapex",
7115 }
7116 apex {
7117 name: "myapex",
7118 key: "myapex.key",
7119 apps: ["AppFoo"],
7120 updatable: false,
7121 }
7122 apex {
7123 name: "myapex_sminus",
7124 apex_available_name: "myapex",
7125 key: "myapex.key",
7126 apps: ["AppFoo_sminus"],
7127 updatable: false,
7128 }
7129 apex_key {
7130 name: "myapex.key",
7131 public_key: "testkey.avbpubkey",
7132 private_key: "testkey.pem",
7133 }
7134 android_app {
7135 name: "AppFoo",
7136 srcs: ["foo/bar/MyClass.java"],
7137 sdk_version: "none",
7138 system_modules: "none",
7139 apex_available: [ "myapex" ],
7140 }
7141 android_app {
7142 name: "AppFoo_sminus",
7143 srcs: ["foo/bar/MyClass.java"],
7144 sdk_version: "none",
7145 min_sdk_version: "29",
7146 system_modules: "none",
7147 apex_available: [ "myapex" ],
7148 }`)
7149}
7150
Jiyong Park89e850a2020-04-07 16:37:39 +09007151func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007152 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007153 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007154 apex {
7155 name: "myapex",
7156 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007157 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007158 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007159 }
7160
7161 apex_key {
7162 name: "myapex.key",
7163 public_key: "testkey.avbpubkey",
7164 private_key: "testkey.pem",
7165 }
7166
7167 cc_library {
7168 name: "libfoo",
7169 stl: "none",
7170 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007171 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007172 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007173 }
7174
7175 cc_library {
7176 name: "libfoo2",
7177 stl: "none",
7178 system_shared_libs: [],
7179 shared_libs: ["libbaz"],
7180 apex_available: ["//apex_available:platform"],
7181 }
7182
7183 cc_library {
7184 name: "libbar",
7185 stl: "none",
7186 system_shared_libs: [],
7187 apex_available: ["myapex"],
7188 }
7189
7190 cc_library {
7191 name: "libbaz",
7192 stl: "none",
7193 system_shared_libs: [],
7194 apex_available: ["myapex"],
7195 stubs: {
7196 versions: ["1"],
7197 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007198 }`)
7199
Jiyong Park89e850a2020-04-07 16:37:39 +09007200 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7201 // because it depends on libbar which isn't available to platform
7202 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7203 if libfoo.NotAvailableForPlatform() != true {
7204 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7205 }
7206
7207 // libfoo2 however can be available to platform because it depends on libbaz which provides
7208 // stubs
7209 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7210 if libfoo2.NotAvailableForPlatform() == true {
7211 t.Errorf("%q should be available to platform", libfoo2.String())
7212 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007213}
Jiyong Parka90ca002019-10-07 15:47:24 +09007214
Paul Duffine52e66f2020-03-30 17:54:29 +01007215func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007216 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007217 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007218 apex {
7219 name: "myapex",
7220 key: "myapex.key",
7221 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007222 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007223 }
7224
7225 apex_key {
7226 name: "myapex.key",
7227 public_key: "testkey.avbpubkey",
7228 private_key: "testkey.pem",
7229 }
7230
7231 cc_library {
7232 name: "libfoo",
7233 stl: "none",
7234 system_shared_libs: [],
7235 apex_available: ["myapex"],
7236 static: {
7237 apex_available: ["//apex_available:platform"],
7238 },
7239 }`)
7240
Jiyong Park89e850a2020-04-07 16:37:39 +09007241 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7242 if libfooShared.NotAvailableForPlatform() != true {
7243 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7244 }
7245 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7246 if libfooStatic.NotAvailableForPlatform() != false {
7247 t.Errorf("%q should be available to platform", libfooStatic.String())
7248 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007249}
7250
Jooyung Han9a419e22024-08-16 17:14:21 +09007251func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007252 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007253
7254 for _, tc := range []struct {
7255 name string
7256 apexAvailable string
7257 expectedError string
7258 }{
7259 {
7260 name: "prefix matches correctly",
7261 apexAvailable: "com.foo.*",
7262 },
7263 {
7264 name: "prefix doesn't match",
7265 apexAvailable: "com.bar.*",
7266 expectedError: `Consider .* "com.foo\.\*"`,
7267 },
7268 {
7269 name: "short prefix",
7270 apexAvailable: "com.*",
7271 expectedError: "requires two or more components",
7272 },
7273 {
7274 name: "wildcard not in the end",
7275 apexAvailable: "com.*.foo",
7276 expectedError: "should end with .*",
7277 },
7278 {
7279 name: "wildcard in the middle",
7280 apexAvailable: "com.foo*.*",
7281 expectedError: "not allowed in the middle",
7282 },
7283 {
7284 name: "hint with prefix pattern",
7285 apexAvailable: "//apex_available:platform",
7286 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7287 },
7288 } {
7289 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007290 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007291 errorHandler := android.FixtureExpectsNoErrors
7292 if tc.expectedError != "" {
7293 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7294 }
7295 context := android.GroupFixturePreparers(
7296 prepareForApexTest,
7297 android.FixtureMergeMockFs(android.MockFS{
7298 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7299 }),
7300 ).ExtendWithErrorHandler(errorHandler)
7301
7302 context.RunTestWithBp(t, `
7303 apex {
7304 name: "com.foo.bar",
7305 key: "myapex.key",
7306 native_shared_libs: ["libfoo"],
7307 updatable: false,
7308 }
7309
7310 apex_key {
7311 name: "myapex.key",
7312 public_key: "testkey.avbpubkey",
7313 private_key: "testkey.pem",
7314 }
7315
7316 cc_library {
7317 name: "libfoo",
7318 stl: "none",
7319 system_shared_libs: [],
7320 apex_available: ["`+tc.apexAvailable+`"],
7321 }`)
7322 })
7323 }
7324 testApexError(t, `Consider adding "com.foo" to`, `
7325 apex {
7326 name: "com.foo", // too short for a partner apex
7327 key: "myapex.key",
7328 native_shared_libs: ["libfoo"],
7329 updatable: false,
7330 }
7331
7332 apex_key {
7333 name: "myapex.key",
7334 public_key: "testkey.avbpubkey",
7335 private_key: "testkey.pem",
7336 }
7337
7338 cc_library {
7339 name: "libfoo",
7340 stl: "none",
7341 system_shared_libs: [],
7342 }
7343 `)
7344}
7345
Jooyung Han5f7fa502025-01-14 16:52:14 +09007346func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7347 t.Parallel()
7348 ctx := testApex(t, `
7349 apex {
7350 name: "myapex",
7351 key: "myapex.key",
7352 updatable: false,
7353 vendor: true,
7354 }
7355 apex_key {
7356 name: "myapex.key",
7357 public_key: "testkey.avbpubkey",
7358 private_key: "testkey.pem",
7359 }
7360 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7361 // vendor path should not affect "partition tag"
7362 variables.VendorPath = proptools.StringPtr("system/vendor")
7363 }))
7364
7365 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7366 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7367 "vendor",
7368 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7369 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7370 "vendor",
7371 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7372}
7373
Jooyung Hanb9518072024-11-22 14:05:20 +09007374func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7375 t.Parallel()
7376 ctx := testApex(t, `
7377 apex_test {
7378 name: "myapex",
7379 key: "myapex.key",
7380 skip_validations: {
7381 host_apex_verifier: true,
7382 },
7383 updatable: false,
7384 }
7385 apex_key {
7386 name: "myapex.key",
7387 public_key: "testkey.avbpubkey",
7388 private_key: "testkey.pem",
7389 }
7390 `)
7391
7392 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7393 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7394 t.Error("should not run host_apex_verifier")
7395 }
7396}
7397
7398func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7399 t.Parallel()
7400 ctx := testApex(t, `
7401 apex_test {
7402 name: "myapex",
7403 key: "myapex.key",
7404 updatable: false,
7405 }
7406 apex_key {
7407 name: "myapex.key",
7408 public_key: "testkey.avbpubkey",
7409 private_key: "testkey.pem",
7410 }
7411 `)
7412
7413 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7414 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7415 t.Error("should run host_apex_verifier")
7416 }
7417}
7418
Jiyong Park5d790c32019-11-15 18:40:32 +09007419func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007420 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007421 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007422 apex {
7423 name: "myapex",
7424 key: "myapex.key",
7425 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007426 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007427 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007428 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007429 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007430 }
7431
7432 override_apex {
7433 name: "override_myapex",
7434 base: "myapex",
7435 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007436 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007437 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007438 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007439 compile_multilib: "first",
7440 multilib: {
7441 lib32: {
7442 native_shared_libs: ["mylib32"],
7443 },
7444 lib64: {
7445 native_shared_libs: ["mylib64"],
7446 },
7447 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007448 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007449 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007450 key: "mynewapex.key",
7451 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007452 }
7453
7454 apex_key {
7455 name: "myapex.key",
7456 public_key: "testkey.avbpubkey",
7457 private_key: "testkey.pem",
7458 }
7459
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007460 apex_key {
7461 name: "mynewapex.key",
7462 public_key: "testkey2.avbpubkey",
7463 private_key: "testkey2.pem",
7464 }
7465
7466 android_app_certificate {
7467 name: "myapex.certificate",
7468 certificate: "testkey",
7469 }
7470
Jiyong Park5d790c32019-11-15 18:40:32 +09007471 android_app {
7472 name: "app",
7473 srcs: ["foo/bar/MyClass.java"],
7474 package_name: "foo",
7475 sdk_version: "none",
7476 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007477 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007478 }
7479
7480 override_android_app {
7481 name: "override_app",
7482 base: "app",
7483 package_name: "bar",
7484 }
markchien7c803b82021-08-26 22:10:06 +08007485
7486 bpf {
7487 name: "bpf",
7488 srcs: ["bpf.c"],
7489 }
7490
7491 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007492 name: "overrideBpf",
7493 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007494 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007495
7496 prebuilt_etc {
7497 name: "myetc",
7498 src: "myprebuilt",
7499 }
7500
7501 prebuilt_etc {
7502 name: "override_myetc",
7503 src: "override_myprebuilt",
7504 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007505
7506 cc_library {
7507 name: "mylib32",
7508 apex_available: [ "myapex" ],
7509 }
7510
7511 cc_library {
7512 name: "mylib64",
7513 apex_available: [ "myapex" ],
7514 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007515 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007516
Jooyung Hana0503a52023-08-23 13:12:50 +09007517 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007518 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007519 if originalVariant.GetOverriddenBy() != "" {
7520 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7521 }
7522 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7523 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7524 }
7525
Spandan Das50801e22024-05-13 18:29:45 +00007526 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007527 apexRule := module.Rule("apexRule")
7528 copyCmds := apexRule.Args["copy_commands"]
7529
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007530 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7531 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007532
markchien7c803b82021-08-26 22:10:06 +08007533 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007534 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007535
Daniel Norman5a3ce132021-08-26 15:44:43 -07007536 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7537 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7538
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007539 apexBundle := module.Module().(*apexBundle)
7540 name := apexBundle.Name()
7541 if name != "override_myapex" {
7542 t.Errorf("name should be \"override_myapex\", but was %q", name)
7543 }
7544
Baligh Uddin004d7172020-02-19 21:29:28 -08007545 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7546 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7547 }
7548
Jiyong Park20bacab2020-03-03 11:45:41 +09007549 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007550 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007551 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7552
7553 signApkRule := module.Rule("signapk")
7554 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007555
Colin Crossaa255532020-07-03 13:18:24 -07007556 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007557 var builder strings.Builder
7558 data.Custom(&builder, name, "TARGET_", "", data)
7559 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007560 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7561 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007562 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007563 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007564 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007565 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007566 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007567 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007568}
7569
Albert Martineefabcf2022-03-21 20:11:16 +00007570func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007571 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007572 // Override from 29 to 31
7573 minSdkOverride31 := "31"
7574 ctx := testApex(t, `
7575 apex {
7576 name: "myapex",
7577 key: "myapex.key",
7578 native_shared_libs: ["mylib"],
7579 updatable: true,
7580 min_sdk_version: "29"
7581 }
7582
7583 override_apex {
7584 name: "override_myapex",
7585 base: "myapex",
7586 logging_parent: "com.foo.bar",
7587 package_name: "test.overridden.package"
7588 }
7589
7590 apex_key {
7591 name: "myapex.key",
7592 public_key: "testkey.avbpubkey",
7593 private_key: "testkey.pem",
7594 }
7595
7596 cc_library {
7597 name: "mylib",
7598 srcs: ["mylib.cpp"],
7599 runtime_libs: ["libbar"],
7600 system_shared_libs: [],
7601 stl: "none",
7602 apex_available: [ "myapex" ],
7603 min_sdk_version: "apex_inherit"
7604 }
7605
7606 cc_library {
7607 name: "libbar",
7608 srcs: ["mylib.cpp"],
7609 system_shared_libs: [],
7610 stl: "none",
7611 apex_available: [ "myapex" ],
7612 min_sdk_version: "apex_inherit"
7613 }
7614
7615 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7616
Jooyung Hana0503a52023-08-23 13:12:50 +09007617 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007618 copyCmds := apexRule.Args["copy_commands"]
7619
7620 // Ensure that direct non-stubs dep is always included
7621 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7622
7623 // Ensure that runtime_libs dep in included
7624 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7625
7626 // Ensure libraries target overridden min_sdk_version value
7627 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7628}
7629
7630func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007631 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007632 // Attempt to override from 31 to 29, should be a NOOP
7633 minSdkOverride29 := "29"
7634 ctx := testApex(t, `
7635 apex {
7636 name: "myapex",
7637 key: "myapex.key",
7638 native_shared_libs: ["mylib"],
7639 updatable: true,
7640 min_sdk_version: "31"
7641 }
7642
7643 override_apex {
7644 name: "override_myapex",
7645 base: "myapex",
7646 logging_parent: "com.foo.bar",
7647 package_name: "test.overridden.package"
7648 }
7649
7650 apex_key {
7651 name: "myapex.key",
7652 public_key: "testkey.avbpubkey",
7653 private_key: "testkey.pem",
7654 }
7655
7656 cc_library {
7657 name: "mylib",
7658 srcs: ["mylib.cpp"],
7659 runtime_libs: ["libbar"],
7660 system_shared_libs: [],
7661 stl: "none",
7662 apex_available: [ "myapex" ],
7663 min_sdk_version: "apex_inherit"
7664 }
7665
7666 cc_library {
7667 name: "libbar",
7668 srcs: ["mylib.cpp"],
7669 system_shared_libs: [],
7670 stl: "none",
7671 apex_available: [ "myapex" ],
7672 min_sdk_version: "apex_inherit"
7673 }
7674
7675 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7676
Jooyung Hana0503a52023-08-23 13:12:50 +09007677 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007678 copyCmds := apexRule.Args["copy_commands"]
7679
7680 // Ensure that direct non-stubs dep is always included
7681 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7682
7683 // Ensure that runtime_libs dep in included
7684 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7685
7686 // Ensure libraries target the original min_sdk_version value rather than the overridden
7687 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7688}
7689
Jooyung Han214bf372019-11-12 13:03:50 +09007690func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007691 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007692 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007693 apex {
7694 name: "myapex",
7695 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007696 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007697 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007698 }
7699
7700 apex_key {
7701 name: "myapex.key",
7702 public_key: "testkey.avbpubkey",
7703 private_key: "testkey.pem",
7704 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007705
7706 cc_library {
7707 name: "mylib",
7708 srcs: ["mylib.cpp"],
7709 stl: "libc++",
7710 system_shared_libs: [],
7711 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007712 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007713 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007714 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007715
Jooyung Hana0503a52023-08-23 13:12:50 +09007716 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007717 args := module.Rule("apexRule").Args
7718 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007719
7720 // The copies of the libraries in the apex should have one more dependency than
7721 // the ones outside the apex, namely the unwinder. Ideally we should check
7722 // the dependency names directly here but for some reason the names are blank in
7723 // this test.
7724 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007725 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007726 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7727 if len(apexImplicits) != len(nonApexImplicits)+1 {
7728 t.Errorf("%q missing unwinder dep", lib)
7729 }
7730 }
Jooyung Han214bf372019-11-12 13:03:50 +09007731}
7732
Paul Duffine05480a2021-03-08 15:07:14 +00007733var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007734 "api/current.txt": nil,
7735 "api/removed.txt": nil,
7736 "api/system-current.txt": nil,
7737 "api/system-removed.txt": nil,
7738 "api/test-current.txt": nil,
7739 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007740
Anton Hanssondff2c782020-12-21 17:10:01 +00007741 "100/public/api/foo.txt": nil,
7742 "100/public/api/foo-removed.txt": nil,
7743 "100/system/api/foo.txt": nil,
7744 "100/system/api/foo-removed.txt": nil,
7745
Paul Duffineedc5d52020-06-12 17:46:39 +01007746 // For java_sdk_library_import
7747 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007748}
7749
Jooyung Han58f26ab2019-12-18 15:34:32 +09007750func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007751 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007752 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007753 apex {
7754 name: "myapex",
7755 key: "myapex.key",
7756 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007757 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007758 }
7759
7760 apex_key {
7761 name: "myapex.key",
7762 public_key: "testkey.avbpubkey",
7763 private_key: "testkey.pem",
7764 }
7765
7766 java_sdk_library {
7767 name: "foo",
7768 srcs: ["a.java"],
7769 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007770 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007771 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007772
7773 prebuilt_apis {
7774 name: "sdk",
7775 api_dirs: ["100"],
7776 }
Paul Duffin9b879592020-05-26 13:21:35 +01007777 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007778
7779 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007780 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007781 "javalib/foo.jar",
7782 "etc/permissions/foo.xml",
7783 })
7784 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007785 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7786 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7787 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007788}
7789
Spandan Das3ee19692024-06-19 04:47:40 +00007790func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007791 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007792 ctx := testApex(t, `
7793 override_apex {
7794 name: "mycompanyapex",
7795 base: "myapex",
7796 }
7797 apex {
7798 name: "myapex",
7799 key: "myapex.key",
7800 java_libs: ["foo"],
7801 updatable: false,
7802 }
7803
7804 apex_key {
7805 name: "myapex.key",
7806 public_key: "testkey.avbpubkey",
7807 private_key: "testkey.pem",
7808 }
7809
7810 java_sdk_library {
7811 name: "foo",
7812 srcs: ["a.java"],
7813 api_packages: ["foo"],
7814 apex_available: [ "myapex" ],
7815 }
7816
7817 prebuilt_apis {
7818 name: "sdk",
7819 api_dirs: ["100"],
7820 }
7821 `, withFiles(filesForSdkLibrary))
7822
7823 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7824 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7825 // (com.android.foo), the filepath should not contain override apex name.
7826 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7827 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7828 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7829}
7830
Paul Duffin9b879592020-05-26 13:21:35 +01007831func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007832 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007833 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007834 apex {
7835 name: "myapex",
7836 key: "myapex.key",
7837 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007838 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007839 }
7840
7841 apex_key {
7842 name: "myapex.key",
7843 public_key: "testkey.avbpubkey",
7844 private_key: "testkey.pem",
7845 }
7846
7847 java_sdk_library {
7848 name: "foo",
7849 srcs: ["a.java"],
7850 api_packages: ["foo"],
7851 apex_available: ["myapex"],
7852 sdk_version: "none",
7853 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007854 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007855 }
7856
7857 java_library {
7858 name: "bar",
7859 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007860 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007861 apex_available: ["myapex"],
7862 sdk_version: "none",
7863 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007864 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007865 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007866
7867 prebuilt_apis {
7868 name: "sdk",
7869 api_dirs: ["100"],
7870 }
Paul Duffin9b879592020-05-26 13:21:35 +01007871 `, withFiles(filesForSdkLibrary))
7872
7873 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007874 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007875 "javalib/bar.jar",
7876 "javalib/foo.jar",
7877 "etc/permissions/foo.xml",
7878 })
7879
7880 // The bar library should depend on the implementation jar.
7881 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007882 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007883 t.Errorf("expected %q, found %#q", expected, actual)
7884 }
7885}
7886
7887func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007888 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007889 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007890 apex {
7891 name: "myapex",
7892 key: "myapex.key",
7893 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007894 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007895 }
7896
7897 apex_key {
7898 name: "myapex.key",
7899 public_key: "testkey.avbpubkey",
7900 private_key: "testkey.pem",
7901 }
7902
7903 java_sdk_library {
7904 name: "foo",
7905 srcs: ["a.java"],
7906 api_packages: ["foo"],
7907 apex_available: ["myapex"],
7908 sdk_version: "none",
7909 system_modules: "none",
7910 }
7911
7912 java_library {
7913 name: "bar",
7914 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007915 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007916 sdk_version: "none",
7917 system_modules: "none",
7918 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007919
7920 prebuilt_apis {
7921 name: "sdk",
7922 api_dirs: ["100"],
7923 }
Paul Duffin9b879592020-05-26 13:21:35 +01007924 `, withFiles(filesForSdkLibrary))
7925
7926 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007927 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007928 "javalib/foo.jar",
7929 "etc/permissions/foo.xml",
7930 })
7931
7932 // The bar library should depend on the stubs jar.
7933 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007934 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007935 t.Errorf("expected %q, found %#q", expected, actual)
7936 }
7937}
7938
Paul Duffineedc5d52020-06-12 17:46:39 +01007939func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007940 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007941 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007942 prebuilt_apis {
7943 name: "sdk",
7944 api_dirs: ["100"],
7945 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007946 withFiles(map[string][]byte{
7947 "apex/a.java": nil,
7948 "apex/apex_manifest.json": nil,
7949 "apex/Android.bp": []byte(`
7950 package {
7951 default_visibility: ["//visibility:private"],
7952 }
7953
7954 apex {
7955 name: "myapex",
7956 key: "myapex.key",
7957 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007958 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007959 }
7960
7961 apex_key {
7962 name: "myapex.key",
7963 public_key: "testkey.avbpubkey",
7964 private_key: "testkey.pem",
7965 }
7966
7967 java_library {
7968 name: "bar",
7969 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007970 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007971 apex_available: ["myapex"],
7972 sdk_version: "none",
7973 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007974 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007975 }
7976`),
7977 "source/a.java": nil,
7978 "source/api/current.txt": nil,
7979 "source/api/removed.txt": nil,
7980 "source/Android.bp": []byte(`
7981 package {
7982 default_visibility: ["//visibility:private"],
7983 }
7984
7985 java_sdk_library {
7986 name: "foo",
7987 visibility: ["//apex"],
7988 srcs: ["a.java"],
7989 api_packages: ["foo"],
7990 apex_available: ["myapex"],
7991 sdk_version: "none",
7992 system_modules: "none",
7993 public: {
7994 enabled: true,
7995 },
Colin Crosse4f34882024-11-14 12:26:00 -08007996 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007997 }
7998`),
7999 "prebuilt/a.jar": nil,
8000 "prebuilt/Android.bp": []byte(`
8001 package {
8002 default_visibility: ["//visibility:private"],
8003 }
8004
8005 java_sdk_library_import {
8006 name: "foo",
8007 visibility: ["//apex", "//source"],
8008 apex_available: ["myapex"],
8009 prefer: true,
8010 public: {
8011 jars: ["a.jar"],
8012 },
Colin Crosse4f34882024-11-14 12:26:00 -08008013 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008014 }
8015`),
Anton Hanssondff2c782020-12-21 17:10:01 +00008016 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01008017 )
8018
8019 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09008020 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01008021 "javalib/bar.jar",
8022 "javalib/foo.jar",
8023 "etc/permissions/foo.xml",
8024 })
8025
8026 // The bar library should depend on the implementation jar.
8027 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00008028 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01008029 t.Errorf("expected %q, found %#q", expected, actual)
8030 }
8031}
8032
8033func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008034 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01008035 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
8036 apex {
8037 name: "myapex",
8038 key: "myapex.key",
8039 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008040 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008041 }
8042
8043 apex_key {
8044 name: "myapex.key",
8045 public_key: "testkey.avbpubkey",
8046 private_key: "testkey.pem",
8047 }
8048
8049 java_sdk_library_import {
8050 name: "foo",
8051 apex_available: ["myapex"],
8052 prefer: true,
8053 public: {
8054 jars: ["a.jar"],
8055 },
8056 }
8057
8058 `, withFiles(filesForSdkLibrary))
8059}
8060
atrost6e126252020-01-27 17:01:16 +00008061func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008062 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01008063 result := android.GroupFixturePreparers(
8064 prepareForApexTest,
8065 java.PrepareForTestWithPlatformCompatConfig,
8066 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00008067 apex {
8068 name: "myapex",
8069 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008070 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008071 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008072 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008073 }
8074
8075 apex_key {
8076 name: "myapex.key",
8077 public_key: "testkey.avbpubkey",
8078 private_key: "testkey.pem",
8079 }
8080
8081 platform_compat_config {
8082 name: "myjar-platform-compat-config",
8083 src: ":myjar",
8084 }
8085
8086 java_library {
8087 name: "myjar",
8088 srcs: ["foo/bar/MyClass.java"],
8089 sdk_version: "none",
8090 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008091 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008092 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008093 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008094
8095 // Make sure that a preferred prebuilt does not affect the apex contents.
8096 prebuilt_platform_compat_config {
8097 name: "myjar-platform-compat-config",
8098 metadata: "compat-config/metadata.xml",
8099 prefer: true,
8100 }
atrost6e126252020-01-27 17:01:16 +00008101 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008102 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008103 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008104 "etc/compatconfig/myjar-platform-compat-config.xml",
8105 "javalib/myjar.jar",
8106 })
8107}
8108
Jooyung Han862c0d62022-12-21 10:15:37 +09008109func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008110 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008111 android.GroupFixturePreparers(
8112 android.PrepareForTestWithAndroidBuildComponents,
8113 PrepareForTestWithApexBuildComponents,
8114 prepareForTestWithMyapex,
8115 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8116 ).
8117 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8118 RunTestWithBp(t, `
8119 apex {
8120 name: "myapex",
8121 key: "myapex.key",
8122 prebuilts: ["foo", "bar"],
8123 updatable: false,
8124 }
8125
8126 apex_key {
8127 name: "myapex.key",
8128 public_key: "testkey.avbpubkey",
8129 private_key: "testkey.pem",
8130 }
8131
8132 prebuilt_etc {
8133 name: "foo",
8134 src: "myprebuilt",
8135 filename_from_src: true,
8136 }
8137
8138 prebuilt_etc {
8139 name: "bar",
8140 src: "myprebuilt",
8141 filename_from_src: true,
8142 }
8143 `)
8144}
8145
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008146func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008147 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008148 bp := `
8149 apex {
8150 name: "myapex",
8151 key: "myapex.key",
8152 native_shared_libs: ["libfoo"],
8153 updatable: false,
8154 unwanted_transitive_deps: ["libbar"],
8155 }
8156
8157 apex_key {
8158 name: "myapex.key",
8159 public_key: "testkey.avbpubkey",
8160 private_key: "testkey.pem",
8161 }
8162
8163 cc_library {
8164 name: "libfoo",
8165 srcs: ["foo.cpp"],
8166 shared_libs: ["libbar"],
8167 apex_available: ["myapex"],
8168 }
8169
8170 cc_library {
8171 name: "libbar",
8172 srcs: ["bar.cpp"],
8173 apex_available: ["myapex"],
8174 }`
8175 ctx := testApex(t, bp)
8176 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8177 "*/libc++.so",
8178 "*/libfoo.so",
8179 // not libbar.so
8180 })
8181}
8182
Jiyong Park479321d2019-12-16 11:47:12 +09008183func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008184 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008185 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8186 apex {
8187 name: "myapex",
8188 key: "myapex.key",
8189 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008190 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008191 }
8192
8193 apex_key {
8194 name: "myapex.key",
8195 public_key: "testkey.avbpubkey",
8196 private_key: "testkey.pem",
8197 }
8198
8199 java_library {
8200 name: "myjar",
8201 srcs: ["foo/bar/MyClass.java"],
8202 sdk_version: "none",
8203 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008204 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008205 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008206 }
8207 `)
8208}
8209
Jiyong Park7cd10e32020-01-14 09:22:18 +09008210func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008211 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008212 bp := `
8213 apex {
8214 name: "myapex",
8215 key: "myapex.key",
8216 native_shared_libs: ["mylib"],
8217 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008218 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008219 }
8220
Jiyong Park9d677202020-02-19 16:29:35 +09008221 apex {
8222 name: "myapex.updatable",
8223 key: "myapex.key",
8224 native_shared_libs: ["mylib"],
8225 java_libs: ["myjar"],
8226 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008227 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008228 }
8229
Jiyong Park7cd10e32020-01-14 09:22:18 +09008230 apex_key {
8231 name: "myapex.key",
8232 public_key: "testkey.avbpubkey",
8233 private_key: "testkey.pem",
8234 }
8235
8236 cc_library {
8237 name: "mylib",
8238 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008239 shared_libs: [
8240 "myotherlib",
8241 "myotherlib_ext",
8242 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008243 system_shared_libs: [],
8244 stl: "none",
8245 apex_available: [
8246 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008247 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008248 "//apex_available:platform",
8249 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008250 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008251 }
8252
8253 cc_library {
8254 name: "myotherlib",
8255 srcs: ["mylib.cpp"],
8256 system_shared_libs: [],
8257 stl: "none",
8258 apex_available: [
8259 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008260 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008261 "//apex_available:platform",
8262 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008263 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008264 }
8265
Jiyong Parkce243632023-02-17 18:22:25 +09008266 cc_library {
8267 name: "myotherlib_ext",
8268 srcs: ["mylib.cpp"],
8269 system_shared_libs: [],
8270 system_ext_specific: true,
8271 stl: "none",
8272 apex_available: [
8273 "myapex",
8274 "myapex.updatable",
8275 "//apex_available:platform",
8276 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008277 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008278 }
8279
Jiyong Park7cd10e32020-01-14 09:22:18 +09008280 java_library {
8281 name: "myjar",
8282 srcs: ["foo/bar/MyClass.java"],
8283 sdk_version: "none",
8284 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008285 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008286 apex_available: [
8287 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008288 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008289 "//apex_available:platform",
8290 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008291 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008292 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008293 }
8294
8295 java_library {
8296 name: "myotherjar",
8297 srcs: ["foo/bar/MyClass.java"],
8298 sdk_version: "none",
8299 system_modules: "none",
8300 apex_available: [
8301 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008302 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008303 "//apex_available:platform",
8304 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008305 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008306 }
8307 `
8308
8309 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8310 for _, f := range files {
8311 if f.path == file {
8312 if f.isLink {
8313 t.Errorf("%q is not a real file", file)
8314 }
8315 return
8316 }
8317 }
8318 t.Errorf("%q is not found", file)
8319 }
8320
Jiyong Parkce243632023-02-17 18:22:25 +09008321 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008322 for _, f := range files {
8323 if f.path == file {
8324 if !f.isLink {
8325 t.Errorf("%q is not a symlink", file)
8326 }
Jiyong Parkce243632023-02-17 18:22:25 +09008327 if f.src != target {
8328 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8329 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008330 return
8331 }
8332 }
8333 t.Errorf("%q is not found", file)
8334 }
8335
Jiyong Park9d677202020-02-19 16:29:35 +09008336 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8337 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008338 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008339 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008340 ensureRealfileExists(t, files, "javalib/myjar.jar")
8341 ensureRealfileExists(t, files, "lib64/mylib.so")
8342 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008343 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008344
Jooyung Hana0503a52023-08-23 13:12:50 +09008345 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008346 ensureRealfileExists(t, files, "javalib/myjar.jar")
8347 ensureRealfileExists(t, files, "lib64/mylib.so")
8348 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008349 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008350
8351 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008352 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008353 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008354 ensureRealfileExists(t, files, "javalib/myjar.jar")
8355 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008356 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8357 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008358
Jooyung Hana0503a52023-08-23 13:12:50 +09008359 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008360 ensureRealfileExists(t, files, "javalib/myjar.jar")
8361 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008362 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8363 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008364}
8365
Yo Chiange8128052020-07-23 20:09:18 +08008366func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008367 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008368 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008369 apex {
8370 name: "myapex",
8371 key: "myapex.key",
8372 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008373 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008374 }
8375
8376 apex_key {
8377 name: "myapex.key",
8378 public_key: "testkey.avbpubkey",
8379 private_key: "testkey.pem",
8380 }
8381
8382 cc_library_shared {
8383 name: "mylib",
8384 srcs: ["mylib.cpp"],
8385 shared_libs: ["myotherlib"],
8386 system_shared_libs: [],
8387 stl: "none",
8388 apex_available: [
8389 "myapex",
8390 "//apex_available:platform",
8391 ],
8392 }
8393
8394 cc_prebuilt_library_shared {
8395 name: "myotherlib",
8396 srcs: ["prebuilt.so"],
8397 system_shared_libs: [],
8398 stl: "none",
8399 apex_available: [
8400 "myapex",
8401 "//apex_available:platform",
8402 ],
8403 }
8404 `)
8405
Jooyung Hana0503a52023-08-23 13:12:50 +09008406 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008407 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008408 var builder strings.Builder
8409 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8410 androidMk := builder.String()
8411 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008412 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008413 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8414 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8415 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008416 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008417}
8418
Jooyung Han643adc42020-02-27 13:50:06 +09008419func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008420 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008421 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008422 apex {
8423 name: "myapex",
8424 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008425 binaries: ["mybin"],
8426 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008427 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008428 }
8429
8430 apex_key {
8431 name: "myapex.key",
8432 public_key: "testkey.avbpubkey",
8433 private_key: "testkey.pem",
8434 }
8435
8436 cc_library {
8437 name: "mylib",
8438 srcs: ["mylib.cpp"],
8439 shared_libs: ["mylib2"],
8440 system_shared_libs: [],
8441 stl: "none",
8442 apex_available: [ "myapex" ],
8443 }
8444
8445 cc_library {
8446 name: "mylib2",
8447 srcs: ["mylib.cpp"],
8448 system_shared_libs: [],
8449 stl: "none",
8450 apex_available: [ "myapex" ],
8451 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008452
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008453 // Used as both a JNI library and a regular shared library.
8454 cc_library {
8455 name: "mylib3",
8456 srcs: ["mylib.cpp"],
8457 system_shared_libs: [],
8458 stl: "none",
8459 apex_available: [ "myapex" ],
8460 }
8461
8462 cc_binary {
8463 name: "mybin",
8464 srcs: ["mybin.cpp"],
8465 shared_libs: ["mylib3"],
8466 system_shared_libs: [],
8467 stl: "none",
8468 apex_available: [ "myapex" ],
8469 }
8470
Jiyong Park34d5c332022-02-24 18:02:44 +09008471 rust_ffi_shared {
8472 name: "libfoo.rust",
8473 crate_name: "foo",
8474 srcs: ["foo.rs"],
8475 shared_libs: ["libfoo.shared_from_rust"],
8476 prefer_rlib: true,
8477 apex_available: ["myapex"],
8478 }
8479
8480 cc_library_shared {
8481 name: "libfoo.shared_from_rust",
8482 srcs: ["mylib.cpp"],
8483 system_shared_libs: [],
8484 stl: "none",
8485 stubs: {
8486 versions: ["10", "11", "12"],
8487 },
8488 }
8489
Jooyung Han643adc42020-02-27 13:50:06 +09008490 `)
8491
Jooyung Hana0503a52023-08-23 13:12:50 +09008492 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008493 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008494 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008495 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008496 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008497 "lib64/mylib.so",
8498 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008499 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008500 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008501 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008502
8503 // b/220397949
8504 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008505}
8506
Jooyung Han49f67012020-04-17 13:43:10 +09008507func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008508 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008509 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008510 apex {
8511 name: "myapex",
8512 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008513 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008514 }
8515 apex_key {
8516 name: "myapex.key",
8517 public_key: "testkey.avbpubkey",
8518 private_key: "testkey.pem",
8519 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008520 `,
8521 android.FixtureModifyConfig(func(config android.Config) {
8522 delete(config.Targets, android.Android)
8523 config.AndroidCommonTarget = android.Target{}
8524 }),
8525 )
Jooyung Han49f67012020-04-17 13:43:10 +09008526
8527 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8528 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8529 }
8530}
8531
Jiyong Parkbd159612020-02-28 15:22:21 +09008532func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008533 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008534 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008535 apex {
8536 name: "myapex",
8537 key: "myapex.key",
8538 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008539 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008540 }
8541
8542 apex_key {
8543 name: "myapex.key",
8544 public_key: "testkey.avbpubkey",
8545 private_key: "testkey.pem",
8546 }
8547
8548 android_app {
8549 name: "AppFoo",
8550 srcs: ["foo/bar/MyClass.java"],
8551 sdk_version: "none",
8552 system_modules: "none",
8553 apex_available: [ "myapex" ],
8554 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008555 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008556
Jooyung Hana0503a52023-08-23 13:12:50 +09008557 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008558 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008559
8560 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008561 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 +09008562}
8563
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008564func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008565 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008566 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008567 apex {
8568 name: "myapex",
8569 key: "myapex.key",
8570 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008571 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008572 }
8573
8574 apex_key {
8575 name: "myapex.key",
8576 public_key: "testkey.avbpubkey",
8577 private_key: "testkey.pem",
8578 }
8579
8580 android_app_set {
8581 name: "AppSet",
8582 set: "AppSet.apks",
8583 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008584 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008585 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008586 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008587 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8588 s := mod.Rule("apexRule").Args["copy_commands"]
8589 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008590 if len(copyCmds) != 4 {
8591 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008592 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008593 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8594 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008595 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8596 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008597
8598 // Ensure that canned_fs_config has an entry for the app set zip file
8599 generateFsRule := mod.Rule("generateFsConfig")
8600 cmd := generateFsRule.RuleParams.Command
8601 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008602}
8603
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008604func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008605 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008606 apex_set {
8607 name: "myapex",
8608 filename: "foo_v2.apex",
8609 sanitized: {
8610 none: { set: "myapex.apks", },
8611 hwaddress: { set: "myapex.hwasan.apks", },
8612 },
Paul Duffin24704672021-04-06 16:09:30 +01008613 }
8614 `
8615 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008616
Paul Duffin24704672021-04-06 16:09:30 +01008617 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008618 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008619
Spandan Das9d6e2092024-09-21 02:50:00 +00008620 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008621 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008622
Paul Duffin24704672021-04-06 16:09:30 +01008623 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8624
8625 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008626 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8627 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008628
8629 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008630}
8631
Pranav Guptaeba03b02022-09-27 00:27:08 +00008632func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008633 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008634 ctx := testApex(t, `
8635 apex_set {
8636 name: "myapex",
8637 set: ":myapex_apks_file",
8638 }
8639
8640 filegroup {
8641 name: "myapex_apks_file",
8642 srcs: ["myapex.apks"],
8643 }
8644 `)
8645
Spandan Das9d6e2092024-09-21 02:50:00 +00008646 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008647
8648 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008649 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008650 extractedApex := m.Output(extractorOutput)
8651
8652 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8653}
8654
Paul Duffin89f570a2021-06-16 01:42:33 +01008655func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008656 t.Helper()
8657
Paul Duffin55607122021-03-30 23:32:51 +01008658 fs := android.MockFS{
8659 "a.java": nil,
8660 "a.jar": nil,
8661 "apex_manifest.json": nil,
8662 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008663 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008664 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8665 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8666 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008667 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008668 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008669
Paul Duffin55607122021-03-30 23:32:51 +01008670 errorHandler := android.FixtureExpectsNoErrors
8671 if errmsg != "" {
8672 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008673 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008674
Paul Duffin55607122021-03-30 23:32:51 +01008675 result := android.GroupFixturePreparers(
8676 cc.PrepareForTestWithCcDefaultModules,
8677 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008678 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008679 java.PrepareForTestWithJavaSdkLibraryFiles,
8680 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008681 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008682 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008683 android.FixtureModifyMockFS(func(fs android.MockFS) {
8684 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8685 insert := ""
8686 for _, fragment := range fragments {
8687 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8688 }
8689 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8690 platform_bootclasspath {
8691 name: "platform-bootclasspath",
8692 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008693 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008694 %s
8695 ],
8696 }
8697 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008698 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008699 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008700 // Dexpreopt for boot jars requires the ART boot image profile.
8701 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8702 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008703 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008704 ).
8705 ExtendWithErrorHandler(errorHandler).
8706 RunTestWithBp(t, bp)
8707
8708 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008709}
8710
Jooyung Han548640b2020-04-27 12:10:30 +09008711func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008712 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008713 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8714 apex {
8715 name: "myapex",
8716 key: "myapex.key",
8717 updatable: true,
8718 }
8719
8720 apex_key {
8721 name: "myapex.key",
8722 public_key: "testkey.avbpubkey",
8723 private_key: "testkey.pem",
8724 }
8725 `)
8726}
8727
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008728func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008729 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008730 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8731 apex {
8732 name: "myapex",
8733 key: "myapex.key",
8734 }
8735
8736 apex_key {
8737 name: "myapex.key",
8738 public_key: "testkey.avbpubkey",
8739 private_key: "testkey.pem",
8740 }
8741 `)
8742}
8743
satayevb98371c2021-06-15 16:49:50 +01008744func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008745 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008746 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8747 apex {
8748 name: "myapex",
8749 key: "myapex.key",
8750 systemserverclasspath_fragments: [
8751 "mysystemserverclasspathfragment",
8752 ],
8753 min_sdk_version: "29",
8754 updatable: true,
8755 }
8756
8757 apex_key {
8758 name: "myapex.key",
8759 public_key: "testkey.avbpubkey",
8760 private_key: "testkey.pem",
8761 }
8762
8763 java_library {
8764 name: "foo",
8765 srcs: ["b.java"],
8766 min_sdk_version: "29",
8767 installable: true,
8768 apex_available: [
8769 "myapex",
8770 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008771 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008772 }
8773
8774 systemserverclasspath_fragment {
8775 name: "mysystemserverclasspathfragment",
8776 generate_classpaths_proto: false,
8777 contents: [
8778 "foo",
8779 ],
8780 apex_available: [
8781 "myapex",
8782 ],
8783 }
satayevabcd5972021-08-06 17:49:46 +01008784 `,
8785 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8786 )
satayevb98371c2021-06-15 16:49:50 +01008787}
8788
Paul Duffin064b70c2020-11-02 17:32:38 +00008789func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008790 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008791 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008792 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008793 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008794 fragment := java.ApexVariantReference{
8795 Apex: proptools.StringPtr("myapex"),
8796 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8797 }
8798
Paul Duffin064b70c2020-11-02 17:32:38 +00008799 testDexpreoptWithApexes(t, `
8800 prebuilt_apex {
8801 name: "myapex" ,
8802 arch: {
8803 arm64: {
8804 src: "myapex-arm64.apex",
8805 },
8806 arm: {
8807 src: "myapex-arm.apex",
8808 },
8809 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008810 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8811 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008812
Paul Duffin89f570a2021-06-16 01:42:33 +01008813 prebuilt_bootclasspath_fragment {
8814 name: "my-bootclasspath-fragment",
8815 contents: ["libfoo"],
8816 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008817 hidden_api: {
8818 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8819 metadata: "my-bootclasspath-fragment/metadata.csv",
8820 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008821 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8822 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8823 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008824 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008825 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008826
Spandan Das52c01a12024-09-20 01:09:48 +00008827 java_sdk_library_import {
8828 name: "libfoo",
8829 prefer: true,
8830 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008831 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008832 },
8833 apex_available: ["myapex"],
8834 shared_library: false,
8835 permitted_packages: ["libfoo"],
8836 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008837 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008838 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008839}
8840
Spandan Dasf14e2542021-11-12 00:01:37 +00008841func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008842 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008843 bp += `
8844 apex_key {
8845 name: "myapex.key",
8846 public_key: "testkey.avbpubkey",
8847 private_key: "testkey.pem",
8848 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008849 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008850 "lib1/src/A.java": nil,
8851 "lib2/src/B.java": nil,
8852 "system/sepolicy/apex/myapex-file_contexts": nil,
8853 }
8854
Paul Duffin45338f02021-03-30 23:07:52 +01008855 errorHandler := android.FixtureExpectsNoErrors
8856 if errmsg != "" {
8857 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008858 }
Colin Crossae8600b2020-10-29 17:09:13 -07008859
Paul Duffin45338f02021-03-30 23:07:52 +01008860 android.GroupFixturePreparers(
8861 android.PrepareForTestWithAndroidBuildComponents,
8862 java.PrepareForTestWithJavaBuildComponents,
8863 PrepareForTestWithApexBuildComponents,
8864 android.PrepareForTestWithNeverallowRules(rules),
8865 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008866 apexBootJars := make([]string, 0, len(bootJars))
8867 for _, apexBootJar := range bootJars {
8868 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008869 }
satayevd604b212021-07-21 14:23:52 +01008870 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008871 }),
8872 fs.AddToFixture(),
8873 ).
8874 ExtendWithErrorHandler(errorHandler).
8875 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008876}
8877
8878func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008879 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008880 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008881 name string
8882 expectedError string
8883 bp string
8884 bootJars []string
8885 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008886 }{
8887
8888 {
8889 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8890 expectedError: "",
8891 bp: `
8892 java_library {
8893 name: "bcp_lib1",
8894 srcs: ["lib1/src/*.java"],
8895 permitted_packages: ["foo.bar"],
8896 apex_available: ["myapex"],
8897 sdk_version: "none",
8898 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008899 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008900 }
8901 java_library {
8902 name: "nonbcp_lib2",
8903 srcs: ["lib2/src/*.java"],
8904 apex_available: ["myapex"],
8905 permitted_packages: ["a.b"],
8906 sdk_version: "none",
8907 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008908 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008909 }
8910 apex {
8911 name: "myapex",
8912 key: "myapex.key",
8913 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008914 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008915 }`,
8916 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008917 bcpPermittedPackages: map[string][]string{
8918 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008919 "foo.bar",
8920 },
8921 },
8922 },
8923 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008924 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008925 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 +01008926 bp: `
8927 java_library {
8928 name: "bcp_lib1",
8929 srcs: ["lib1/src/*.java"],
8930 apex_available: ["myapex"],
8931 permitted_packages: ["foo.bar"],
8932 sdk_version: "none",
8933 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008934 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008935 }
8936 java_library {
8937 name: "bcp_lib2",
8938 srcs: ["lib2/src/*.java"],
8939 apex_available: ["myapex"],
8940 permitted_packages: ["foo.bar", "bar.baz"],
8941 sdk_version: "none",
8942 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008943 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008944 }
8945 apex {
8946 name: "myapex",
8947 key: "myapex.key",
8948 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008949 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008950 }
8951 `,
8952 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008953 bcpPermittedPackages: map[string][]string{
8954 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008955 "foo.bar",
8956 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008957 "bcp_lib2": []string{
8958 "foo.bar",
8959 },
8960 },
8961 },
8962 {
8963 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8964 expectedError: "",
8965 bp: `
8966 java_library {
8967 name: "bcp_lib_restricted",
8968 srcs: ["lib1/src/*.java"],
8969 apex_available: ["myapex"],
8970 permitted_packages: ["foo.bar"],
8971 sdk_version: "none",
8972 min_sdk_version: "29",
8973 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008974 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008975 }
8976 java_library {
8977 name: "bcp_lib_unrestricted",
8978 srcs: ["lib2/src/*.java"],
8979 apex_available: ["myapex"],
8980 permitted_packages: ["foo.bar", "bar.baz"],
8981 sdk_version: "none",
8982 min_sdk_version: "29",
8983 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008984 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008985 }
8986 apex {
8987 name: "myapex",
8988 key: "myapex.key",
8989 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8990 updatable: true,
8991 min_sdk_version: "29",
8992 }
8993 `,
8994 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8995 bcpPermittedPackages: map[string][]string{
8996 "bcp_lib1_non_updateable": []string{
8997 "foo.bar",
8998 },
8999 // 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 +01009000 },
9001 },
9002 }
9003 for _, tc := range testcases {
9004 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009005 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00009006 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9007 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009008 })
9009 }
9010}
9011
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009012// TODO(jungjw): Move this to proptools
9013func intPtr(i int) *int {
9014 return &i
9015}
9016
9017func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009018 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009019 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009020 apex_set {
9021 name: "myapex",
9022 set: "myapex.apks",
9023 filename: "foo_v2.apex",
9024 overrides: ["foo"],
9025 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009026 `,
9027 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9028 variables.Platform_sdk_version = intPtr(30)
9029 }),
9030 android.FixtureModifyConfig(func(config android.Config) {
9031 config.Targets[android.Android] = []android.Target{
9032 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9033 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9034 }
9035 }),
9036 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009037
Spandan Das9d6e2092024-09-21 02:50:00 +00009038 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009039
9040 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009041 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009042 actual := extractedApex.Args["abis"]
9043 expected := "ARMEABI_V7A,ARM64_V8A"
9044 if actual != expected {
9045 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9046 }
9047 actual = extractedApex.Args["sdk-version"]
9048 expected = "30"
9049 if actual != expected {
9050 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9051 }
9052
Paul Duffin6717d882021-06-15 19:09:41 +01009053 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009054 a := m.Module().(*ApexSet)
9055 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009056 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009057 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9058 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9059 }
9060}
9061
Anton Hansson805e0a52022-11-25 14:06:46 +00009062func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009063 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00009064 ctx := testApex(t, `
9065 apex_set {
9066 name: "myapex",
9067 set: "myapex.apks",
9068 filename: "foo_v2.apex",
9069 overrides: ["foo"],
9070 }
9071 `,
9072 android.FixtureModifyConfig(func(config android.Config) {
9073 config.Targets[android.Android] = []android.Target{
9074 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9075 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9076 }
9077 }),
9078 )
9079
Spandan Das9d6e2092024-09-21 02:50:00 +00009080 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009081
9082 // Check extract_apks tool parameters. No native bridge arch expected
9083 extractedApex := m.Output("extracted/myapex.apks")
9084 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9085}
9086
Jiyong Park7d95a512020-05-10 15:16:24 +09009087func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009088 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009089 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9090 apex {
9091 name: "myapex",
9092 key: "myapex.key",
9093 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009094 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009095 }
9096
9097 apex_key {
9098 name: "myapex.key",
9099 public_key: "testkey.avbpubkey",
9100 private_key: "testkey.pem",
9101 }
9102
9103 cc_library {
9104 name: "mylib",
9105 srcs: ["mylib.cpp"],
9106 static_libs: ["otherlib"],
9107 system_shared_libs: [],
9108 stl: "none",
9109 apex_available: [ "myapex" ],
9110 }
9111
9112 cc_library {
9113 name: "otherlib",
9114 srcs: ["mylib.cpp"],
9115 system_shared_libs: [],
9116 stl: "none",
9117 stubs: {
9118 versions: ["1", "2", "3"],
9119 },
9120 apex_available: [ "myapex" ],
9121 }
9122 `)
9123}
9124
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009125func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009126 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009127 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009128 apex {
9129 name: "myapex",
9130 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009131 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009132 custom_sign_tool: "sign_myapex",
9133 }
9134
9135 apex_key {
9136 name: "myapex.key",
9137 public_key: "testkey.avbpubkey",
9138 private_key: "testkey.pem",
9139 }
9140 `)
9141
Jooyung Han286957d2023-10-30 16:17:56 +09009142 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009143 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009144 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 +09009145}
9146
9147func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009148 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009149 ctx := testApex(t, `
9150 apex {
9151 name: "myapex",
9152 key: "myapex.key",
9153 updatable: false,
9154 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009155 }
9156
9157 apex_key {
9158 name: "myapex.key",
9159 public_key: "testkey.avbpubkey",
9160 private_key: "testkey.pem",
9161 }
9162
9163 prebuilt_apex {
9164 name: "myapex",
9165 prefer: true,
9166 arch: {
9167 arm64: {
9168 src: "myapex-arm64.apex",
9169 },
9170 arm: {
9171 src: "myapex-arm.apex",
9172 },
9173 },
9174 }
9175
9176 apex_set {
9177 name: "myapex_set",
9178 set: "myapex.apks",
9179 filename: "myapex_set.apex",
9180 overrides: ["myapex"],
9181 }
9182 `)
9183
Colin Crossf61d03d2023-11-02 16:56:39 -07009184 content := android.ContentFromFileRuleForTests(t, ctx,
9185 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009186 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 -07009187 content = android.ContentFromFileRuleForTests(t, ctx,
9188 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009189 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 +09009190}
9191
Jooyung Han938b5932020-06-20 12:47:47 +09009192func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009193 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009194 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009195 apex {
9196 name: "myapex",
9197 key: "myapex.key",
9198 apps: ["app"],
9199 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009200 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009201 }
9202
9203 apex_key {
9204 name: "myapex.key",
9205 public_key: "testkey.avbpubkey",
9206 private_key: "testkey.pem",
9207 }
9208
9209 android_app {
9210 name: "app",
9211 srcs: ["foo/bar/MyClass.java"],
9212 package_name: "foo",
9213 sdk_version: "none",
9214 system_modules: "none",
9215 apex_available: [ "myapex" ],
9216 }
9217 `, withFiles(map[string][]byte{
9218 "sub/Android.bp": []byte(`
9219 override_apex {
9220 name: "override_myapex",
9221 base: "myapex",
9222 apps: ["override_app"],
9223 allowed_files: ":allowed",
9224 }
9225 // Overridable "path" property should be referenced indirectly
9226 filegroup {
9227 name: "allowed",
9228 srcs: ["allowed.txt"],
9229 }
9230 override_android_app {
9231 name: "override_app",
9232 base: "app",
9233 package_name: "bar",
9234 }
9235 `),
9236 }))
9237
Jooyung Hana0503a52023-08-23 13:12:50 +09009238 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009239 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9240 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9241 }
9242
Spandan Das50801e22024-05-13 18:29:45 +00009243 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009244 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9245 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9246 }
9247}
9248
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009249func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009250 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009251 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009252 apex {
9253 name: "myapex",
9254 key: "myapex.key",
9255 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009256 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009257 }
9258
9259 apex_key {
9260 name: "myapex.key",
9261 public_key: "testkey.avbpubkey",
9262 private_key: "testkey.pem",
9263 }
9264
9265 cc_library {
9266 name: "mylib",
9267 srcs: ["mylib.cpp"],
9268 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009269 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009270 },
9271 apex_available: ["myapex"],
9272 }
9273
9274 cc_prebuilt_library_shared {
9275 name: "mylib",
9276 prefer: false,
9277 srcs: ["prebuilt.so"],
9278 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009279 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009280 },
9281 apex_available: ["myapex"],
9282 }
9283 `)
9284}
9285
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009286func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009287 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009288 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009289 apex {
9290 name: "myapex",
9291 key: "myapex.key",
9292 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009293 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009294 }
9295 apex_key {
9296 name: "myapex.key",
9297 public_key: "testkey.avbpubkey",
9298 private_key: "testkey.pem",
9299 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009300 `,
9301 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9302 variables.CompressedApex = proptools.BoolPtr(true)
9303 }),
9304 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009305
Jooyung Hana0503a52023-08-23 13:12:50 +09009306 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009307 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9308
Jooyung Hana0503a52023-08-23 13:12:50 +09009309 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009310 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9311
9312 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009313 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009314 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9315
9316 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009317 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009318 var builder strings.Builder
9319 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9320 androidMk := builder.String()
9321 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9322}
9323
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009324func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9325 t.Parallel()
9326 ctx := testApex(t, `
9327 apex {
9328 name: "myapex",
9329 key: "myapex.key",
9330 compressible: true,
9331 updatable: false,
9332 payload_fs_type: "erofs",
9333 }
9334 apex_key {
9335 name: "myapex.key",
9336 public_key: "testkey.avbpubkey",
9337 private_key: "testkey.pem",
9338 }
9339 `,
9340 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9341 variables.CompressedApex = proptools.BoolPtr(true)
9342 }),
9343 )
9344
9345 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9346 if compressRule.Rule != nil {
9347 t.Error("erofs apex should not be compressed")
9348 }
9349}
9350
Jooyung Han26ec8482024-07-31 15:04:05 +09009351func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009352 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009353 for _, compressionEnabled := range []bool{true, false} {
9354 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009355 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009356 ctx := testApex(t, `
9357 apex_set {
9358 name: "com.company.android.myapex",
9359 apex_name: "com.android.myapex",
9360 set: "company-myapex.apks",
9361 }
9362 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9363 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9364 }),
9365 )
9366
9367 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9368 if compressionEnabled {
9369 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9370 } else {
9371 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9372 }
9373 })
9374 }
9375}
9376
Martin Stjernholm2856c662020-12-02 15:03:42 +00009377func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009378 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009379 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009380 apex {
9381 name: "myapex",
9382 key: "myapex.key",
9383 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009384 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009385 }
9386
9387 apex_key {
9388 name: "myapex.key",
9389 public_key: "testkey.avbpubkey",
9390 private_key: "testkey.pem",
9391 }
9392
9393 cc_library {
9394 name: "mylib",
9395 srcs: ["mylib.cpp"],
9396 apex_available: ["myapex"],
9397 shared_libs: ["otherlib"],
9398 system_shared_libs: [],
9399 }
9400
9401 cc_library {
9402 name: "otherlib",
9403 srcs: ["mylib.cpp"],
9404 stubs: {
9405 versions: ["current"],
9406 },
9407 }
9408
9409 cc_prebuilt_library_shared {
9410 name: "otherlib",
9411 prefer: true,
9412 srcs: ["prebuilt.so"],
9413 stubs: {
9414 versions: ["current"],
9415 },
9416 }
9417 `)
9418
Jooyung Hana0503a52023-08-23 13:12:50 +09009419 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009420 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009421 var builder strings.Builder
9422 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9423 androidMk := builder.String()
9424
9425 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9426 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009427 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009428}
9429
Jiyong Parke3867542020-12-03 17:28:25 +09009430func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009431 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009432 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009433 apex {
9434 name: "myapex",
9435 key: "myapex.key",
9436 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009437 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009438 }
9439
9440 apex_key {
9441 name: "myapex.key",
9442 public_key: "testkey.avbpubkey",
9443 private_key: "testkey.pem",
9444 }
9445
9446 cc_library {
9447 name: "mylib",
9448 srcs: ["mylib.cpp"],
9449 system_shared_libs: [],
9450 stl: "none",
9451 apex_available: ["myapex"],
9452 shared_libs: ["mylib2"],
9453 target: {
9454 apex: {
9455 exclude_shared_libs: ["mylib2"],
9456 },
9457 },
9458 }
9459
9460 cc_library {
9461 name: "mylib2",
9462 srcs: ["mylib.cpp"],
9463 system_shared_libs: [],
9464 stl: "none",
9465 }
9466 `)
9467
9468 // Check if mylib is linked to mylib2 for the non-apex target
9469 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9470 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9471
9472 // Make sure that the link doesn't occur for the apex target
9473 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9474 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9475
9476 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009477 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009478 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9479}
9480
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009481func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009482 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009483 bpBase := `
9484 apex {
9485 name: "myapex",
9486 key: "myapex.key",
9487 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009488 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009489 }
9490 apex_key {
9491 name: "myapex.key",
9492 public_key: "testkey.avbpubkey",
9493 private_key: "testkey.pem",
9494 }
9495 cc_library {
9496 name: "mylib",
9497 srcs: ["mylib.cpp"],
9498 apex_available: ["myapex"],
9499 shared_libs: ["stublib"],
9500 system_shared_libs: [],
9501 }
9502 apex {
9503 name: "otherapex",
9504 enabled: %s,
9505 key: "myapex.key",
9506 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009507 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009508 }
9509 `
9510
9511 stublibSourceBp := `
9512 cc_library {
9513 name: "stublib",
9514 srcs: ["mylib.cpp"],
9515 apex_available: ["otherapex"],
9516 system_shared_libs: [],
9517 stl: "none",
9518 stubs: {
9519 versions: ["1"],
9520 },
9521 }
9522 `
9523
9524 stublibPrebuiltBp := `
9525 cc_prebuilt_library_shared {
9526 name: "stublib",
9527 srcs: ["prebuilt.so"],
9528 apex_available: ["otherapex"],
9529 stubs: {
9530 versions: ["1"],
9531 },
9532 %s
9533 }
9534 `
9535
9536 tests := []struct {
9537 name string
9538 stublibBp string
9539 usePrebuilt bool
9540 modNames []string // Modules to collect AndroidMkEntries for
9541 otherApexEnabled []string
9542 }{
9543 {
9544 name: "only_source",
9545 stublibBp: stublibSourceBp,
9546 usePrebuilt: false,
9547 modNames: []string{"stublib"},
9548 otherApexEnabled: []string{"true", "false"},
9549 },
9550 {
9551 name: "source_preferred",
9552 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9553 usePrebuilt: false,
9554 modNames: []string{"stublib", "prebuilt_stublib"},
9555 otherApexEnabled: []string{"true", "false"},
9556 },
9557 {
9558 name: "prebuilt_preferred",
9559 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9560 usePrebuilt: true,
9561 modNames: []string{"stublib", "prebuilt_stublib"},
9562 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9563 },
9564 {
9565 name: "only_prebuilt",
9566 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9567 usePrebuilt: true,
9568 modNames: []string{"stublib"},
9569 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9570 },
9571 }
9572
9573 for _, test := range tests {
9574 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009575 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009576 for _, otherApexEnabled := range test.otherApexEnabled {
9577 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009578 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009579 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009580
9581 type modAndMkEntries struct {
9582 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009583 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009584 }
9585 entries := []*modAndMkEntries{}
9586
9587 // Gather shared lib modules that are installable
9588 for _, modName := range test.modNames {
9589 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9590 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9591 continue
9592 }
9593 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009594 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009595 continue
9596 }
Yu Liue70976d2024-10-15 20:45:35 +00009597 info := android.AndroidMkInfoForTest(t, ctx, mod)
9598 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9599 ents = append(ents, info.ExtraInfo...)
9600 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009601 if ent.Disabled {
9602 continue
9603 }
9604 entries = append(entries, &modAndMkEntries{
9605 mod: mod,
9606 mkEntries: ent,
9607 })
9608 }
9609 }
9610 }
9611
9612 var entry *modAndMkEntries = nil
9613 for _, ent := range entries {
9614 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9615 if entry != nil {
9616 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9617 } else {
9618 entry = ent
9619 }
9620 }
9621 }
9622
9623 if entry == nil {
9624 t.Errorf("AndroidMk entry for \"stublib\" missing")
9625 } else {
9626 isPrebuilt := entry.mod.Prebuilt() != nil
9627 if isPrebuilt != test.usePrebuilt {
9628 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9629 }
9630 if !entry.mod.IsStubs() {
9631 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9632 }
9633 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9634 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9635 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009636 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009637 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009638 if !android.InList(expected, cflags) {
9639 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9640 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009641 }
9642 })
9643 }
9644 })
9645 }
9646}
9647
Colin Crossc33e5212021-05-25 18:16:02 -07009648func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009649 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009650 bp := `
9651 apex {
9652 name: "myapex",
9653 key: "myapex.key",
9654 java_libs: ["mylib"],
9655 bootclasspath_fragments: ["mybootclasspathfragment"],
9656 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9657 updatable: false,
9658 }
9659
9660 apex_key {
9661 name: "myapex.key",
9662 public_key: "testkey.avbpubkey",
9663 private_key: "testkey.pem",
9664 }
9665
9666 java_library {
9667 name: "mylib",
9668 srcs: ["mylib.java"],
9669 apex_available: ["myapex"],
9670 compile_dex: true,
9671 }
9672
9673 bootclasspath_fragment {
9674 name: "mybootclasspathfragment",
9675 contents: ["mybootclasspathlib"],
9676 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009677 hidden_api: {
9678 split_packages: ["*"],
9679 },
Colin Crossc33e5212021-05-25 18:16:02 -07009680 }
9681
9682 java_library {
9683 name: "mybootclasspathlib",
9684 srcs: ["mybootclasspathlib.java"],
9685 apex_available: ["myapex"],
9686 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009687 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009688 }
9689
9690 systemserverclasspath_fragment {
9691 name: "mysystemserverclasspathfragment",
9692 contents: ["mysystemserverclasspathlib"],
9693 apex_available: ["myapex"],
9694 }
9695
9696 java_library {
9697 name: "mysystemserverclasspathlib",
9698 srcs: ["mysystemserverclasspathlib.java"],
9699 apex_available: ["myapex"],
9700 compile_dex: true,
9701 }
9702 `
9703
9704 result := android.GroupFixturePreparers(
9705 PrepareForTestWithApexBuildComponents,
9706 prepareForTestWithMyapex,
9707 java.PrepareForTestWithJavaDefaultModules,
9708 android.PrepareForTestWithAndroidBuildComponents,
9709 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009710 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9711 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009712 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009713 ).RunTest(t)
9714
9715 // Make sure jacoco ran on both mylib and mybootclasspathlib
9716 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9717 t.Errorf("Failed to find jacoco rule for mylib")
9718 }
9719 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9720 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9721 }
9722 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9723 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9724 }
9725}
9726
Jiyong Park192600a2021-08-03 07:52:17 +00009727func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009728 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009729 testApexError(t, `executable mybin is static`, `
9730 apex {
9731 name: "myapex",
9732 key: "myapex.key",
9733 binaries: ["mybin"],
9734 min_sdk_version: "29",
9735 }
9736
9737 apex_key {
9738 name: "myapex.key",
9739 public_key: "testkey.avbpubkey",
9740 private_key: "testkey.pem",
9741 }
9742
9743 cc_binary {
9744 name: "mybin",
9745 srcs: ["mylib.cpp"],
9746 relative_install_path: "foo/bar",
9747 static_executable: true,
9748 system_shared_libs: [],
9749 stl: "none",
9750 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009751 min_sdk_version: "29",
9752 }
9753 `)
9754
9755 testApexError(t, `executable mybin.rust is static`, `
9756 apex {
9757 name: "myapex",
9758 key: "myapex.key",
9759 binaries: ["mybin.rust"],
9760 min_sdk_version: "29",
9761 }
9762
9763 apex_key {
9764 name: "myapex.key",
9765 public_key: "testkey.avbpubkey",
9766 private_key: "testkey.pem",
9767 }
9768
9769 rust_binary {
9770 name: "mybin.rust",
9771 srcs: ["foo.rs"],
9772 static_executable: true,
9773 apex_available: ["myapex"],
9774 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009775 }
9776 `)
9777}
9778
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009779func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009780 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009781 ctx := testApex(t, `
9782 apex {
9783 name: "myapex",
9784 key: "myapex.key",
9785 updatable: false,
9786 java_libs: ["foo"],
9787 }
9788
9789 apex_key {
9790 name: "myapex.key",
9791 public_key: "testkey.avbpubkey",
9792 private_key: "testkey.pem",
9793 }
9794
9795 java_library {
9796 name: "foo",
9797 srcs: ["foo.java"],
9798 apex_available: ["myapex"],
9799 installable: true,
9800 }
9801 `,
9802 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9803 )
9804
Jooyung Hana0503a52023-08-23 13:12:50 +09009805 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009806 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9807 var builder strings.Builder
9808 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9809 androidMk := builder.String()
Colin Cross388c6612025-01-28 14:00:12 -08009810 out := ctx.Config().OutDir()
9811 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS += "+
9812 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.odex")+
9813 ":"+
9814 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.odex")+
9815 " "+
9816 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.vdex")+
9817 ":"+
9818 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.vdex")+
9819 "\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009820}
9821
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009822func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009823 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009824 ctx := testApex(t, `
9825 apex {
9826 name: "myapex",
9827 key: "myapex.key",
9828 updatable: false,
9829 java_libs: ["foo"],
9830 required: ["otherapex"],
9831 }
9832
9833 apex {
9834 name: "otherapex",
9835 key: "myapex.key",
9836 updatable: false,
9837 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009838 }
9839
9840 apex_key {
9841 name: "myapex.key",
9842 public_key: "testkey.avbpubkey",
9843 private_key: "testkey.pem",
9844 }
9845
9846 java_library {
9847 name: "foo",
9848 srcs: ["foo.java"],
9849 apex_available: ["myapex", "otherapex"],
9850 installable: true,
9851 }
9852 `)
9853
Jooyung Hana0503a52023-08-23 13:12:50 +09009854 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009855 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9856 var builder strings.Builder
9857 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9858 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009859 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009860}
9861
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009862func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009863 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009864 ctx := testApex(t, `
9865 apex {
9866 name: "myapex",
9867 key: "myapex.key",
9868 updatable: false,
9869 }
9870
9871 apex_key {
9872 name: "myapex.key",
9873 public_key: "testkey.avbpubkey",
9874 private_key: "testkey.pem",
9875 }
9876 `)
9877
Jooyung Hana0503a52023-08-23 13:12:50 +09009878 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009879 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009880 data := android.AndroidMkDataForTest(t, ctx, bundle)
9881 var builder strings.Builder
9882 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9883 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009884 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009885}
9886
Jooyung Hana6d36672022-02-24 13:58:07 +09009887func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009888 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009889 for _, tc := range []struct {
9890 name string
9891 ref string
9892 expected_data []string
9893 }{
9894 {
9895 name: "test_using_output",
9896 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009897 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009898 },
9899 {
9900 name: "test_using_apex",
9901 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009902 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009903 },
9904 } {
9905 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009906 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009907 ctx := testApex(t, `
9908 apex {
9909 name: "myapex",
9910 key: "myapex.key",
9911 compressible: true,
9912 updatable: false,
9913 }
9914
9915 apex_key {
9916 name: "myapex.key",
9917 public_key: "testkey.avbpubkey",
9918 private_key: "testkey.pem",
9919 }
9920
9921 java_test {
9922 name: "`+tc.name+`",
9923 srcs: ["a.java"],
9924 data: ["`+tc.ref+`"],
9925 }
9926 `,
9927 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9928 variables.CompressedApex = proptools.BoolPtr(true)
9929 }))
9930 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9931 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9932 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9933 })
9934 }
9935}
9936
satayev758968a2021-12-06 11:42:40 +00009937func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009938 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009939 preparer := android.GroupFixturePreparers(
9940 PrepareForTestWithApexBuildComponents,
9941 prepareForTestWithMyapex,
9942 java.PrepareForTestWithJavaSdkLibraryFiles,
9943 java.PrepareForTestWithJavaDefaultModules,
9944 android.PrepareForTestWithAndroidBuildComponents,
9945 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9946 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9947 )
9948
9949 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9950 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009951 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009952 preparer.RunTestWithBp(t, `
9953 apex {
9954 name: "myapex",
9955 key: "myapex.key",
9956 bootclasspath_fragments: ["mybootclasspathfragment"],
9957 min_sdk_version: "30",
9958 updatable: false,
9959 }
9960
9961 apex_key {
9962 name: "myapex.key",
9963 public_key: "testkey.avbpubkey",
9964 private_key: "testkey.pem",
9965 }
9966
9967 bootclasspath_fragment {
9968 name: "mybootclasspathfragment",
9969 contents: ["mybootclasspathlib"],
9970 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009971 hidden_api: {
9972 split_packages: ["*"],
9973 },
satayev758968a2021-12-06 11:42:40 +00009974 }
9975
9976 java_sdk_library {
9977 name: "mybootclasspathlib",
9978 srcs: ["mybootclasspathlib.java"],
9979 apex_available: ["myapex"],
9980 compile_dex: true,
9981 unsafe_ignore_missing_latest_api: true,
9982 min_sdk_version: "31",
9983 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009984 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009985 }
9986
9987 java_library {
9988 name: "util",
9989 srcs: ["a.java"],
9990 apex_available: ["myapex"],
9991 min_sdk_version: "31",
9992 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009993 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009994 }
9995
9996 java_library {
9997 name: "another_util",
9998 srcs: ["a.java"],
9999 min_sdk_version: "31",
10000 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000010001 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +000010002 }
10003 `)
10004 })
10005
10006 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10007 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010008 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010009 preparer.RunTestWithBp(t, `
10010 apex {
10011 name: "myapex",
10012 key: "myapex.key",
10013 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10014 min_sdk_version: "30",
10015 updatable: false,
10016 }
10017
10018 apex_key {
10019 name: "myapex.key",
10020 public_key: "testkey.avbpubkey",
10021 private_key: "testkey.pem",
10022 }
10023
10024 systemserverclasspath_fragment {
10025 name: "mysystemserverclasspathfragment",
10026 contents: ["mysystemserverclasspathlib"],
10027 apex_available: ["myapex"],
10028 }
10029
10030 java_sdk_library {
10031 name: "mysystemserverclasspathlib",
10032 srcs: ["mysystemserverclasspathlib.java"],
10033 apex_available: ["myapex"],
10034 compile_dex: true,
10035 min_sdk_version: "32",
10036 unsafe_ignore_missing_latest_api: true,
10037 static_libs: ["util"],
10038 }
10039
10040 java_library {
10041 name: "util",
10042 srcs: ["a.java"],
10043 apex_available: ["myapex"],
10044 min_sdk_version: "31",
10045 static_libs: ["another_util"],
10046 }
10047
10048 java_library {
10049 name: "another_util",
10050 srcs: ["a.java"],
10051 min_sdk_version: "31",
10052 apex_available: ["myapex"],
10053 }
10054 `)
10055 })
10056
10057 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010058 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +000010059 preparer.
satayev758968a2021-12-06 11:42:40 +000010060 RunTestWithBp(t, `
10061 apex {
10062 name: "myapex",
10063 key: "myapex.key",
10064 bootclasspath_fragments: ["mybootclasspathfragment"],
10065 min_sdk_version: "30",
10066 updatable: false,
10067 }
10068
10069 apex_key {
10070 name: "myapex.key",
10071 public_key: "testkey.avbpubkey",
10072 private_key: "testkey.pem",
10073 }
10074
10075 bootclasspath_fragment {
10076 name: "mybootclasspathfragment",
10077 contents: ["mybootclasspathlib"],
10078 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010079 hidden_api: {
10080 split_packages: ["*"],
10081 },
satayev758968a2021-12-06 11:42:40 +000010082 }
10083
10084 java_sdk_library {
10085 name: "mybootclasspathlib",
10086 srcs: ["mybootclasspathlib.java"],
10087 apex_available: ["myapex"],
10088 compile_dex: true,
10089 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010090 sdk_version: "current",
10091 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010092 }
10093 `)
10094 })
10095
10096 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010097 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010098 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10099 RunTestWithBp(t, `
10100 apex {
10101 name: "myapex",
10102 key: "myapex.key",
10103 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10104 min_sdk_version: "30",
10105 updatable: false,
10106 }
10107
10108 apex_key {
10109 name: "myapex.key",
10110 public_key: "testkey.avbpubkey",
10111 private_key: "testkey.pem",
10112 }
10113
10114 systemserverclasspath_fragment {
10115 name: "mysystemserverclasspathfragment",
10116 contents: ["mysystemserverclasspathlib"],
10117 apex_available: ["myapex"],
10118 }
10119
10120 java_sdk_library {
10121 name: "mysystemserverclasspathlib",
10122 srcs: ["mysystemserverclasspathlib.java"],
10123 apex_available: ["myapex"],
10124 compile_dex: true,
10125 unsafe_ignore_missing_latest_api: true,
10126 }
10127 `)
10128 })
10129}
10130
Jiakai Zhang6decef92022-01-12 17:56:19 +000010131// Verifies that the APEX depends on all the Make modules in the list.
10132func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10133 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10134 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010135 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010136 }
10137}
10138
10139// Verifies that the APEX does not depend on any of the Make modules in the list.
10140func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10141 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10142 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010143 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010144 }
10145}
10146
Cole Faust24e25c02024-01-19 14:12:17 -080010147func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010148 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010149 bpTemplate := `
10150 apex {
10151 name: "myapex",
10152 key: "myapex.key",
10153 java_libs: ["myjavalib"],
10154 updatable: %v,
10155 min_sdk_version: "29",
10156 }
10157 apex_key {
10158 name: "myapex.key",
10159 }
10160 java_library {
10161 name: "myjavalib",
10162 srcs: ["MyClass.java"],
10163 apex_available: [ "myapex" ],
10164 lint: {
10165 strict_updatability_linting: %v,
10166 %s
10167 },
10168 sdk_version: "current",
10169 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010170 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010171 }
10172 `
10173 fs := android.MockFS{
10174 "lint-baseline.xml": nil,
10175 }
10176
10177 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010178 testCaseName string
10179 apexUpdatable bool
10180 javaStrictUpdtabilityLint bool
10181 lintFileExists bool
10182 disallowedFlagExpectedOnApex bool
10183 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010184 }{
10185 {
Colin Cross87427352024-09-25 15:41:19 -070010186 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10187 apexUpdatable: true,
10188 javaStrictUpdtabilityLint: true,
10189 lintFileExists: false,
10190 disallowedFlagExpectedOnApex: false,
10191 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010192 },
10193 {
Colin Cross87427352024-09-25 15:41:19 -070010194 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10195 apexUpdatable: false,
10196 javaStrictUpdtabilityLint: false,
10197 lintFileExists: true,
10198 disallowedFlagExpectedOnApex: false,
10199 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010200 },
10201 {
Colin Cross87427352024-09-25 15:41:19 -070010202 testCaseName: "non-updatable apex respects strict updatability of javalib",
10203 apexUpdatable: false,
10204 javaStrictUpdtabilityLint: true,
10205 lintFileExists: true,
10206 disallowedFlagExpectedOnApex: false,
10207 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010208 },
10209 {
Colin Cross87427352024-09-25 15:41:19 -070010210 testCaseName: "updatable apex checks strict updatability of javalib",
10211 apexUpdatable: true,
10212 javaStrictUpdtabilityLint: false,
10213 lintFileExists: true,
10214 disallowedFlagExpectedOnApex: true,
10215 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010216 },
10217 }
10218
10219 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010220 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010221 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010222 fixtures := []android.FixturePreparer{}
10223 baselineProperty := ""
10224 if testCase.lintFileExists {
10225 fixtures = append(fixtures, fs.AddToFixture())
10226 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10227 }
10228 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010229
Colin Cross87427352024-09-25 15:41:19 -070010230 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010231
Colin Cross87427352024-09-25 15:41:19 -070010232 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10233 if expectStrictUpdatability {
10234 if m.Rule == nil {
10235 t.Errorf("expected strict updatability check rule on %s", name)
10236 } else {
10237 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10238 m.RuleParams.Command, "--disallowed_issues NewApi")
10239 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10240 m.Inputs.Strings(), "lint-baseline.xml")
10241 }
10242 } else {
10243 if m.Rule != nil {
10244 t.Errorf("expected no strict updatability check rule on %s", name)
10245 }
10246 }
10247 }
10248
10249 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10250 apex := result.ModuleForTests("myapex", "android_common_myapex")
10251 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10252 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10253
10254 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10255 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10256 })
Cole Faust24e25c02024-01-19 14:12:17 -080010257 }
10258}
10259
Cole Faust24e25c02024-01-19 14:12:17 -080010260// checks transtive deps of an apex coming from bootclasspath_fragment
10261func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010262 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010263 bp := `
10264 apex {
10265 name: "myapex",
10266 key: "myapex.key",
10267 bootclasspath_fragments: ["mybootclasspathfragment"],
10268 updatable: true,
10269 min_sdk_version: "29",
10270 }
10271 apex_key {
10272 name: "myapex.key",
10273 }
10274 bootclasspath_fragment {
10275 name: "mybootclasspathfragment",
10276 contents: ["myjavalib"],
10277 apex_available: ["myapex"],
10278 hidden_api: {
10279 split_packages: ["*"],
10280 },
10281 }
10282 java_library {
10283 name: "myjavalib",
10284 srcs: ["MyClass.java"],
10285 apex_available: [ "myapex" ],
10286 sdk_version: "current",
10287 min_sdk_version: "29",
10288 compile_dex: true,
10289 lint: {
10290 baseline_filename: "lint-baseline.xml",
10291 }
10292 }
10293 `
10294 fs := android.MockFS{
10295 "lint-baseline.xml": nil,
10296 }
10297
10298 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010299 apex := result.ModuleForTests("myapex", "android_common_myapex")
10300 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10301 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10302 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10303 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10304 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010305}
Spandan Das66773252022-01-15 00:23:18 +000010306
Jihoon Kang784c0052024-06-25 22:15:39 +000010307func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010308 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010309 bp := `
10310 apex {
10311 name: "myapex",
10312 key: "myapex.key",
10313 bootclasspath_fragments: ["mybootclasspathfragment"],
10314 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010315 java_libs: [
10316 "jacocoagent",
10317 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010318 }
10319 apex_key {
10320 name: "myapex.key",
10321 }
10322 bootclasspath_fragment {
10323 name: "mybootclasspathfragment",
10324 contents: ["foo"],
10325 apex_available: ["myapex"],
10326 hidden_api: {
10327 split_packages: ["*"],
10328 },
10329 }
10330 java_sdk_library {
10331 name: "foo",
10332 srcs: ["MyClass.java"],
10333 apex_available: [ "myapex" ],
10334 sdk_version: "current",
10335 min_sdk_version: "29",
10336 compile_dex: true,
10337 }
10338 `
10339 fs := android.MockFS{
10340 "lint-baseline.xml": nil,
10341 }
10342
10343 result := android.GroupFixturePreparers(
10344 prepareForApexTest,
10345 java.PrepareForTestWithJavaSdkLibraryFiles,
10346 java.PrepareForTestWithJacocoInstrumentation,
10347 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010348 android.FixtureMergeMockFs(fs),
10349 ).RunTestWithBp(t, bp)
10350
10351 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10352 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10353 android.AssertStringDoesContain(t,
10354 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10355 lintReportInputs, "foo.impl")
10356}
10357
Spandan Das42e89502022-05-06 22:12:55 +000010358// updatable apexes should propagate updatable=true to its apps
10359func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010360 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010361 bp := `
10362 apex {
10363 name: "myapex",
10364 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010365 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010366 apps: [
10367 "myapp",
10368 ],
10369 min_sdk_version: "30",
10370 }
10371 apex_key {
10372 name: "myapex.key",
10373 }
10374 android_app {
10375 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010376 apex_available: [
10377 "myapex",
10378 ],
10379 sdk_version: "current",
10380 min_sdk_version: "30",
10381 }
10382 `
Colin Cross99939e92024-10-01 16:02:46 -070010383 _ = android.GroupFixturePreparers(
10384 prepareForApexTest,
10385 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10386 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010387}
10388
Jingwen Chendea7a642023-03-28 11:30:50 +000010389func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010390 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010391 ctx := testApex(t, `
10392 apex {
10393 name: "myapex",
10394 key: "myapex.key",
10395 updatable: false,
10396 }
10397
10398 apex_key {
10399 name: "myapex.key",
10400 public_key: "testkey.avbpubkey",
10401 private_key: "testkey.pem",
10402 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010403 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010404 generateFsRule := mod.Rule("generateFsConfig")
10405 cmd := generateFsRule.RuleParams.Command
10406
10407 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10408}
10409
10410func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010411 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010412 ctx := testApex(t, `
10413 apex {
10414 name: "myapex",
10415 key: "myapex.key",
10416 canned_fs_config: "my_config",
10417 updatable: false,
10418 }
10419
10420 apex_key {
10421 name: "myapex.key",
10422 public_key: "testkey.avbpubkey",
10423 private_key: "testkey.pem",
10424 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010425 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010426 generateFsRule := mod.Rule("generateFsConfig")
10427 cmd := generateFsRule.RuleParams.Command
10428
10429 // Ensure that canned_fs_config has "cat my_config" at the end
10430 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10431}
Spandan Das20fce2d2023-04-12 17:21:39 +000010432
10433func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010434 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010435 testCases := []struct {
10436 desc string
10437 hasStubs bool
10438 apexAvailable string
10439 expectedError string
10440 }{
10441 {
10442 desc: "non-stub library can have multiple apex_available",
10443 hasStubs: false,
10444 apexAvailable: `["myapex", "otherapex"]`,
10445 },
10446 {
10447 desc: "stub library should not be available to anyapex",
10448 hasStubs: true,
10449 apexAvailable: `["//apex_available:anyapex"]`,
10450 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10451 },
10452 {
10453 desc: "stub library should not be available to multiple apexes",
10454 hasStubs: true,
10455 apexAvailable: `["myapex", "otherapex"]`,
10456 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10457 },
10458 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010459 desc: "stub library can be available to a core apex and a test apex using apex_available_name",
Spandan Das20fce2d2023-04-12 17:21:39 +000010460 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010461 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010462 },
10463 }
10464 bpTemplate := `
10465 cc_library {
10466 name: "libfoo",
10467 %v
10468 apex_available: %v,
10469 }
10470 apex {
10471 name: "myapex",
10472 key: "apex.key",
10473 updatable: false,
10474 native_shared_libs: ["libfoo"],
10475 }
10476 apex {
10477 name: "otherapex",
10478 key: "apex.key",
10479 updatable: false,
10480 }
10481 apex_test {
10482 name: "test_myapex",
10483 key: "apex.key",
10484 updatable: false,
10485 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010486 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010487 }
10488 apex_key {
10489 name: "apex.key",
10490 }
10491 `
10492 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010493 t.Run(tc.desc, func(t *testing.T) {
10494 stubs := ""
10495 if tc.hasStubs {
10496 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10497 }
10498 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10499 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10500 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10501 })
10502 if tc.expectedError == "" {
10503 testApex(t, bp, mockFsFixturePreparer)
10504 } else {
10505 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10506 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010507 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010508 }
10509}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010510
10511func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010512 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010513 context := android.GroupFixturePreparers(
10514 android.PrepareForIntegrationTestWithAndroid,
10515 cc.PrepareForIntegrationTestWithCc,
10516 PrepareForTestWithApexBuildComponents,
10517 prepareForTestWithMyapex,
10518 filesystem.PrepareForTestWithFilesystemBuildComponents,
10519 )
10520 result := context.RunTestWithBp(t, `
10521 android_system_image {
10522 name: "myfilesystem",
10523 deps: [
10524 "libfoo",
10525 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010526 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010527 gen_linker_config: true,
10528 linker_config_srcs: ["linker.config.json"],
10529 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010530 }
10531
10532 cc_library {
10533 name: "libfoo",
10534 shared_libs: [
10535 "libbar",
10536 ],
10537 stl: "none",
10538 }
10539
10540 cc_library {
10541 name: "libbar",
10542 stl: "none",
10543 apex_available: ["myapex"],
10544 }
10545
10546 apex {
10547 name: "myapex",
10548 native_shared_libs: ["libbar"],
10549 key: "myapex.key",
10550 updatable: false,
10551 }
10552
10553 apex_key {
10554 name: "myapex.key",
10555 public_key: "testkey.avbpubkey",
10556 private_key: "testkey.pem",
10557 }
10558 `)
10559
Cole Faust3b806d32024-03-11 15:15:03 -070010560 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010561 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10562 inputs.Strings(),
10563 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10564}
Yu Liueae7b362023-11-16 17:05:47 -080010565
10566var apex_default_bp = `
10567 apex_key {
10568 name: "myapex.key",
10569 public_key: "testkey.avbpubkey",
10570 private_key: "testkey.pem",
10571 }
10572
10573 filegroup {
10574 name: "myapex.manifest",
10575 srcs: ["apex_manifest.json"],
10576 }
10577
10578 filegroup {
10579 name: "myapex.androidmanifest",
10580 srcs: ["AndroidManifest.xml"],
10581 }
10582`
10583
10584func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010585 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010586 ctx := testApex(t, apex_default_bp+`
10587 apex {
10588 name: "myapex",
10589 manifest: ":myapex.manifest",
10590 androidManifest: ":myapex.androidmanifest",
10591 key: "myapex.key",
10592 java_libs: [
10593 "my_java_library_foo",
10594 "my_java_library_bar",
10595 ],
10596 updatable: false,
10597 }
10598
10599 java_library {
10600 name: "my_java_library_foo",
10601 srcs: ["foo/bar/MyClass.java"],
10602 sdk_version: "none",
10603 system_modules: "none",
10604 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010605 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010606 "myapex",
10607 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010608 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010609 }
10610
10611 java_library {
10612 name: "my_java_library_bar",
10613 srcs: ["foo/bar/MyClass.java"],
10614 sdk_version: "none",
10615 system_modules: "none",
10616 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010617 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010618 "myapex",
10619 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010620 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010621 }
10622
10623 aconfig_declarations {
10624 name: "my_aconfig_declarations_foo",
10625 package: "com.example.package",
10626 container: "myapex",
10627 srcs: ["foo.aconfig"],
10628 }
10629
10630 java_aconfig_library {
10631 name: "my_java_aconfig_library_foo",
10632 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010633 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010634 "myapex",
10635 ],
10636 }
10637
10638 aconfig_declarations {
10639 name: "my_aconfig_declarations_bar",
10640 package: "com.example.package",
10641 container: "myapex",
10642 srcs: ["bar.aconfig"],
10643 }
10644
10645 java_aconfig_library {
10646 name: "my_java_aconfig_library_bar",
10647 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010648 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010649 "myapex",
10650 ],
10651 }
10652 `)
10653
10654 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10655 s := mod.Rule("apexRule").Args["copy_commands"]
10656 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010657 if len(copyCmds) != 14 {
10658 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010659 }
10660
Jooyung Hana3fddf42024-09-03 13:22:21 +090010661 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10662 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10663 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10664 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010665 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010666
Yu Liubba555e2024-02-17 00:36:42 +000010667 inputs := []string{
10668 "my_aconfig_declarations_foo/intermediate.pb",
10669 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010670 }
Yu Liubba555e2024-02-17 00:36:42 +000010671 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10672 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10673 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10674 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010675 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010676}
10677
10678func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010679 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010680 ctx := testApex(t, apex_default_bp+`
10681 apex {
10682 name: "myapex",
10683 manifest: ":myapex.manifest",
10684 androidManifest: ":myapex.androidmanifest",
10685 key: "myapex.key",
10686 java_libs: [
10687 "my_java_library_foo",
10688 ],
10689 native_shared_libs: [
10690 "my_cc_library_bar",
10691 ],
10692 binaries: [
10693 "my_cc_binary_baz",
10694 ],
10695 updatable: false,
10696 }
10697
10698 java_library {
10699 name: "my_java_library_foo",
10700 srcs: ["foo/bar/MyClass.java"],
10701 sdk_version: "none",
10702 system_modules: "none",
10703 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010704 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010705 "myapex",
10706 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010707 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010708 }
10709
10710 cc_library {
10711 name: "my_cc_library_bar",
10712 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010713 static_libs: [
10714 "my_cc_aconfig_library_bar",
10715 "my_cc_aconfig_library_baz",
10716 ],
Yu Liueae7b362023-11-16 17:05:47 -080010717 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010718 "myapex",
10719 ],
10720 }
10721
10722 cc_binary {
10723 name: "my_cc_binary_baz",
10724 srcs: ["foo/bar/MyClass.cc"],
10725 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010726 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010727 "myapex",
10728 ],
10729 }
10730
10731 aconfig_declarations {
10732 name: "my_aconfig_declarations_foo",
10733 package: "com.example.package",
10734 container: "myapex",
10735 srcs: ["foo.aconfig"],
10736 }
10737
10738 java_aconfig_library {
10739 name: "my_java_aconfig_library_foo",
10740 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010741 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010742 "myapex",
10743 ],
10744 }
10745
10746 aconfig_declarations {
10747 name: "my_aconfig_declarations_bar",
10748 package: "com.example.package",
10749 container: "myapex",
10750 srcs: ["bar.aconfig"],
10751 }
10752
10753 cc_aconfig_library {
10754 name: "my_cc_aconfig_library_bar",
10755 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010756 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010757 "myapex",
10758 ],
10759 }
10760
10761 aconfig_declarations {
10762 name: "my_aconfig_declarations_baz",
10763 package: "com.example.package",
10764 container: "myapex",
10765 srcs: ["baz.aconfig"],
10766 }
10767
10768 cc_aconfig_library {
10769 name: "my_cc_aconfig_library_baz",
10770 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010771 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010772 "myapex",
10773 ],
10774 }
10775
10776 cc_library {
10777 name: "server_configurable_flags",
10778 srcs: ["server_configurable_flags.cc"],
10779 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010780 cc_library {
10781 name: "libbase",
10782 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010783 apex_available: [
10784 "myapex",
10785 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010786 }
10787 cc_library {
10788 name: "libaconfig_storage_read_api_cc",
10789 srcs: ["libaconfig_storage_read_api_cc.cc"],
10790 }
Yu Liueae7b362023-11-16 17:05:47 -080010791 `)
10792
10793 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10794 s := mod.Rule("apexRule").Args["copy_commands"]
10795 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010796 if len(copyCmds) != 18 {
10797 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010798 }
10799
Jooyung Hana3fddf42024-09-03 13:22:21 +090010800 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10801 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10802 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10803 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010804 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010805
Yu Liubba555e2024-02-17 00:36:42 +000010806 inputs := []string{
10807 "my_aconfig_declarations_foo/intermediate.pb",
10808 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10809 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010810 }
Yu Liubba555e2024-02-17 00:36:42 +000010811 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10812 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10813 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10814 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010815 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010816}
10817
Yu Liucec0e412023-11-30 16:45:50 -080010818func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010819 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010820 ctx := testApex(t, apex_default_bp+`
10821 apex {
10822 name: "myapex",
10823 manifest: ":myapex.manifest",
10824 androidManifest: ":myapex.androidmanifest",
10825 key: "myapex.key",
10826 native_shared_libs: [
10827 "libmy_rust_library",
10828 ],
10829 binaries: [
10830 "my_rust_binary",
10831 ],
10832 rust_dyn_libs: [
10833 "libmy_rust_dylib",
10834 ],
10835 updatable: false,
10836 }
10837
10838 rust_library {
Yu Liucec0e412023-11-30 16:45:50 -080010839 name: "liblazy_static", // test mock
10840 crate_name: "lazy_static",
10841 srcs: ["src/lib.rs"],
10842 apex_available: [
10843 "myapex",
10844 ],
10845 }
10846
Ted Bauer02d475c2024-03-27 20:56:26 +000010847 rust_library {
10848 name: "libaconfig_storage_read_api", // test mock
10849 crate_name: "aconfig_storage_read_api",
10850 srcs: ["src/lib.rs"],
10851 apex_available: [
10852 "myapex",
10853 ],
10854 }
10855
Ted Bauer6ef40db2024-03-29 14:04:10 +000010856 rust_library {
10857 name: "liblogger", // test mock
10858 crate_name: "logger",
10859 srcs: ["src/lib.rs"],
10860 apex_available: [
10861 "myapex",
10862 ],
10863 }
10864
10865 rust_library {
10866 name: "liblog_rust", // test mock
10867 crate_name: "log_rust",
10868 srcs: ["src/lib.rs"],
10869 apex_available: [
10870 "myapex",
10871 ],
10872 }
10873
Yu Liucec0e412023-11-30 16:45:50 -080010874 rust_ffi_shared {
10875 name: "libmy_rust_library",
10876 srcs: ["src/lib.rs"],
10877 rustlibs: ["libmy_rust_aconfig_library_foo"],
10878 crate_name: "my_rust_library",
10879 apex_available: [
10880 "myapex",
10881 ],
10882 }
10883
10884 rust_library_dylib {
10885 name: "libmy_rust_dylib",
10886 srcs: ["foo/bar/MyClass.rs"],
10887 rustlibs: ["libmy_rust_aconfig_library_bar"],
10888 crate_name: "my_rust_dylib",
10889 apex_available: [
10890 "myapex",
10891 ],
10892 }
10893
10894 rust_binary {
10895 name: "my_rust_binary",
10896 srcs: ["foo/bar/MyClass.rs"],
10897 rustlibs: [
10898 "libmy_rust_aconfig_library_baz",
10899 "libmy_rust_dylib",
10900 ],
10901 apex_available: [
10902 "myapex",
10903 ],
10904 }
10905
10906 aconfig_declarations {
10907 name: "my_aconfig_declarations_foo",
10908 package: "com.example.package",
10909 container: "myapex",
10910 srcs: ["foo.aconfig"],
10911 }
10912
10913 aconfig_declarations {
10914 name: "my_aconfig_declarations_bar",
10915 package: "com.example.package",
10916 container: "myapex",
10917 srcs: ["bar.aconfig"],
10918 }
10919
10920 aconfig_declarations {
10921 name: "my_aconfig_declarations_baz",
10922 package: "com.example.package",
10923 container: "myapex",
10924 srcs: ["baz.aconfig"],
10925 }
10926
10927 rust_aconfig_library {
10928 name: "libmy_rust_aconfig_library_foo",
10929 aconfig_declarations: "my_aconfig_declarations_foo",
10930 crate_name: "my_rust_aconfig_library_foo",
10931 apex_available: [
10932 "myapex",
10933 ],
10934 }
10935
10936 rust_aconfig_library {
10937 name: "libmy_rust_aconfig_library_bar",
10938 aconfig_declarations: "my_aconfig_declarations_bar",
10939 crate_name: "my_rust_aconfig_library_bar",
10940 apex_available: [
10941 "myapex",
10942 ],
10943 }
10944
10945 rust_aconfig_library {
10946 name: "libmy_rust_aconfig_library_baz",
10947 aconfig_declarations: "my_aconfig_declarations_baz",
10948 crate_name: "my_rust_aconfig_library_baz",
10949 apex_available: [
10950 "myapex",
10951 ],
10952 }
10953 `)
10954
10955 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10956 s := mod.Rule("apexRule").Args["copy_commands"]
10957 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen396237a2025-01-30 20:06:25 +000010958 if len(copyCmds) != 32 {
10959 t.Fatalf("Expected 32 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010960 }
10961
Jooyung Hana3fddf42024-09-03 13:22:21 +090010962 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10963 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10964 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10965 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010966 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010967
Yu Liubba555e2024-02-17 00:36:42 +000010968 inputs := []string{
10969 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010970 "my_aconfig_declarations_bar/intermediate.pb",
10971 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010972 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10973 }
10974 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10975 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10976 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10977 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010978 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010979}
10980
10981func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10982 aconfigRule := mod.Description(desc)
10983 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010984 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010985 if len(aconfigArgs) != len(inputs) {
10986 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010987 }
Yu Liucec0e412023-11-30 16:45:50 -080010988
Yu Liubba555e2024-02-17 00:36:42 +000010989 ensureEquals(t, container, aconfigRule.Args["container"])
10990 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10991
10992 buildParams := aconfigRule.BuildParams
10993 for _, input := range inputs {
10994 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10995 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010996 }
Yu Liubba555e2024-02-17 00:36:42 +000010997
10998 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010999}
11000
Yu Liueae7b362023-11-16 17:05:47 -080011001func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011002 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011003 ctx := testApex(t, apex_default_bp+`
11004 apex {
11005 name: "myapex",
11006 manifest: ":myapex.manifest",
11007 androidManifest: ":myapex.androidmanifest",
11008 key: "myapex.key",
11009 java_libs: [
11010 "my_java_library_foo",
11011 "other_java_library_bar",
11012 ],
11013 updatable: false,
11014 }
11015
11016 java_library {
11017 name: "my_java_library_foo",
11018 srcs: ["foo/bar/MyClass.java"],
11019 sdk_version: "none",
11020 system_modules: "none",
11021 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011022 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011023 "myapex",
11024 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011025 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011026 }
11027
11028 java_library {
11029 name: "other_java_library_bar",
11030 srcs: ["foo/bar/MyClass.java"],
11031 sdk_version: "none",
11032 system_modules: "none",
11033 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011034 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011035 "myapex",
11036 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011037 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011038 }
11039
11040 aconfig_declarations {
11041 name: "my_aconfig_declarations_foo",
11042 package: "com.example.package",
11043 container: "myapex",
11044 srcs: ["foo.aconfig"],
11045 }
11046
11047 java_aconfig_library {
11048 name: "my_java_aconfig_library_foo",
11049 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011050 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011051 "myapex",
11052 ],
11053 }
11054
11055 aconfig_declarations {
11056 name: "other_aconfig_declarations_bar",
11057 package: "com.example.package",
11058 container: "otherapex",
11059 srcs: ["bar.aconfig"],
11060 }
11061
11062 java_aconfig_library {
11063 name: "other_java_aconfig_library_bar",
11064 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011065 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011066 "myapex",
11067 ],
11068 }
11069 `)
11070
11071 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11072 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11073 s := " " + combineAconfigRule.Args["cache_files"]
11074 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11075 if len(aconfigArgs) != 1 {
11076 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11077 }
11078 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11079
11080 buildParams := combineAconfigRule.BuildParams
11081 if len(buildParams.Inputs) != 1 {
11082 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11083 }
11084 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11085 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11086}
11087
11088func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011089 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011090 ctx := testApex(t, apex_default_bp+`
11091 apex {
11092 name: "myapex",
11093 manifest: ":myapex.manifest",
11094 androidManifest: ":myapex.androidmanifest",
11095 key: "myapex.key",
11096 java_libs: [
11097 "my_java_library_foo",
11098 "my_java_library_bar",
11099 ],
11100 updatable: false,
11101 }
11102
11103 java_library {
11104 name: "my_java_library_foo",
11105 srcs: ["foo/bar/MyClass.java"],
11106 sdk_version: "none",
11107 system_modules: "none",
11108 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011109 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011110 "myapex",
11111 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011112 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011113 }
11114
11115 java_library {
11116 name: "my_java_library_bar",
11117 srcs: ["foo/bar/MyClass.java"],
11118 sdk_version: "none",
11119 system_modules: "none",
11120 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011121 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011122 "myapex",
11123 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011124 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011125 }
11126
11127 aconfig_declarations {
11128 name: "my_aconfig_declarations_foo",
11129 package: "com.example.package",
11130 container: "myapex",
11131 srcs: ["foo.aconfig"],
11132 }
11133
11134 java_aconfig_library {
11135 name: "my_java_aconfig_library_foo",
11136 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011137 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011138 "myapex",
11139 ],
11140 }
11141
11142 java_aconfig_library {
11143 name: "my_java_aconfig_library_bar",
11144 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011145 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011146 "myapex",
11147 ],
11148 }
11149 `)
11150
11151 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11152 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11153 s := " " + combineAconfigRule.Args["cache_files"]
11154 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11155 if len(aconfigArgs) != 1 {
11156 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11157 }
11158 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11159
11160 buildParams := combineAconfigRule.BuildParams
11161 if len(buildParams.Inputs) != 1 {
11162 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11163 }
11164 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11165 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11166}
Spandan Das5be63332023-12-13 00:06:32 +000011167
11168// Test that the boot jars come from the _selected_ apex prebuilt
11169// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11170func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011171 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011172 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11173 t.Helper()
11174 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11175 foundLibfooJar := false
11176 base := stem + ".jar"
11177 for _, output := range s.AllOutputs() {
11178 if filepath.Base(output) == base {
11179 foundLibfooJar = true
11180 buildRule := s.Output(output)
11181 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11182 }
11183 }
11184 if !foundLibfooJar {
11185 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11186 }
11187 }
11188
Spandan Das64c9e0c2023-12-20 20:13:34 +000011189 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11190 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11191 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11192 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11193 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11194 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)
11195 }
11196
11197 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11198 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11199 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11200 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11201 }
11202
Spandan Das5be63332023-12-13 00:06:32 +000011203 bp := `
11204 // Source APEX.
11205
11206 java_library {
11207 name: "framework-foo",
11208 srcs: ["foo.java"],
11209 installable: true,
11210 apex_available: [
11211 "com.android.foo",
11212 ],
11213 }
11214
11215 bootclasspath_fragment {
11216 name: "foo-bootclasspath-fragment",
11217 contents: ["framework-foo"],
11218 apex_available: [
11219 "com.android.foo",
11220 ],
11221 hidden_api: {
11222 split_packages: ["*"],
11223 },
11224 }
11225
11226 apex_key {
11227 name: "com.android.foo.key",
11228 public_key: "com.android.foo.avbpubkey",
11229 private_key: "com.android.foo.pem",
11230 }
11231
11232 apex {
11233 name: "com.android.foo",
11234 key: "com.android.foo.key",
11235 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11236 updatable: false,
11237 }
11238
11239 // Prebuilt APEX.
11240
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011241 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011242 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011243 public: {
11244 jars: ["foo.jar"],
11245 },
Spandan Das5be63332023-12-13 00:06:32 +000011246 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011247 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011248 }
11249
11250 prebuilt_bootclasspath_fragment {
11251 name: "foo-bootclasspath-fragment",
11252 contents: ["framework-foo"],
11253 hidden_api: {
11254 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11255 metadata: "my-bootclasspath-fragment/metadata.csv",
11256 index: "my-bootclasspath-fragment/index.csv",
11257 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11258 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11259 },
11260 apex_available: [
11261 "com.android.foo",
11262 ],
11263 }
11264
11265 prebuilt_apex {
11266 name: "com.android.foo",
11267 apex_name: "com.android.foo",
11268 src: "com.android.foo-arm.apex",
11269 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11270 }
11271
11272 // Another Prebuilt ART APEX
11273 prebuilt_apex {
11274 name: "com.android.foo.v2",
11275 apex_name: "com.android.foo", // Used to determine the API domain
11276 src: "com.android.foo-arm.apex",
11277 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11278 }
11279
11280 // APEX contribution modules
11281
11282 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011283 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011284 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011285 contents: ["com.android.foo"],
11286 }
11287
11288 apex_contributions {
11289 name: "foo.prebuilt.contributions",
11290 api_domain: "com.android.foo",
11291 contents: ["prebuilt_com.android.foo"],
11292 }
11293
11294 apex_contributions {
11295 name: "foo.prebuilt.v2.contributions",
11296 api_domain: "com.android.foo",
11297 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011298 }
11299 `
11300
11301 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011302 desc string
11303 selectedApexContributions string
11304 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011305 }{
11306 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011307 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11308 selectedApexContributions: "foo.source.contributions",
Colin Crosse5c7d7c2024-12-18 17:08:07 -080011309 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_com.android.foo/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011310 },
11311 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011312 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11313 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011314 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 +000011315 },
11316 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011317 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11318 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011319 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 +000011320 },
11321 }
11322
11323 fragment := java.ApexVariantReference{
11324 Apex: proptools.StringPtr("com.android.foo"),
11325 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11326 }
11327
11328 for _, tc := range testCases {
11329 preparer := android.GroupFixturePreparers(
11330 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11331 android.FixtureMergeMockFs(map[string][]byte{
11332 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11333 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011334 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11335 // file creation.
11336 java.FixtureConfigureBootJars("platform:foo"),
11337 android.FixtureModifyMockFS(func(fs android.MockFS) {
11338 fs["platform/Android.bp"] = []byte(`
11339 java_library {
11340 name: "foo",
11341 srcs: ["Test.java"],
11342 compile_dex: true,
11343 }
11344 `)
11345 fs["platform/Test.java"] = nil
11346 }),
11347
Colin Crossa66b4632024-08-08 15:50:47 -070011348 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011349 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011350 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011351 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011352 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11353 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011354 }
11355}
Spandan Das3576e762024-01-03 18:57:03 +000011356
11357// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11358// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11359func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011360 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011361 // for a mainline module family, check that only the flagged soong module is visible to make
11362 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11363 variation := func(moduleName string) string {
11364 ret := "android_common_com.android.foo"
11365 if moduleName == "com.google.android.foo" {
Colin Cross697f25d2024-12-17 15:27:16 -080011366 ret = "android_common_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011367 }
11368 return ret
11369 }
11370
11371 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11372 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11373
11374 for _, hiddenModuleName := range hiddenModuleNames {
11375 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11376 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11377
11378 }
11379 }
11380
11381 bp := `
11382 apex_key {
11383 name: "com.android.foo.key",
11384 public_key: "com.android.foo.avbpubkey",
11385 private_key: "com.android.foo.pem",
11386 }
11387
11388 // AOSP source apex
11389 apex {
11390 name: "com.android.foo",
11391 key: "com.android.foo.key",
11392 updatable: false,
11393 }
11394
11395 // Google source apex
11396 override_apex {
11397 name: "com.google.android.foo",
11398 base: "com.android.foo",
11399 key: "com.android.foo.key",
11400 }
11401
11402 // Prebuilt Google APEX.
11403
11404 prebuilt_apex {
11405 name: "com.google.android.foo",
11406 apex_name: "com.android.foo",
11407 src: "com.android.foo-arm.apex",
11408 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11409 }
11410
11411 // Another Prebuilt Google APEX
11412 prebuilt_apex {
11413 name: "com.google.android.foo.v2",
11414 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011415 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011416 src: "com.android.foo-arm.apex",
11417 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11418 }
11419
11420 // APEX contribution modules
11421
11422 apex_contributions {
11423 name: "foo.source.contributions",
11424 api_domain: "com.android.foo",
11425 contents: ["com.google.android.foo"],
11426 }
11427
11428 apex_contributions {
11429 name: "foo.prebuilt.contributions",
11430 api_domain: "com.android.foo",
11431 contents: ["prebuilt_com.google.android.foo"],
11432 }
11433
11434 apex_contributions {
11435 name: "foo.prebuilt.v2.contributions",
11436 api_domain: "com.android.foo",
11437 contents: ["prebuilt_com.google.android.foo.v2"],
11438 }
11439
11440 // This is an incompatible module because it selects multiple versions of the same mainline module
11441 apex_contributions {
11442 name: "foo.prebuilt.duplicate.contributions",
11443 api_domain: "com.android.foo",
11444 contents: [
11445 "prebuilt_com.google.android.foo",
11446 "prebuilt_com.google.android.foo.v2",
11447 ],
11448 }
11449 `
11450
11451 testCases := []struct {
11452 desc string
11453 selectedApexContributions string
11454 expectedVisibleModuleName string
11455 expectedHiddenModuleNames []string
11456 expectedError string
11457 }{
11458 {
11459 desc: "Source apex is selected, prebuilts should be hidden from make",
11460 selectedApexContributions: "foo.source.contributions",
11461 expectedVisibleModuleName: "com.google.android.foo",
11462 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11463 },
11464 {
11465 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11466 selectedApexContributions: "foo.prebuilt.contributions",
11467 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11468 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11469 },
11470 {
11471 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11472 selectedApexContributions: "foo.prebuilt.v2.contributions",
11473 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11474 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11475 },
11476 {
11477 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11478 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11479 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11480 },
11481 }
11482
11483 for _, tc := range testCases {
11484 preparer := android.GroupFixturePreparers(
11485 android.FixtureMergeMockFs(map[string][]byte{
11486 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11487 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011488 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011489 )
11490 if tc.expectedError != "" {
11491 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11492 testApex(t, bp, preparer)
11493 return
11494 }
11495 ctx := testApex(t, bp, preparer)
11496
Spandan Das3576e762024-01-03 18:57:03 +000011497 // Check that
11498 // 1. The contents of the selected apex_contributions are visible to make
11499 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11500 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11501 }
11502}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011503
Spandan Das85bd4622024-08-01 00:51:20 +000011504// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11505func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011506 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011507 // for a mainline module family, check that only the flagged soong module is visible to make
11508 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11509 variation := func(moduleName string) string {
11510 ret := "android_common_com.android.adservices"
11511 if moduleName == "com.google.android.foo" {
11512 ret = "android_common_com.google.android.foo_com.google.android.foo"
11513 }
11514 return ret
11515 }
11516
11517 for _, visibleModuleName := range visibleModuleNames {
11518 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11519 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11520 }
11521
11522 for _, hiddenModuleName := range hiddenModuleNames {
11523 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11524 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11525
11526 }
11527 }
11528
11529 bp := `
11530 apex_key {
11531 name: "com.android.adservices.key",
11532 public_key: "com.android.adservices.avbpubkey",
11533 private_key: "com.android.adservices.pem",
11534 }
11535
11536 // AOSP source apex
11537 apex {
11538 name: "com.android.adservices",
11539 key: "com.android.adservices.key",
11540 updatable: false,
11541 }
11542
11543 // Prebuilt Google APEX.
11544
11545 prebuilt_apex {
11546 name: "com.google.android.adservices",
11547 apex_name: "com.android.adservices",
11548 src: "com.android.foo-arm.apex",
11549 }
11550
11551 // Another Prebuilt Google APEX
11552 prebuilt_apex {
11553 name: "com.google.android.adservices.v2",
11554 apex_name: "com.android.adservices",
11555 src: "com.android.foo-arm.apex",
11556 }
11557
11558 // APEX contribution modules
11559
11560
11561 apex_contributions {
11562 name: "adservices.prebuilt.contributions",
11563 api_domain: "com.android.adservices",
11564 contents: ["prebuilt_com.google.android.adservices"],
11565 }
11566
11567 apex_contributions {
11568 name: "adservices.prebuilt.v2.contributions",
11569 api_domain: "com.android.adservices",
11570 contents: ["prebuilt_com.google.android.adservices.v2"],
11571 }
11572 `
11573
11574 testCases := []struct {
11575 desc string
11576 selectedApexContributions string
11577 expectedVisibleModuleNames []string
11578 expectedHiddenModuleNames []string
11579 }{
11580 {
11581 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11582 selectedApexContributions: "",
11583 expectedVisibleModuleNames: []string{"com.android.adservices"},
11584 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11585 },
11586 {
11587 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11588 selectedApexContributions: "adservices.prebuilt.contributions",
11589 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11590 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11591 },
11592 {
11593 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11594 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11595 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11596 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11597 },
11598 }
11599
11600 for _, tc := range testCases {
11601 preparer := android.GroupFixturePreparers(
11602 android.FixtureMergeMockFs(map[string][]byte{
11603 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11604 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011605 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011606 )
11607 ctx := testApex(t, bp, preparer)
11608
11609 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11610 }
11611}
11612
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011613func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011614 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011615 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11616 for _, moduleName := range moduleNames {
11617 ret += fmt.Sprintf(`
11618 aconfig_declarations {
11619 name: "%[1]s",
11620 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011621 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011622 srcs: [
11623 "%[1]s.aconfig",
11624 ],
11625 }
11626 java_aconfig_library {
11627 name: "%[1]s-lib",
11628 aconfig_declarations: "%[1]s",
11629 }
11630 `, moduleName)
11631 }
11632 return ret
11633 }
11634
11635 result := android.GroupFixturePreparers(
11636 prepareForApexTest,
11637 java.PrepareForTestWithJavaSdkLibraryFiles,
11638 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011639 ).RunTestWithBp(t, `
11640 java_library {
11641 name: "baz-java-lib",
11642 static_libs: [
11643 "baz-lib",
11644 ],
11645 }
11646 filegroup {
11647 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011648 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011649 ":qux-lib{.generated_srcjars}",
11650 ],
11651 }
11652 filegroup {
11653 name: "qux-another-filegroup",
11654 srcs: [
11655 ":qux-filegroup",
11656 ],
11657 }
11658 java_library {
11659 name: "quux-java-lib",
11660 srcs: [
11661 "a.java",
11662 ],
11663 libs: [
11664 "quux-lib",
11665 ],
11666 }
11667 java_sdk_library {
11668 name: "foo",
11669 srcs: [
11670 ":qux-another-filegroup",
11671 ],
11672 api_packages: ["foo"],
11673 system: {
11674 enabled: true,
11675 },
11676 module_lib: {
11677 enabled: true,
11678 },
11679 test: {
11680 enabled: true,
11681 },
11682 static_libs: [
11683 "bar-lib",
11684 ],
11685 libs: [
11686 "baz-java-lib",
11687 "quux-java-lib",
11688 ],
11689 aconfig_declarations: [
11690 "bar",
11691 ],
11692 }
11693 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11694
11695 m := result.ModuleForTests("foo.stubs.source", "android_common")
11696 outDir := "out/soong/.intermediates"
11697
11698 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11699 // textproto files
11700 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11701
11702 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11703 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11704 // to aconfig.
11705 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11706 "passed as an input",
11707 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11708
11709 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11710 // to metalava as classpath. Thus the cache file provided by the associated
11711 // aconfig_declarations module "baz" should be passed to aconfig.
11712 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11713 "java_aconfig_library passed as an input",
11714 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11715
11716 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11717 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11718 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11719 "input",
11720 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11721
11722 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11723 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11724 // aconfig_declarations module "quux" should not be passed to aconfig.
11725 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11726 "depend on java_aconfig_library not passed as an input",
11727 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11728}
Cole Faust7c991b42024-05-15 11:17:55 -070011729
11730func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011731 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011732 ctx := testApex(t, `
11733 apex {
11734 name: "myapex",
11735 key: "myapex.key",
11736 prebuilts: ["myetc", "myetc2"],
11737 min_sdk_version: "29",
11738 }
11739 apex_key {
11740 name: "myapex.key",
11741 public_key: "testkey.avbpubkey",
11742 private_key: "testkey.pem",
11743 }
11744
11745 prebuilt_etc {
11746 name: "myetc",
11747 src: "myprebuilt",
11748 filename: "myfilename",
11749 }
11750 prebuilt_etc {
11751 name: "myetc2",
11752 sub_dir: "mysubdir",
11753 src: "myprebuilt",
11754 filename: "myfilename",
11755 }
11756 `, withFiles(android.MockFS{
11757 "packages/modules/common/build/allowed_deps.txt": nil,
11758 }))
11759
11760 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11761 data := android.AndroidMkDataForTest(t, ctx, ab)
11762 var builder strings.Builder
11763 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11764 androidMk := builder.String()
11765
11766 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11767 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11768}
Spandan Das50801e22024-05-13 18:29:45 +000011769
11770func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011771 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011772 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11773 args := module.Rule("apexRule").Args
11774 optFlags := args["opt_flags"]
11775 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11776 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11777 }
11778 }
11779
11780 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11781 t.Helper()
11782 found := false
11783 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11784 if dep == wantDep {
11785 found = true
11786 }
11787 })
11788 if !found {
11789 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11790 }
11791 }
11792
11793 ctx := testApex(t, `
11794 apex {
11795 name: "com.android.apex30",
11796 min_sdk_version: "30",
11797 key: "apex30.key",
11798 java_libs: ["javalib"],
11799 }
11800
11801 java_library {
11802 name: "javalib",
11803 srcs: ["A.java"],
11804 apex_available: ["com.android.apex30"],
11805 min_sdk_version: "30",
11806 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011807 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011808 }
11809
11810 override_apex {
11811 name: "com.mycompany.android.apex30",
11812 base: "com.android.apex30",
11813 }
11814
11815 override_apex {
11816 name: "com.mycompany.android.apex31",
11817 base: "com.android.apex30",
11818 min_sdk_version: "31",
11819 }
11820
11821 apex_key {
11822 name: "apex30.key",
11823 public_key: "testkey.avbpubkey",
11824 private_key: "testkey.pem",
11825 }
11826
11827 `, android.FixtureMergeMockFs(android.MockFS{
11828 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11829 }),
11830 )
11831
11832 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11833 checkMinSdkVersion(t, baseModule, "30")
11834
11835 // Override module, but uses same min_sdk_version
11836 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11837 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11838 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11839 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11840
11841 // Override module, uses different min_sdk_version
11842 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11843 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11844 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11845 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11846}
Spandan Das0b28fa02024-05-28 23:40:17 +000011847
11848func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011849 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011850 context := android.GroupFixturePreparers(
11851 android.PrepareForIntegrationTestWithAndroid,
11852 PrepareForTestWithApexBuildComponents,
11853 android.FixtureMergeMockFs(android.MockFS{
11854 "system/sepolicy/apex/foo-file_contexts": nil,
11855 }),
11856 )
11857 res := context.RunTestWithBp(t, `
11858 apex {
11859 name: "foo",
11860 key: "myapex.key",
11861 apex_available_name: "com.android.foo",
11862 variant_version: "0",
11863 updatable: false,
11864 }
11865 apex_key {
11866 name: "myapex.key",
11867 public_key: "testkey.avbpubkey",
11868 private_key: "testkey.pem",
11869 }
11870 prebuilt_apex {
11871 name: "foo",
11872 src: "foo.apex",
11873 prefer: true,
11874 }
11875 override_apex {
11876 name: "myoverrideapex",
11877 base: "foo",
11878 }
11879 `)
11880
Colin Cross697f25d2024-12-17 15:27:16 -080011881 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex", "foo")
Spandan Das0b28fa02024-05-28 23:40:17 +000011882}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011883
11884func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011885 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011886 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`, `
11887 apex {
11888 name: "myapex",
11889 key: "myapex.key",
11890 updatable: true,
11891 min_sdk_version: "current",
11892 }
11893
11894 apex_key {
11895 name: "myapex.key",
11896 public_key: "testkey.avbpubkey",
11897 private_key: "testkey.pem",
11898 }
11899 `)
11900}
Spandan Das2f68f192024-07-22 19:25:50 +000011901
11902func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011903 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011904 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11905 result := android.GroupFixturePreparers(
11906 prepareForApexTest,
11907 android.PrepareForTestWithAndroidMk,
11908 android.PrepareForTestWithMakevars,
11909 android.FixtureMergeMockFs(fs),
11910 ).RunTest(t)
11911
11912 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011913 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011914
11915 installRules := result.InstallMakeRulesForTesting(t)
11916
11917 var installedlibRule *android.InstallMakeRule
11918 for i, rule := range installRules {
11919 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11920 if installedlibRule != nil {
11921 t.Errorf("Duplicate install rules for %s", rule.Target)
11922 }
11923 installedlibRule = &installRules[i]
11924 }
11925 }
11926 if installedlibRule == nil {
11927 t.Errorf("No install rule found for installedlib")
11928 return
11929 }
11930
11931 if expectLibfooOnSystemLib {
11932 android.AssertStringListContains(t,
11933 "installedlib doesn't have install dependency on libfoo impl",
11934 installedlibRule.OrderOnlyDeps,
11935 "out/target/product/test_device/system/lib/libfoo.so")
11936 } else {
11937 android.AssertStringListDoesNotContain(t,
11938 "installedlib has install dependency on libfoo stub",
11939 installedlibRule.Deps,
11940 "out/target/product/test_device/system/lib/libfoo.so")
11941 android.AssertStringListDoesNotContain(t,
11942 "installedlib has order-only install dependency on libfoo stub",
11943 installedlibRule.OrderOnlyDeps,
11944 "out/target/product/test_device/system/lib/libfoo.so")
11945 }
11946 }
11947
11948 prebuiltLibfooBp := []byte(`
11949 cc_prebuilt_library {
11950 name: "libfoo",
11951 prefer: true,
11952 srcs: ["libfoo.so"],
11953 stubs: {
11954 versions: ["1"],
11955 },
11956 apex_available: ["apexfoo"],
11957 }
11958 `)
11959
11960 apexfooBp := []byte(`
11961 apex {
11962 name: "apexfoo",
11963 key: "apexfoo.key",
11964 native_shared_libs: ["libfoo"],
11965 updatable: false,
11966 compile_multilib: "both",
11967 }
11968 apex_key {
11969 name: "apexfoo.key",
11970 public_key: "testkey.avbpubkey",
11971 private_key: "testkey.pem",
11972 }
11973 `)
11974
11975 installedlibBp := []byte(`
11976 cc_library {
11977 name: "installedlib",
11978 shared_libs: ["libfoo"],
11979 }
11980 `)
11981
11982 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011983 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011984 testFunc(
11985 t,
11986 /*expectLibfooOnSystemLib=*/ false,
11987 android.MockFS{
11988 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11989 "apexfoo/Android.bp": apexfooBp,
11990 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11991 "Android.bp": installedlibBp,
11992 },
11993 )
11994 })
11995
11996 disabledSourceLibfooBp := []byte(`
11997 cc_library {
11998 name: "libfoo",
11999 enabled: false,
12000 stubs: {
12001 versions: ["1"],
12002 },
12003 apex_available: ["apexfoo"],
12004 }
12005 `)
12006
12007 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012008 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000012009 testFunc(
12010 t,
12011 /*expectLibfooOnSystemLib=*/ false,
12012 android.MockFS{
12013 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12014 "impl/Android.bp": disabledSourceLibfooBp,
12015 "apexfoo/Android.bp": apexfooBp,
12016 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12017 "Android.bp": installedlibBp,
12018 },
12019 )
12020 })
12021}
Jihoon Kange246bb72024-09-18 22:26:22 +000012022
12023func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012024 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000012025 // This test case tests that listing the impl lib instead of the top level java_sdk_library
12026 // in libs of android_app and java_library does not lead to class loader context device/host
12027 // path mismatch errors.
12028 android.GroupFixturePreparers(
12029 prepareForApexTest,
12030 android.PrepareForIntegrationTestWithAndroid,
12031 PrepareForTestWithApexBuildComponents,
12032 android.FixtureModifyEnv(func(env map[string]string) {
12033 env["DISABLE_CONTAINER_CHECK"] = "true"
12034 }),
12035 withFiles(filesForSdkLibrary),
12036 android.FixtureMergeMockFs(android.MockFS{
12037 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
12038 }),
12039 ).RunTestWithBp(t, `
12040 apex {
12041 name: "com.android.foo30",
12042 key: "myapex.key",
12043 updatable: true,
12044 bootclasspath_fragments: [
12045 "foo-bootclasspath-fragment",
12046 ],
12047 java_libs: [
12048 "bar",
12049 ],
12050 apps: [
12051 "bar-app",
12052 ],
12053 min_sdk_version: "30",
12054 }
12055 apex_key {
12056 name: "myapex.key",
12057 public_key: "testkey.avbpubkey",
12058 private_key: "testkey.pem",
12059 }
12060 bootclasspath_fragment {
12061 name: "foo-bootclasspath-fragment",
12062 contents: [
12063 "framework-foo",
12064 ],
12065 apex_available: [
12066 "com.android.foo30",
12067 ],
12068 hidden_api: {
12069 split_packages: ["*"]
12070 },
12071 }
12072
12073 java_sdk_library {
12074 name: "framework-foo",
12075 srcs: [
12076 "A.java"
12077 ],
12078 unsafe_ignore_missing_latest_api: true,
12079 apex_available: [
12080 "com.android.foo30",
12081 ],
12082 compile_dex: true,
12083 sdk_version: "core_current",
12084 shared_library: false,
12085 }
12086
12087 java_library {
12088 name: "bar",
12089 srcs: [
12090 "A.java"
12091 ],
12092 libs: [
12093 "framework-foo.impl",
12094 ],
12095 apex_available: [
12096 "com.android.foo30",
12097 ],
12098 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012099 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012100 }
12101
12102 java_library {
12103 name: "baz",
12104 srcs: [
12105 "A.java"
12106 ],
12107 libs: [
12108 "bar",
12109 ],
12110 sdk_version: "core_current",
12111 }
12112
12113 android_app {
12114 name: "bar-app",
12115 srcs: [
12116 "A.java"
12117 ],
12118 libs: [
12119 "baz",
12120 "framework-foo.impl",
12121 ],
12122 apex_available: [
12123 "com.android.foo30",
12124 ],
12125 sdk_version: "core_current",
12126 min_sdk_version: "30",
12127 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012128 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012129 }
12130 `)
12131}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012132
12133// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12134func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012135 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012136 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12137 apex {
12138 name: "myapex",
12139 key: "myapex.key",
12140 systemserverclasspath_fragments: [
12141 "mysystemserverclasspathfragment",
12142 ],
12143 min_sdk_version: "29",
12144 updatable: true,
12145 system_ext_specific: true,
12146 }
12147
12148 apex_key {
12149 name: "myapex.key",
12150 public_key: "testkey.avbpubkey",
12151 private_key: "testkey.pem",
12152 }
12153
12154 java_library {
12155 name: "foo",
12156 srcs: ["b.java"],
12157 min_sdk_version: "29",
12158 installable: true,
12159 apex_available: [
12160 "myapex",
12161 ],
12162 sdk_version: "current",
12163 }
12164
12165 systemserverclasspath_fragment {
12166 name: "mysystemserverclasspathfragment",
12167 contents: [
12168 "foo",
12169 ],
12170 apex_available: [
12171 "myapex",
12172 ],
12173 }
12174 `,
12175 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12176 )
12177}
Spandan Das72d86c62024-10-15 19:27:41 +000012178
12179// partitions should not package the artifacts that are included inside the apex.
12180func TestFilesystemWithApexDeps(t *testing.T) {
12181 t.Parallel()
12182 result := testApex(t, `
12183 android_filesystem {
12184 name: "myfilesystem",
12185 deps: ["myapex"],
12186 }
12187 apex {
12188 name: "myapex",
12189 key: "myapex.key",
12190 binaries: ["binfoo"],
12191 native_shared_libs: ["libfoo"],
12192 apps: ["appfoo"],
12193 updatable: false,
12194 }
12195 apex_key {
12196 name: "myapex.key",
12197 }
12198 cc_binary {
12199 name: "binfoo",
12200 apex_available: ["myapex"],
12201 }
12202 cc_library {
12203 name: "libfoo",
12204 apex_available: ["myapex"],
12205 }
12206 android_app {
12207 name: "appfoo",
12208 sdk_version: "current",
12209 apex_available: ["myapex"],
12210 }
12211 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12212
12213 partition := result.ModuleForTests("myfilesystem", "android_common")
12214 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12215 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12216}