blob: 0472488c755ee88595fda4247ddcaa5d71657f07 [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"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900901 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800914 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000927 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 versions: ["1", "2", "3"],
929 },
930 }
931
932 cc_library {
933 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900934 srcs: ["mylib.cpp"],
935 shared_libs: ["mylib4"],
936 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["10", "11", "12"],
941 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900944
945 cc_library {
946 name: "mylib4",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000950 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900951 }
Jiyong Park105dc322021-06-11 17:22:09 +0900952
Spandan Das357ffcc2024-07-24 18:07:48 +0000953 cc_prebuilt_library_shared {
954 name: "my_prebuilt_platform_lib",
955 stubs: {
956 symbol_file: "my_prebuilt_platform_lib.map.txt",
957 versions: ["1", "2", "3"],
958 },
959 srcs: ["foo.so"],
960 }
961
962 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963 cc_prebuilt_library_shared {
964 name: "my_prebuilt_platform_stub_only_lib",
965 stubs: {
966 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967 versions: ["1", "2", "3"],
968 }
969 }
970
Jiyong Park105dc322021-06-11 17:22:09 +0900971 rust_binary {
972 name: "foo.rust",
973 srcs: ["foo.rs"],
974 shared_libs: ["libfoo.shared_from_rust"],
975 prefer_rlib: true,
976 apex_available: ["myapex"],
977 }
978
979 cc_library_shared {
980 name: "libfoo.shared_from_rust",
981 srcs: ["mylib.cpp"],
982 system_shared_libs: [],
983 stl: "none",
984 stubs: {
985 versions: ["10", "11", "12"],
986 },
987 }
988
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989 `)
990
Jooyung Hana0503a52023-08-23 13:12:50 +0900991 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 copyCmds := apexRule.Args["copy_commands"]
993
994 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996
997 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
Colin Crossaede88c2020-08-11 12:17:01 -07001003 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001006 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001008 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009
Colin Crossea91a172024-11-05 16:14:05 -08001010 // 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 -07001011 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001013 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001014
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001015 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016 // is replaced by sharing of "cFlags" in cc/builder.go.
1017 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018 // module variable representing "cflags". So it was not detected by ensureNotContains.
1019 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021 // including the original cflags's "-include mylib.h".
1022 //
Jiyong Park64379952018-12-13 18:37:29 +09001023 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001024 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001026
Jiyong Park85cc35a2022-07-17 11:30:47 +09001027 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1028 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029 // Ensure that genstub for apex-provided lib is invoked with --apex
1030 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001031
Jooyung Hana0503a52023-08-23 13:12:50 +09001032 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001033 "lib64/mylib.so",
1034 "lib64/mylib3.so",
1035 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001036 "bin/foo.rust",
1037 "lib64/libc++.so", // by the implicit dependency from foo.rust
1038 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001039 })
Jiyong Park105dc322021-06-11 17:22:09 +09001040
1041 // Ensure that stub dependency from a rust module is not included
1042 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001047
Jooyung Hana0503a52023-08-23 13:12:50 +09001048 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001049 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001050
1051 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1056 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057
1058 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1063 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 +09001064}
1065
Jooyung Han20348752023-12-05 15:23:56 +09001066func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001067 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001068 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069 apex {
1070 name: "myapex",
1071 key: "myapex.key",
1072 vendor: true,
1073 updatable: false,
1074 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "libbar",
1085 srcs: ["mylib.cpp"],
1086 llndk: {
1087 symbol_file: "libbar.map.txt",
1088 }
1089 }
1090 `)
1091}
1092
Jiyong Park1bc84122021-06-22 20:23:05 +09001093func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001094 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001095 ctx := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 binaries: ["foo.rust"],
1101 updatable: false,
1102 platform_apis: true,
1103 }
1104
1105 apex_key {
1106 name: "myapex.key",
1107 public_key: "testkey.avbpubkey",
1108 private_key: "testkey.pem",
1109 }
1110
1111 cc_library {
1112 name: "mylib",
1113 srcs: ["mylib.cpp"],
1114 shared_libs: ["mylib2"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 apex_available: [ "myapex" ],
1118 }
1119
1120 cc_library {
1121 name: "mylib2",
1122 srcs: ["mylib.cpp"],
1123 cflags: ["-include mylib.h"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["1", "2", "3"],
1128 },
1129 }
1130
1131 rust_binary {
1132 name: "foo.rust",
1133 srcs: ["foo.rs"],
1134 shared_libs: ["libfoo.shared_from_rust"],
1135 prefer_rlib: true,
1136 apex_available: ["myapex"],
1137 }
1138
1139 cc_library_shared {
1140 name: "libfoo.shared_from_rust",
1141 srcs: ["mylib.cpp"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["10", "11", "12"],
1146 },
1147 }
1148 `)
1149
Jooyung Hana0503a52023-08-23 13:12:50 +09001150 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001151 copyCmds := apexRule.Args["copy_commands"]
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156
1157 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001162 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165}
1166
Colin Cross7812fd32020-09-25 12:35:10 -07001167func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001169 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001170 apex {
1171 name: "myapex",
1172 key: "myapex.key",
1173 native_shared_libs: ["mylib", "mylib3"],
1174 min_sdk_version: "29",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 cc_library {
1184 name: "mylib",
1185 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001186 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001187 system_shared_libs: [],
1188 stl: "none",
1189 apex_available: [ "myapex" ],
1190 min_sdk_version: "28",
1191 }
1192
1193 cc_library {
1194 name: "mylib2",
1195 srcs: ["mylib.cpp"],
1196 cflags: ["-include mylib.h"],
1197 system_shared_libs: [],
1198 stl: "none",
1199 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001200 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001201 versions: ["28", "29", "30", "current"],
1202 },
1203 min_sdk_version: "28",
1204 }
1205
1206 cc_library {
1207 name: "mylib3",
1208 srcs: ["mylib.cpp"],
1209 shared_libs: ["mylib4"],
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001213 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001214 versions: ["28", "29", "30", "current"],
1215 },
1216 apex_available: [ "myapex" ],
1217 min_sdk_version: "28",
1218 }
1219
1220 cc_library {
1221 name: "mylib4",
1222 srcs: ["mylib.cpp"],
1223 system_shared_libs: [],
1224 stl: "none",
1225 apex_available: [ "myapex" ],
1226 min_sdk_version: "28",
1227 }
1228 `)
1229
Jooyung Hana0503a52023-08-23 13:12:50 +09001230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001231 copyCmds := apexRule.Args["copy_commands"]
1232
1233 // Ensure that direct non-stubs dep is always included
1234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235
1236 // Ensure that indirect stubs dep is not included
1237 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238
1239 // Ensure that direct stubs dep is included
1240 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241
1242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243
Jiyong Park55549df2021-02-26 23:57:23 +09001244 // Ensure that mylib is linking with the latest version of stub for mylib2
1245 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001246 // ... and not linking to the non-stub (impl) variant of mylib2
1247 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248
Colin Crossea91a172024-11-05 16:14:05 -08001249 // 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 -07001250 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251 // .. and not linking to the stubs variant of mylib3
1252 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253
1254 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001255 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001256 ensureNotContains(t, mylib2Cflags, "-include ")
1257
Jiyong Park85cc35a2022-07-17 11:30:47 +09001258 // Ensure that genstub is invoked with --systemapi
1259 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001260
Jooyung Hana0503a52023-08-23 13:12:50 +09001261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001262 "lib64/mylib.so",
1263 "lib64/mylib3.so",
1264 "lib64/mylib4.so",
1265 })
1266}
1267
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001268func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269 t.Parallel()
1270 // myapex (Z)
1271 // mylib -----------------.
1272 // |
1273 // otherapex (29) |
1274 // libstub's versions: 29 Z current
1275 // |
1276 // <platform> |
1277 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001278 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001279 apex {
1280 name: "myapex",
1281 key: "myapex.key",
1282 native_shared_libs: ["mylib"],
1283 min_sdk_version: "Z", // non-final
1284 }
1285
1286 cc_library {
1287 name: "mylib",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libstub"],
1290 apex_available: ["myapex"],
1291 min_sdk_version: "Z",
1292 }
1293
1294 apex_key {
1295 name: "myapex.key",
1296 public_key: "testkey.avbpubkey",
1297 private_key: "testkey.pem",
1298 }
1299
1300 apex {
1301 name: "otherapex",
1302 key: "myapex.key",
1303 native_shared_libs: ["libstub"],
1304 min_sdk_version: "29",
1305 }
1306
1307 cc_library {
1308 name: "libstub",
1309 srcs: ["mylib.cpp"],
1310 stubs: {
1311 versions: ["29", "Z", "current"],
1312 },
1313 apex_available: ["otherapex"],
1314 min_sdk_version: "29",
1315 }
1316
1317 // platform module depending on libstub from otherapex should use the latest stub("current")
1318 cc_library {
1319 name: "libplatform",
1320 srcs: ["mylib.cpp"],
1321 shared_libs: ["libstub"],
1322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001323 `,
1324 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326 variables.Platform_sdk_final = proptools.BoolPtr(false)
1327 variables.Platform_version_active_codenames = []string{"Z"}
1328 }),
1329 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001330
Jiyong Park55549df2021-02-26 23:57:23 +09001331 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001333 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336
1337 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342}
1343
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001346 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001348 name: "myapex2",
1349 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001351 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 }
1353
1354 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001355 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "mylib",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001364 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 system_shared_libs: [],
1366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001367 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 }
1369
1370 cc_library {
1371 name: "libfoo",
1372 srcs: ["mylib.cpp"],
1373 shared_libs: ["libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["10", "20", "30"],
1378 },
1379 }
1380
1381 cc_library {
1382 name: "libbar",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 }
1387
Jiyong Park678c8812020-02-07 17:25:49 +09001388 cc_library_static {
1389 name: "libbaz",
1390 srcs: ["mylib.cpp"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex2" ],
1394 }
1395
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001396 `)
1397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that direct non-stubs dep is always included
1402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403
1404 // Ensure that indirect stubs dep is not included
1405 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406
1407 // Ensure that dependency of stubs is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409
Colin Crossaede88c2020-08-11 12:17:01 -07001410 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411
1412 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001415 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001418
1419 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001421
Colin Crossf61d03d2023-11-02 16:56:39 -07001422 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001424 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001425
Colin Crossf61d03d2023-11-02 16:56:39 -07001426 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001428 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429}
1430
Jooyung Hand3639552019-08-09 12:57:43 +09001431func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001432 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001561 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001562 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001563 cc_library {
1564 name: "libc",
1565 no_libcrt: true,
1566 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001567 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568 stl: "none",
1569 system_shared_libs: [],
1570 stubs: { versions: ["1"] },
1571 apex_available: ["com.android.runtime"],
1572
1573 sanitize: {
1574 hwaddress: true,
1575 }
1576 }
1577
1578 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001579 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 no_libcrt: true,
1581 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001582 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 stl: "none",
1584 system_shared_libs: [],
1585 srcs: [""],
1586 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
1589 sanitize: {
1590 never: true,
1591 },
Spandan Das4de7b492023-05-05 21:13:01 +00001592 apex_available: [
1593 "//apex_available:anyapex",
1594 "//apex_available:platform",
1595 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001596 } `)
1597 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598
Jooyung Hana0503a52023-08-23 13:12:50 +09001599 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 "lib64/bionic/libc.so",
1601 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602 })
1603
Colin Cross4c4c1be2022-02-10 11:41:18 -08001604 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001605
1606 installed := hwasan.Description("install libclang_rt.hwasan")
1607 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608
1609 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612}
1613
1614func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001615 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001616 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001617 prepareForTestOfRuntimeApexWithHwasan,
1618 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619 variables.SanitizeDevice = []string{"hwaddress"}
1620 }),
1621 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622 cc_library {
1623 name: "libc",
1624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 stubs: { versions: ["1"] },
1630 apex_available: ["com.android.runtime"],
1631 }
1632
1633 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001634 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001635 no_libcrt: true,
1636 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001637 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 stl: "none",
1639 system_shared_libs: [],
1640 srcs: [""],
1641 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001642 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
1644 sanitize: {
1645 never: true,
1646 },
Spandan Das4de7b492023-05-05 21:13:01 +00001647 apex_available: [
1648 "//apex_available:anyapex",
1649 "//apex_available:platform",
1650 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001651 }
Paul Duffina02cae32021-03-09 01:44:06 +00001652 `)
1653 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654
Jooyung Hana0503a52023-08-23 13:12:50 +09001655 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 "lib64/bionic/libc.so",
1657 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658 })
1659
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 installed := hwasan.Description("install libclang_rt.hwasan")
1663 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664
1665 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668}
1669
Jooyung Han61b66e92020-03-21 14:21:46 +00001670func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001671 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 testcases := []struct {
1673 name string
1674 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001675 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001676 shouldLink string
1677 shouldNotLink []string
1678 }{
1679 {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001681 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001682 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 shouldLink: "current",
1684 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 },
1686 {
Jiyong Park55549df2021-02-26 23:57:23 +09001687 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001688 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001689 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 shouldLink: "current",
1691 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 },
1693 }
1694 for _, tc := range testcases {
1695 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001696 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001697 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 apex {
1699 name: "myapex",
1700 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001702 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001703 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Jooyung Han61b66e92020-03-21 14:21:46 +00001706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 cc_library {
1713 name: "mylib",
1714 srcs: ["mylib.cpp"],
1715 vendor_available: true,
1716 shared_libs: ["libbar"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722
Jooyung Han61b66e92020-03-21 14:21:46 +00001723 cc_library {
1724 name: "libbar",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001729 llndk: {
1730 symbol_file: "libbar.map.txt",
1731 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001733 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001734 withUnbundledBuild,
1735 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001736
Jooyung Han61b66e92020-03-21 14:21:46 +00001737 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 "lib64/mylib.so",
1740 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001741
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001743 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001746
Steven Moreland2c4000c2021-04-27 02:08:49 +00001747 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001752
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 ver := tc.shouldLink
1755 if tc.shouldLink == "current" {
1756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 }
1758 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 })
1760 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761}
1762
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001770 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "mylib",
1781 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001782 system_shared_libs: ["libc"],
1783 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 }
1787
1788 cc_library_shared {
1789 name: "mylib_shared",
1790 srcs: ["mylib.cpp"],
1791 shared_libs: ["libdl#27"],
1792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001793 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001794 }
1795
1796 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001797 name: "libBootstrap",
1798 srcs: ["mylib.cpp"],
1799 stl: "none",
1800 bootstrap: true,
1801 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 `)
1803
Jooyung Hana0503a52023-08-23 13:12:50 +09001804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 copyCmds := apexRule.Args["copy_commands"]
1806
1807 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001811
1812 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001813 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
Colin Crossaede88c2020-08-11 12:17:01 -07001815 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818
1819 // For dependency to libc
1820 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001821 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001823 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001824 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001825 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827
1828 // For dependency to libm
1829 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001832 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001833 // ... and is not compiling with the stub
1834 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836
1837 // For dependency to libdl
1838 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001839 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... Cflags from stub is correctly exported to mylib
1846 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001848
1849 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001850 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001854}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001855
Jooyung Han749dc692020-04-15 11:03:39 +09001856func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001857 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001858 // there are three links between liba --> libz.
1859 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001860 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001861 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001862 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 apex {
1871 name: "otherapex",
1872 key: "myapex.key",
1873 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882
1883 cc_library {
1884 name: "libx",
1885 shared_libs: ["liba"],
1886 system_shared_libs: [],
1887 stl: "none",
1888 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001889 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 cc_library {
1893 name: "liby",
1894 shared_libs: ["liba"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
1900
1901 cc_library {
1902 name: "liba",
1903 shared_libs: ["libz"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [
1907 "//apex_available:anyapex",
1908 "//apex_available:platform",
1909 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "libz",
1915 system_shared_libs: [],
1916 stl: "none",
1917 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001918 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001919 },
1920 }
Jooyung Han749dc692020-04-15 11:03:39 +09001921 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001922
1923 expectLink := func(from, from_variant, to, to_variant string) {
1924 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926 }
1927 expectNoLink := func(from, from_variant, to, to_variant string) {
1928 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 // platform liba is linked to non-stub version
1932 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001933 // liba in myapex is linked to current
1934 expectLink("liba", "shared_apex29", "libz", "shared_current")
1935 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001936 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001937 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001938 // liba in otherapex is linked to current
1939 expectLink("liba", "shared_apex30", "libz", "shared_current")
1940 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001941 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001943}
1944
Jooyung Hanaed150d2020-04-02 01:41:41 +09001945func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001947 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 native_shared_libs: ["libx"],
1952 min_sdk_version: "R",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 cc_library {
1962 name: "libx",
1963 shared_libs: ["libz"],
1964 system_shared_libs: [],
1965 stl: "none",
1966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001967 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 }
1969
1970 cc_library {
1971 name: "libz",
1972 system_shared_libs: [],
1973 stl: "none",
1974 stubs: {
1975 versions: ["29", "R"],
1976 },
1977 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"R"}
1981 }),
1982 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001983
1984 expectLink := func(from, from_variant, to, to_variant string) {
1985 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987 }
1988 expectNoLink := func(from, from_variant, to, to_variant string) {
1989 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001992 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001994 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001996}
1997
Jooyung Han4c4da062021-06-23 10:23:16 +09001998func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001999 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002000 testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 java_libs: ["libx"],
2005 min_sdk_version: "S",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 java_library {
2015 name: "libx",
2016 srcs: ["a.java"],
2017 apex_available: [ "myapex" ],
2018 sdk_version: "current",
2019 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002020 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002021 }
2022 `,
2023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024 variables.Platform_version_active_codenames = []string{"S"}
2025 variables.Platform_sdk_codename = proptools.StringPtr("S")
2026 }),
2027 )
2028}
2029
Jooyung Han749dc692020-04-15 11:03:39 +09002030func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002031 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002032 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002037 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002038 }
2039
2040 apex_key {
2041 name: "myapex.key",
2042 public_key: "testkey.avbpubkey",
2043 private_key: "testkey.pem",
2044 }
2045
2046 cc_library {
2047 name: "libx",
2048 shared_libs: ["libz"],
2049 system_shared_libs: [],
2050 stl: "none",
2051 apex_available: [ "myapex" ],
2052 }
2053
2054 cc_library {
2055 name: "libz",
2056 system_shared_libs: [],
2057 stl: "none",
2058 stubs: {
2059 versions: ["1", "2"],
2060 },
2061 }
2062 `)
2063
2064 expectLink := func(from, from_variant, to, to_variant string) {
2065 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067 }
2068 expectNoLink := func(from, from_variant, to, to_variant string) {
2069 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002072 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002073 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002076}
2077
Jooyung Handfc864c2023-03-20 18:19:07 +09002078func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002079 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 ctx := testApex(t, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002085 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002086 vendor: true,
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 cc_library {
2097 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002098 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002099 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002101 shared_libs: ["libbar"],
2102 }
2103
2104 cc_library {
2105 name: "libbar",
2106 stubs: { versions: ["29", "30"] },
2107 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002108 }
2109 `)
2110
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002111 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002114
2115 // Ensure that mylib links with "current" LLNDK
2116 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002117 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002118
2119 // Ensure that mylib is targeting 29
2120 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122
2123 // Ensure that the correct variant of crtbegin_so is used.
2124 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002126
2127 // Ensure that the crtbegin_so used by the APEX is targeting 29
2128 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130}
2131
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002132func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002133 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002134 ctx := testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 updatable: true,
2139 native_shared_libs: [
2140 "mylib",
2141 "yourlib",
2142 ],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex {
2147 name: "myapex2",
2148 key: "myapex.key",
2149 updatable: false,
2150 native_shared_libs: ["yourlib"],
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["libbar"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex"],
2165 }
2166
2167 cc_library {
2168 name: "libbar",
2169 stubs: { versions: ["29", "30"] },
2170 }
2171
2172 cc_library {
2173 name: "yourlib",
2174 srcs: ["mylib.cpp"],
2175 min_sdk_version: "29",
2176 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }))
2181
2182 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002184 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002185 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002186 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002188
2189 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2190 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191 myapex.Output("depsinfo/flatlist.txt")), "\n")
2192 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195 flatlist, "mylib:(minSdkVersion:29)")
2196 android.AssertStringListContains(t, "track platform-available lib",
2197 flatlist, "yourlib(minSdkVersion:29)")
Jooyung Han4495f842023-04-25 16:39:59 +09002198}
2199
2200func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002201 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002202 ctx := testApex(t, `
2203 apex {
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002204 name: "myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002205 key: "myapex.key",
2206 updatable: true,
2207 min_sdk_version: "29",
2208 }
2209
2210 apex_key {
2211 name: "myapex.key",
2212 public_key: "testkey.avbpubkey",
2213 private_key: "testkey.pem",
2214 }
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002215 `)
Jooyung Han4495f842023-04-25 16:39:59 +09002216 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2217 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2218 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2219 }
2220}
2221
Jooyung Han03b51852020-02-26 22:45:42 +09002222func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002223 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002224 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002225 apex {
2226 name: "myapex",
2227 key: "myapex.key",
2228 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002229 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002230 }
2231
2232 apex_key {
2233 name: "myapex.key",
2234 public_key: "testkey.avbpubkey",
2235 private_key: "testkey.pem",
2236 }
2237
2238 cc_library {
2239 name: "libx",
2240 system_shared_libs: [],
2241 stl: "none",
2242 apex_available: [ "myapex" ],
2243 stubs: {
2244 versions: ["1", "2"],
2245 },
2246 }
2247
2248 cc_library {
2249 name: "libz",
2250 shared_libs: ["libx"],
2251 system_shared_libs: [],
2252 stl: "none",
2253 }
2254 `)
2255
2256 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002257 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002258 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2259 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2260 }
2261 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002262 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002263 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2264 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2265 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002266 expectLink("libz", "shared", "libx", "shared_current")
2267 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002268 expectNoLink("libz", "shared", "libz", "shared_1")
2269 expectNoLink("libz", "shared", "libz", "shared")
2270}
2271
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002272var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2273 func(variables android.FixtureProductVariables) {
2274 variables.SanitizeDevice = []string{"hwaddress"}
2275 },
2276)
2277
Jooyung Han75568392020-03-20 04:29:24 +09002278func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002279 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002280 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002281 apex {
2282 name: "myapex",
2283 key: "myapex.key",
2284 native_shared_libs: ["libx"],
2285 min_sdk_version: "29",
2286 }
2287
2288 apex_key {
2289 name: "myapex.key",
2290 public_key: "testkey.avbpubkey",
2291 private_key: "testkey.pem",
2292 }
2293
2294 cc_library {
2295 name: "libx",
2296 shared_libs: ["libbar"],
2297 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002298 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002299 }
2300
2301 cc_library {
2302 name: "libbar",
2303 stubs: {
2304 versions: ["29", "30"],
2305 },
2306 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002307 `,
2308 prepareForTestWithSantitizeHwaddress,
2309 )
Jooyung Han03b51852020-02-26 22:45:42 +09002310 expectLink := func(from, from_variant, to, to_variant string) {
2311 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2312 libFlags := ld.Args["libFlags"]
2313 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2314 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002315 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002316}
2317
Jooyung Han75568392020-03-20 04:29:24 +09002318func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002319 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002320 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002321 apex {
2322 name: "myapex",
2323 key: "myapex.key",
2324 native_shared_libs: ["libx"],
2325 min_sdk_version: "29",
2326 }
2327
2328 apex_key {
2329 name: "myapex.key",
2330 public_key: "testkey.avbpubkey",
2331 private_key: "testkey.pem",
2332 }
2333
2334 cc_library {
2335 name: "libx",
2336 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002337 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002338 }
Jooyung Han75568392020-03-20 04:29:24 +09002339 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002340
2341 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002342 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002343 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002344 // note that platform variant is not.
2345 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002346 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002347}
2348
Jooyung Han749dc692020-04-15 11:03:39 +09002349func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002350 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002351 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002352 apex {
2353 name: "myapex",
2354 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002355 native_shared_libs: ["mylib"],
2356 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002357 }
2358
2359 apex_key {
2360 name: "myapex.key",
2361 public_key: "testkey.avbpubkey",
2362 private_key: "testkey.pem",
2363 }
Jooyung Han749dc692020-04-15 11:03:39 +09002364
2365 cc_library {
2366 name: "mylib",
2367 srcs: ["mylib.cpp"],
2368 system_shared_libs: [],
2369 stl: "none",
2370 apex_available: [
2371 "myapex",
2372 ],
2373 min_sdk_version: "30",
2374 }
2375 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002376
2377 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2378 apex {
2379 name: "myapex",
2380 key: "myapex.key",
2381 native_shared_libs: ["libfoo.ffi"],
2382 min_sdk_version: "29",
2383 }
2384
2385 apex_key {
2386 name: "myapex.key",
2387 public_key: "testkey.avbpubkey",
2388 private_key: "testkey.pem",
2389 }
2390
2391 rust_ffi_shared {
2392 name: "libfoo.ffi",
2393 srcs: ["foo.rs"],
2394 crate_name: "foo",
2395 apex_available: [
2396 "myapex",
2397 ],
2398 min_sdk_version: "30",
2399 }
2400 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002401
2402 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2403 apex {
2404 name: "myapex",
2405 key: "myapex.key",
2406 java_libs: ["libfoo"],
2407 min_sdk_version: "29",
2408 }
2409
2410 apex_key {
2411 name: "myapex.key",
2412 public_key: "testkey.avbpubkey",
2413 private_key: "testkey.pem",
2414 }
2415
2416 java_import {
2417 name: "libfoo",
2418 jars: ["libfoo.jar"],
2419 apex_available: [
2420 "myapex",
2421 ],
2422 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002423 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002424 }
2425 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002426
2427 // Skip check for modules compiling against core API surface
2428 testApex(t, `
2429 apex {
2430 name: "myapex",
2431 key: "myapex.key",
2432 java_libs: ["libfoo"],
2433 min_sdk_version: "29",
2434 }
2435
2436 apex_key {
2437 name: "myapex.key",
2438 public_key: "testkey.avbpubkey",
2439 private_key: "testkey.pem",
2440 }
2441
2442 java_library {
2443 name: "libfoo",
2444 srcs: ["Foo.java"],
2445 apex_available: [
2446 "myapex",
2447 ],
2448 // Compile against core API surface
2449 sdk_version: "core_current",
2450 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002451 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002452 }
2453 `)
2454
Jooyung Han749dc692020-04-15 11:03:39 +09002455}
2456
2457func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002458 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002459 testApex(t, `
2460 apex {
2461 name: "myapex",
2462 key: "myapex.key",
2463 native_shared_libs: ["libfoo"],
2464 java_libs: ["libbar"],
2465 min_sdk_version: "29",
2466 }
2467
2468 apex_key {
2469 name: "myapex.key",
2470 public_key: "testkey.avbpubkey",
2471 private_key: "testkey.pem",
2472 }
2473
2474 cc_library {
2475 name: "libfoo",
2476 srcs: ["mylib.cpp"],
2477 shared_libs: ["libfoo_dep"],
2478 apex_available: ["myapex"],
2479 min_sdk_version: "29",
2480 }
2481
2482 cc_library {
2483 name: "libfoo_dep",
2484 srcs: ["mylib.cpp"],
2485 apex_available: ["myapex"],
2486 min_sdk_version: "29",
2487 }
2488
2489 java_library {
2490 name: "libbar",
2491 sdk_version: "current",
2492 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002493 static_libs: [
2494 "libbar_dep",
2495 "libbar_import_dep",
2496 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002497 apex_available: ["myapex"],
2498 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002499 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002500 }
2501
2502 java_library {
2503 name: "libbar_dep",
2504 sdk_version: "current",
2505 srcs: ["a.java"],
2506 apex_available: ["myapex"],
2507 min_sdk_version: "29",
2508 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002509
2510 java_import {
2511 name: "libbar_import_dep",
2512 jars: ["libbar.jar"],
2513 apex_available: ["myapex"],
2514 min_sdk_version: "29",
2515 }
Jooyung Han03b51852020-02-26 22:45:42 +09002516 `)
2517}
2518
Colin Cross8ca61c12022-10-06 21:00:14 -07002519func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002520 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002521 // Tests that an apex dependency with min_sdk_version higher than the
2522 // min_sdk_version of the apex is allowed as long as the dependency's
2523 // min_sdk_version is less than or equal to the api level that the
2524 // architecture was introduced in. In this case, arm64 didn't exist
2525 // until api level 21, so the arm64 code will never need to run on
2526 // an api level 20 device, even if other architectures of the apex
2527 // will.
2528 testApex(t, `
2529 apex {
2530 name: "myapex",
2531 key: "myapex.key",
2532 native_shared_libs: ["libfoo"],
2533 min_sdk_version: "20",
2534 }
2535
2536 apex_key {
2537 name: "myapex.key",
2538 public_key: "testkey.avbpubkey",
2539 private_key: "testkey.pem",
2540 }
2541
2542 cc_library {
2543 name: "libfoo",
2544 srcs: ["mylib.cpp"],
2545 apex_available: ["myapex"],
2546 min_sdk_version: "21",
2547 stl: "none",
2548 }
2549 `)
2550}
2551
Artur Satayev8cf899a2020-04-15 17:29:42 +01002552func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002553 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002554 testCases := []struct {
2555 name string
2556 expectedError string
2557 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002558 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002559 }{
2560 {
2561 name: "Non-updatable apex with non-stable dep",
2562 bp: `
2563 apex {
2564 name: "myapex",
2565 java_libs: ["myjar"],
2566 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002567 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002568 }
2569 apex_key {
2570 name: "myapex.key",
2571 public_key: "testkey.avbpubkey",
2572 private_key: "testkey.pem",
2573 }
2574 java_library {
2575 name: "myjar",
2576 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002577 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002578 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002579 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002580 }
2581 `,
2582 },
2583 {
2584 name: "Updatable apex with stable dep",
2585 bp: `
2586 apex {
2587 name: "myapex",
2588 java_libs: ["myjar"],
2589 key: "myapex.key",
2590 updatable: true,
2591 min_sdk_version: "29",
2592 }
2593 apex_key {
2594 name: "myapex.key",
2595 public_key: "testkey.avbpubkey",
2596 private_key: "testkey.pem",
2597 }
2598 java_library {
2599 name: "myjar",
2600 srcs: ["foo/bar/MyClass.java"],
2601 sdk_version: "current",
2602 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002603 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002604 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002605 }
2606 `,
2607 },
2608 {
2609 name: "Updatable apex with non-stable dep",
2610 expectedError: "cannot depend on \"myjar\"",
2611 bp: `
2612 apex {
2613 name: "myapex",
2614 java_libs: ["myjar"],
2615 key: "myapex.key",
2616 updatable: true,
2617 }
2618 apex_key {
2619 name: "myapex.key",
2620 public_key: "testkey.avbpubkey",
2621 private_key: "testkey.pem",
2622 }
2623 java_library {
2624 name: "myjar",
2625 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002626 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002627 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002628 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002629 }
2630 `,
2631 },
2632 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002633 name: "Updatable apex with non-stable legacy core platform dep",
2634 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2635 bp: `
2636 apex {
2637 name: "myapex",
2638 java_libs: ["myjar-uses-legacy"],
2639 key: "myapex.key",
2640 updatable: true,
2641 }
2642 apex_key {
2643 name: "myapex.key",
2644 public_key: "testkey.avbpubkey",
2645 private_key: "testkey.pem",
2646 }
2647 java_library {
2648 name: "myjar-uses-legacy",
2649 srcs: ["foo/bar/MyClass.java"],
2650 sdk_version: "core_platform",
2651 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002652 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002653 }
2654 `,
2655 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2656 },
2657 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002658 name: "Updatable apex with non-stable transitive dep",
2659 // This is not actually detecting that the transitive dependency is unstable, rather it is
2660 // detecting that the transitive dependency is building against a wider API surface than the
2661 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002662 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002663 bp: `
2664 apex {
2665 name: "myapex",
2666 java_libs: ["myjar"],
2667 key: "myapex.key",
2668 updatable: true,
2669 }
2670 apex_key {
2671 name: "myapex.key",
2672 public_key: "testkey.avbpubkey",
2673 private_key: "testkey.pem",
2674 }
2675 java_library {
2676 name: "myjar",
2677 srcs: ["foo/bar/MyClass.java"],
2678 sdk_version: "current",
2679 apex_available: ["myapex"],
2680 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002681 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002682 }
2683 java_library {
2684 name: "transitive-jar",
2685 srcs: ["foo/bar/MyClass.java"],
2686 sdk_version: "core_platform",
2687 apex_available: ["myapex"],
2688 }
2689 `,
2690 },
2691 }
2692
2693 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002694 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2695 continue
2696 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002697 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002698 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002699 errorHandler := android.FixtureExpectsNoErrors
2700 if test.expectedError != "" {
2701 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002702 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002703 android.GroupFixturePreparers(
2704 java.PrepareForTestWithJavaDefaultModules,
2705 PrepareForTestWithApexBuildComponents,
2706 prepareForTestWithMyapex,
2707 android.OptionalFixturePreparer(test.preparer),
2708 ).
2709 ExtendWithErrorHandler(errorHandler).
2710 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002711 })
2712 }
2713}
2714
Jooyung Han749dc692020-04-15 11:03:39 +09002715func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2716 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2717 apex {
2718 name: "myapex",
2719 key: "myapex.key",
2720 native_shared_libs: ["mylib"],
2721 min_sdk_version: "29",
2722 }
2723
2724 apex_key {
2725 name: "myapex.key",
2726 public_key: "testkey.avbpubkey",
2727 private_key: "testkey.pem",
2728 }
2729
2730 cc_library {
2731 name: "mylib",
2732 srcs: ["mylib.cpp"],
2733 shared_libs: ["mylib2"],
2734 system_shared_libs: [],
2735 stl: "none",
2736 apex_available: [
2737 "myapex",
2738 ],
2739 min_sdk_version: "29",
2740 }
2741
2742 // indirect part of the apex
2743 cc_library {
2744 name: "mylib2",
2745 srcs: ["mylib.cpp"],
2746 system_shared_libs: [],
2747 stl: "none",
2748 apex_available: [
2749 "myapex",
2750 ],
2751 min_sdk_version: "30",
2752 }
2753 `)
2754}
2755
2756func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002757 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002758 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2759 apex {
2760 name: "myapex",
2761 key: "myapex.key",
2762 apps: ["AppFoo"],
2763 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002764 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002765 }
2766
2767 apex_key {
2768 name: "myapex.key",
2769 public_key: "testkey.avbpubkey",
2770 private_key: "testkey.pem",
2771 }
2772
2773 android_app {
2774 name: "AppFoo",
2775 srcs: ["foo/bar/MyClass.java"],
2776 sdk_version: "current",
2777 min_sdk_version: "29",
2778 system_modules: "none",
2779 stl: "none",
2780 static_libs: ["bar"],
2781 apex_available: [ "myapex" ],
2782 }
2783
2784 java_library {
2785 name: "bar",
2786 sdk_version: "current",
2787 srcs: ["a.java"],
2788 apex_available: [ "myapex" ],
2789 }
2790 `)
2791}
2792
2793func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002794 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002795 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002796 apex {
2797 name: "myapex",
2798 key: "myapex.key",
2799 native_shared_libs: ["mylib"],
2800 min_sdk_version: "29",
2801 }
2802
2803 apex_key {
2804 name: "myapex.key",
2805 public_key: "testkey.avbpubkey",
2806 private_key: "testkey.pem",
2807 }
2808
Colin Crossea91a172024-11-05 16:14:05 -08002809 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002810 cc_library {
2811 name: "mylib",
2812 srcs: ["mylib.cpp"],
2813 shared_libs: ["mylib2"],
2814 system_shared_libs: [],
2815 stl: "none",
2816 apex_available: ["myapex", "otherapex"],
2817 min_sdk_version: "29",
2818 }
2819
2820 cc_library {
2821 name: "mylib2",
2822 srcs: ["mylib.cpp"],
2823 system_shared_libs: [],
2824 stl: "none",
2825 apex_available: ["otherapex"],
2826 stubs: { versions: ["29", "30"] },
2827 min_sdk_version: "30",
2828 }
2829
2830 apex {
2831 name: "otherapex",
2832 key: "myapex.key",
2833 native_shared_libs: ["mylib", "mylib2"],
2834 min_sdk_version: "30",
2835 }
2836 `)
2837 expectLink := func(from, from_variant, to, to_variant string) {
2838 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2839 libFlags := ld.Args["libFlags"]
2840 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2841 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002842 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002843 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002844}
2845
Jooyung Haned124c32021-01-26 11:43:46 +09002846func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002847 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002848 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2849 func(variables android.FixtureProductVariables) {
2850 variables.Platform_sdk_codename = proptools.StringPtr("S")
2851 variables.Platform_version_active_codenames = []string{"S"}
2852 },
2853 )
Jooyung Haned124c32021-01-26 11:43:46 +09002854 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
2855 apex {
2856 name: "myapex",
2857 key: "myapex.key",
2858 native_shared_libs: ["libfoo"],
2859 min_sdk_version: "S",
2860 }
2861 apex_key {
2862 name: "myapex.key",
2863 public_key: "testkey.avbpubkey",
2864 private_key: "testkey.pem",
2865 }
2866 cc_library {
2867 name: "libfoo",
2868 shared_libs: ["libbar"],
2869 apex_available: ["myapex"],
2870 min_sdk_version: "29",
2871 }
2872 cc_library {
2873 name: "libbar",
2874 apex_available: ["myapex"],
2875 }
2876 `, withSAsActiveCodeNames)
2877}
2878
2879func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002880 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002881 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2882 variables.Platform_sdk_codename = proptools.StringPtr("S")
2883 variables.Platform_version_active_codenames = []string{"S", "T"}
2884 })
Colin Cross1c460562021-02-16 17:55:47 -08002885 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09002886 apex {
2887 name: "myapex",
2888 key: "myapex.key",
2889 native_shared_libs: ["libfoo"],
2890 min_sdk_version: "S",
2891 }
2892 apex_key {
2893 name: "myapex.key",
2894 public_key: "testkey.avbpubkey",
2895 private_key: "testkey.pem",
2896 }
2897 cc_library {
2898 name: "libfoo",
2899 shared_libs: ["libbar"],
2900 apex_available: ["myapex"],
2901 min_sdk_version: "S",
2902 }
2903 cc_library {
2904 name: "libbar",
2905 stubs: {
2906 symbol_file: "libbar.map.txt",
2907 versions: ["30", "S", "T"],
2908 },
2909 }
2910 `, withSAsActiveCodeNames)
2911
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002912 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09002913 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
2914 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002915 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09002916}
2917
Jiyong Park7c2ee712018-12-07 00:42:25 +09002918func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002919 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002920 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09002921 apex {
2922 name: "myapex",
2923 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002924 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09002925 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09002926 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002927 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002928 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09002929 }
2930
2931 apex_key {
2932 name: "myapex.key",
2933 public_key: "testkey.avbpubkey",
2934 private_key: "testkey.pem",
2935 }
2936
2937 prebuilt_etc {
2938 name: "myetc",
2939 src: "myprebuilt",
2940 sub_dir: "foo/bar",
2941 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002942
2943 cc_library {
2944 name: "mylib",
2945 srcs: ["mylib.cpp"],
2946 relative_install_path: "foo/bar",
2947 system_shared_libs: [],
2948 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002949 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002950 }
2951
2952 cc_binary {
2953 name: "mybin",
2954 srcs: ["mylib.cpp"],
2955 relative_install_path: "foo/bar",
2956 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002957 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002958 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002959 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09002960
2961 rust_binary {
2962 name: "mybin.rust",
2963 srcs: ["foo.rs"],
2964 relative_install_path: "rust_subdir",
2965 apex_available: [ "myapex" ],
2966 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09002967 `)
2968
Jooyung Hana0503a52023-08-23 13:12:50 +09002969 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09002970 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09002971
Jiyong Parkb7c24df2019-02-01 12:03:59 +09002972 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09002973 ensureContains(t, cmd, "/etc ")
2974 ensureContains(t, cmd, "/etc/foo ")
2975 ensureContains(t, cmd, "/etc/foo/bar ")
2976 ensureContains(t, cmd, "/lib64 ")
2977 ensureContains(t, cmd, "/lib64/foo ")
2978 ensureContains(t, cmd, "/lib64/foo/bar ")
2979 ensureContains(t, cmd, "/lib ")
2980 ensureContains(t, cmd, "/lib/foo ")
2981 ensureContains(t, cmd, "/lib/foo/bar ")
2982 ensureContains(t, cmd, "/bin ")
2983 ensureContains(t, cmd, "/bin/foo ")
2984 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09002985 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09002986}
Jiyong Parkda6eb592018-12-19 17:12:36 +09002987
Jooyung Han35155c42020-02-06 17:33:20 +09002988func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002989 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002990 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09002991 apex {
2992 name: "myapex",
2993 key: "myapex.key",
2994 multilib: {
2995 both: {
2996 native_shared_libs: ["mylib"],
2997 binaries: ["mybin"],
2998 },
2999 },
3000 compile_multilib: "both",
3001 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003002 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003003 }
3004
3005 apex_key {
3006 name: "myapex.key",
3007 public_key: "testkey.avbpubkey",
3008 private_key: "testkey.pem",
3009 }
3010
3011 cc_library {
3012 name: "mylib",
3013 relative_install_path: "foo/bar",
3014 system_shared_libs: [],
3015 stl: "none",
3016 apex_available: [ "myapex" ],
3017 native_bridge_supported: true,
3018 }
3019
3020 cc_binary {
3021 name: "mybin",
3022 relative_install_path: "foo/bar",
3023 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003024 stl: "none",
3025 apex_available: [ "myapex" ],
3026 native_bridge_supported: true,
3027 compile_multilib: "both", // default is "first" for binary
3028 multilib: {
3029 lib64: {
3030 suffix: "64",
3031 },
3032 },
3033 }
Spandan Das45e40012024-12-02 22:45:48 +00003034 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003035 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003036 "bin/foo/bar/mybin",
3037 "bin/foo/bar/mybin64",
3038 "bin/arm/foo/bar/mybin",
3039 "bin/arm64/foo/bar/mybin64",
3040 "lib/foo/bar/mylib.so",
3041 "lib/arm/foo/bar/mylib.so",
3042 "lib64/foo/bar/mylib.so",
3043 "lib64/arm64/foo/bar/mylib.so",
3044 })
3045}
3046
Jooyung Han85d61762020-06-24 23:50:26 +09003047func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003048 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003049 result := android.GroupFixturePreparers(
3050 prepareForApexTest,
3051 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3052 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003053 apex {
3054 name: "myapex",
3055 key: "myapex.key",
3056 binaries: ["mybin"],
3057 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003058 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003059 }
3060 apex_key {
3061 name: "myapex.key",
3062 public_key: "testkey.avbpubkey",
3063 private_key: "testkey.pem",
3064 }
3065 cc_binary {
3066 name: "mybin",
3067 vendor: true,
3068 shared_libs: ["libfoo"],
3069 }
3070 cc_library {
3071 name: "libfoo",
3072 proprietary: true,
3073 }
3074 `)
3075
Jooyung Hana0503a52023-08-23 13:12:50 +09003076 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003077 "bin/mybin",
3078 "lib64/libfoo.so",
3079 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3080 "lib64/libc++.so",
3081 })
3082
Jooyung Hana0503a52023-08-23 13:12:50 +09003083 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003084 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003085 name := apexBundle.BaseModuleName()
3086 prefix := "TARGET_"
3087 var builder strings.Builder
3088 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003089 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003090 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003091 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003092
Jooyung Hana0503a52023-08-23 13:12:50 +09003093 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003094 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3095 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003096}
3097
Justin Yun13decfb2021-03-08 19:25:55 +09003098func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003099 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003100 ctx := testApex(t, `
3101 apex {
3102 name: "myapex",
3103 key: "myapex.key",
3104 updatable: false,
3105 product_specific: true,
3106 binaries: ["foo"],
3107 }
3108
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }
3114
3115 cc_binary {
3116 name: "foo",
3117 product_available: true,
3118 apex_available: ["myapex"],
3119 srcs: ["foo.cpp"],
3120 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003121 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003122
3123 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003124 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003125 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3126 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3127 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3128 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3129}
3130
Jooyung Han8e5685d2020-09-21 11:02:57 +09003131func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003132 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003133 testCases := []struct {
3134 name string
3135 additionalProp string
3136 }{
3137 {"system apex with prebuilt_firmware", ""},
3138 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3139 }
3140 for _, tc := range testCases {
3141 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003142 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003143 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003144 apex {
3145 name: "myapex",
3146 key: "myapex.key",
3147 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003148 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003149 `+tc.additionalProp+`
3150 }
3151 apex_key {
3152 name: "myapex.key",
3153 public_key: "testkey.avbpubkey",
3154 private_key: "testkey.pem",
3155 }
3156 prebuilt_firmware {
3157 name: "myfirmware",
3158 src: "myfirmware.bin",
3159 filename_from_src: true,
3160 `+tc.additionalProp+`
3161 }
3162 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003163 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003164 "etc/firmware/myfirmware.bin",
3165 })
3166 })
3167 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003168}
3169
Jooyung Hanefb184e2020-06-25 17:14:25 +09003170func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003171 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003172 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003173 apex {
3174 name: "myapex",
3175 key: "myapex.key",
3176 vendor: true,
3177 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003178 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003179 }
3180
3181 apex_key {
3182 name: "myapex.key",
3183 public_key: "testkey.avbpubkey",
3184 private_key: "testkey.pem",
3185 }
3186
3187 cc_library {
3188 name: "mylib",
3189 vendor_available: true,
3190 }
3191 `)
3192
Jooyung Hana0503a52023-08-23 13:12:50 +09003193 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003194 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003195 name := apexBundle.BaseModuleName()
3196 prefix := "TARGET_"
3197 var builder strings.Builder
3198 data.Custom(&builder, name, prefix, "", data)
3199 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003200 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 +09003201}
3202
Jooyung Han2ed99d02020-06-24 23:26:26 +09003203func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003204 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003205 apex {
3206 name: "myapex",
3207 key: "myapex.key",
3208 vintf_fragments: ["fragment.xml"],
3209 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003210 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003211 }
3212 apex_key {
3213 name: "myapex.key",
3214 public_key: "testkey.avbpubkey",
3215 private_key: "testkey.pem",
3216 }
3217 cc_binary {
3218 name: "mybin",
3219 }
3220 `)
3221
Jooyung Hana0503a52023-08-23 13:12:50 +09003222 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003223 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003224 name := apexBundle.BaseModuleName()
3225 prefix := "TARGET_"
3226 var builder strings.Builder
3227 data.Custom(&builder, name, prefix, "", data)
3228 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003229 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003230 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003231}
3232
Jiyong Park16e91a02018-12-20 18:18:08 +09003233func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003234 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003235 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003236 apex {
3237 name: "myapex",
3238 key: "myapex.key",
3239 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003240 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003241 }
3242
3243 apex_key {
3244 name: "myapex.key",
3245 public_key: "testkey.avbpubkey",
3246 private_key: "testkey.pem",
3247 }
3248
3249 cc_library {
3250 name: "mylib",
3251 srcs: ["mylib.cpp"],
3252 system_shared_libs: [],
3253 stl: "none",
3254 stubs: {
3255 versions: ["1", "2", "3"],
3256 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003257 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003258 }
3259
3260 cc_binary {
3261 name: "not_in_apex",
3262 srcs: ["mylib.cpp"],
3263 static_libs: ["mylib"],
3264 static_executable: true,
3265 system_shared_libs: [],
3266 stl: "none",
3267 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003268 `)
3269
Colin Cross7113d202019-11-20 16:39:12 -08003270 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003271
3272 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003273 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003274}
Jiyong Park9335a262018-12-24 11:31:58 +09003275
3276func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003277 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003278 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003279 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003280 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003281 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003282 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003283 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003284 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003285 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003286 }
3287
3288 cc_library {
3289 name: "mylib",
3290 srcs: ["mylib.cpp"],
3291 system_shared_libs: [],
3292 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003293 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003294 }
3295
3296 apex_key {
3297 name: "myapex.key",
3298 public_key: "testkey.avbpubkey",
3299 private_key: "testkey.pem",
3300 }
3301
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003302 android_app_certificate {
3303 name: "myapex.certificate",
3304 certificate: "testkey",
3305 }
3306
3307 android_app_certificate {
3308 name: "myapex.certificate.override",
3309 certificate: "testkey.override",
3310 }
3311
Jiyong Park9335a262018-12-24 11:31:58 +09003312 `)
3313
3314 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003315 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003316
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003317 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3318 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003319 "vendor/foo/devkeys/testkey.avbpubkey")
3320 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003321 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3322 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003323 "vendor/foo/devkeys/testkey.pem")
3324 }
3325
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003326 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003327 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003328 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003329 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003330 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003331 }
3332}
Jiyong Park58e364a2019-01-19 19:24:06 +09003333
Jooyung Hanf121a652019-12-17 14:30:11 +09003334func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003335 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003336 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003337 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003338 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003339 apex {
3340 name: "myapex",
3341 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003342 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003343 }
3344 apex_key {
3345 name: "myapex.key",
3346 public_key: "testkey.avbpubkey",
3347 private_key: "testkey.pem",
3348 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003349 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003350 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3351 if actual := rule.Args["certificates"]; actual != expected {
3352 t.Errorf("certificates should be %q, not %q", expected, actual)
3353 }
3354 })
3355 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003356 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003357 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003358 apex {
3359 name: "myapex_keytest",
3360 key: "myapex.key",
3361 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003362 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003363 }
3364 apex_key {
3365 name: "myapex.key",
3366 public_key: "testkey.avbpubkey",
3367 private_key: "testkey.pem",
3368 }
3369 android_app_certificate {
3370 name: "myapex.certificate.override",
3371 certificate: "testkey.override",
3372 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003373 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003374 expected := "testkey.override.x509.pem testkey.override.pk8"
3375 if actual := rule.Args["certificates"]; actual != expected {
3376 t.Errorf("certificates should be %q, not %q", expected, actual)
3377 }
3378 })
3379 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003380 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003381 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003382 apex {
3383 name: "myapex",
3384 key: "myapex.key",
3385 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003386 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003387 }
3388 apex_key {
3389 name: "myapex.key",
3390 public_key: "testkey.avbpubkey",
3391 private_key: "testkey.pem",
3392 }
3393 android_app_certificate {
3394 name: "myapex.certificate",
3395 certificate: "testkey",
3396 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003397 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003398 expected := "testkey.x509.pem testkey.pk8"
3399 if actual := rule.Args["certificates"]; actual != expected {
3400 t.Errorf("certificates should be %q, not %q", expected, actual)
3401 }
3402 })
3403 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003404 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003405 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003406 apex {
3407 name: "myapex_keytest",
3408 key: "myapex.key",
3409 file_contexts: ":myapex-file_contexts",
3410 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003411 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003412 }
3413 apex_key {
3414 name: "myapex.key",
3415 public_key: "testkey.avbpubkey",
3416 private_key: "testkey.pem",
3417 }
3418 android_app_certificate {
3419 name: "myapex.certificate.override",
3420 certificate: "testkey.override",
3421 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003422 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003423 expected := "testkey.override.x509.pem testkey.override.pk8"
3424 if actual := rule.Args["certificates"]; actual != expected {
3425 t.Errorf("certificates should be %q, not %q", expected, actual)
3426 }
3427 })
3428 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003429 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003430 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003431 apex {
3432 name: "myapex",
3433 key: "myapex.key",
3434 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003435 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003436 }
3437 apex_key {
3438 name: "myapex.key",
3439 public_key: "testkey.avbpubkey",
3440 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003441 }`,
3442 android.MockFS{
3443 "vendor/foo/devkeys/testkey.x509.pem": nil,
3444 }.AddToFixture(),
3445 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003446 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003447 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3448 if actual := rule.Args["certificates"]; actual != expected {
3449 t.Errorf("certificates should be %q, not %q", expected, actual)
3450 }
3451 })
3452 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003453 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003454 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003455 apex {
3456 name: "myapex_keytest",
3457 key: "myapex.key",
3458 file_contexts: ":myapex-file_contexts",
3459 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003460 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003461 }
3462 apex_key {
3463 name: "myapex.key",
3464 public_key: "testkey.avbpubkey",
3465 private_key: "testkey.pem",
3466 }
3467 android_app_certificate {
3468 name: "myapex.certificate.override",
3469 certificate: "testkey.override",
3470 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003471 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003472 expected := "testkey.override.x509.pem testkey.override.pk8"
3473 if actual := rule.Args["certificates"]; actual != expected {
3474 t.Errorf("certificates should be %q, not %q", expected, actual)
3475 }
3476 })
3477}
3478
Jiyong Park58e364a2019-01-19 19:24:06 +09003479func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003480 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003481 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003482 apex {
3483 name: "myapex",
3484 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003485 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003486 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003487 }
3488
3489 apex {
3490 name: "otherapex",
3491 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003492 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003493 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003494 }
3495
3496 apex_key {
3497 name: "myapex.key",
3498 public_key: "testkey.avbpubkey",
3499 private_key: "testkey.pem",
3500 }
3501
3502 cc_library {
3503 name: "mylib",
3504 srcs: ["mylib.cpp"],
3505 system_shared_libs: [],
3506 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003507 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003508 "myapex",
3509 "otherapex",
3510 ],
Jooyung Han24282772020-03-21 23:20:55 +09003511 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003512 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003513 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003514 cc_library {
3515 name: "mylib2",
3516 srcs: ["mylib.cpp"],
3517 system_shared_libs: [],
3518 stl: "none",
3519 apex_available: [
3520 "myapex",
3521 "otherapex",
3522 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003523 static_libs: ["mylib3"],
3524 recovery_available: true,
3525 min_sdk_version: "29",
3526 }
3527 cc_library {
3528 name: "mylib3",
3529 srcs: ["mylib.cpp"],
3530 system_shared_libs: [],
3531 stl: "none",
3532 apex_available: [
3533 "myapex",
3534 "otherapex",
3535 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003536 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003537 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003538 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003539 `)
3540
Jooyung Hanc87a0592020-03-02 17:44:33 +09003541 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003542 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003543 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003544
Vinh Tranf9754732023-01-19 22:41:46 -05003545 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003546 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003547 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003548
Vinh Tranf9754732023-01-19 22:41:46 -05003549 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003550 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003551 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003552
Colin Crossaede88c2020-08-11 12:17:01 -07003553 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3554 // each variant defines additional macros to distinguish which apex variant it is built for
3555
3556 // non-APEX variant does not have __ANDROID_APEX__ defined
3557 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3558 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3559
Vinh Tranf9754732023-01-19 22:41:46 -05003560 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003561 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3562 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003563
Jooyung Hanc87a0592020-03-02 17:44:33 +09003564 // non-APEX variant does not have __ANDROID_APEX__ defined
3565 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3566 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3567
Vinh Tranf9754732023-01-19 22:41:46 -05003568 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003569 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003570 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003571}
Jiyong Park7e636d02019-01-28 16:16:54 +09003572
3573func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003574 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003575 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003576 apex {
3577 name: "myapex",
3578 key: "myapex.key",
3579 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003580 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003581 }
3582
3583 apex_key {
3584 name: "myapex.key",
3585 public_key: "testkey.avbpubkey",
3586 private_key: "testkey.pem",
3587 }
3588
3589 cc_library_headers {
3590 name: "mylib_headers",
3591 export_include_dirs: ["my_include"],
3592 system_shared_libs: [],
3593 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003594 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003595 }
3596
3597 cc_library {
3598 name: "mylib",
3599 srcs: ["mylib.cpp"],
3600 system_shared_libs: [],
3601 stl: "none",
3602 header_libs: ["mylib_headers"],
3603 export_header_lib_headers: ["mylib_headers"],
3604 stubs: {
3605 versions: ["1", "2", "3"],
3606 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003607 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003608 }
3609
3610 cc_library {
3611 name: "otherlib",
3612 srcs: ["mylib.cpp"],
3613 system_shared_libs: [],
3614 stl: "none",
3615 shared_libs: ["mylib"],
3616 }
3617 `)
3618
Colin Cross7113d202019-11-20 16:39:12 -08003619 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003620
3621 // Ensure that the include path of the header lib is exported to 'otherlib'
3622 ensureContains(t, cFlags, "-Imy_include")
3623}
Alex Light9670d332019-01-29 18:07:33 -08003624
Jiyong Park7cd10e32020-01-14 09:22:18 +09003625type fileInApex struct {
3626 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003627 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003628 isLink bool
3629}
3630
Jooyung Han1724d582022-12-21 10:17:44 +09003631func (f fileInApex) String() string {
3632 return f.src + ":" + f.path
3633}
3634
3635func (f fileInApex) match(expectation string) bool {
3636 parts := strings.Split(expectation, ":")
3637 if len(parts) == 1 {
3638 match, _ := path.Match(parts[0], f.path)
3639 return match
3640 }
3641 if len(parts) == 2 {
3642 matchSrc, _ := path.Match(parts[0], f.src)
3643 matchDst, _ := path.Match(parts[1], f.path)
3644 return matchSrc && matchDst
3645 }
3646 panic("invalid expected file specification: " + expectation)
3647}
3648
Jooyung Hana57af4a2020-01-23 05:36:59 +00003649func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003650 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003651 module := ctx.ModuleForTests(moduleName, variant)
3652 apexRule := module.MaybeRule("apexRule")
3653 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003654 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003655 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003656 for _, cmd := range strings.Split(copyCmds, "&&") {
3657 cmd = strings.TrimSpace(cmd)
3658 if cmd == "" {
3659 continue
3660 }
3661 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003662 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003663 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003664 switch terms[0] {
3665 case "mkdir":
3666 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003667 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003668 t.Fatal("copyCmds contains invalid cp command", cmd)
3669 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003670 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003671 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003672 isLink = false
3673 case "ln":
3674 if len(terms) != 3 && len(terms) != 4 {
3675 // ln LINK TARGET or ln -s LINK TARGET
3676 t.Fatal("copyCmds contains invalid ln command", cmd)
3677 }
3678 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003679 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003680 isLink = true
3681 default:
3682 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3683 }
3684 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003685 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003686 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003687 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003688 }
Jooyung Han1724d582022-12-21 10:17:44 +09003689 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003690 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003691 }
3692 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003693 return ret
3694}
3695
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003696func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003697 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003698 var failed bool
3699 var surplus []string
3700 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003701 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003702 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003703 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003704 if file.match(expected) {
3705 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003706 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003707 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003708 }
3709 }
Jooyung Han1724d582022-12-21 10:17:44 +09003710 if !matchFound {
3711 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003712 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003713 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003714
Jooyung Han31c470b2019-10-18 16:26:59 +09003715 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003716 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003717 t.Log("surplus files", surplus)
3718 failed = true
3719 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003720
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003721 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003722 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003723 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003724 if !filesMatched[expected] {
3725 missing = append(missing, expected)
3726 }
3727 }
3728 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003729 t.Log("missing files", missing)
3730 failed = true
3731 }
3732 if failed {
3733 t.Fail()
3734 }
3735}
3736
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003737func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3738 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3739}
3740
3741func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003742 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003743 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3744 if deapexer.Output != nil {
3745 outputs = append(outputs, deapexer.Output.String())
3746 }
3747 for _, output := range deapexer.ImplicitOutputs {
3748 outputs = append(outputs, output.String())
3749 }
3750 actualFiles := make([]fileInApex, 0, len(outputs))
3751 for _, output := range outputs {
3752 dir := "/deapexer/"
3753 pos := strings.LastIndex(output, dir)
3754 if pos == -1 {
3755 t.Fatal("Unknown deapexer output ", output)
3756 }
3757 path := output[pos+len(dir):]
3758 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3759 }
3760 assertFileListEquals(t, files, actualFiles)
3761}
3762
Jooyung Han39edb6c2019-11-06 16:53:07 +09003763func vndkLibrariesTxtFiles(vers ...string) (result string) {
3764 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003765 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003766 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003767 prebuilt_etc {
3768 name: "` + txt + `.libraries.` + v + `.txt",
3769 src: "dummy.txt",
3770 }
3771 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003772 }
3773 }
3774 return
3775}
3776
Jooyung Han344d5432019-08-23 11:17:39 +09003777func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003778 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003779 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003780 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003781 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003782 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003783 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003784 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003785 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003786 }
3787
3788 apex_key {
3789 name: "myapex.key",
3790 public_key: "testkey.avbpubkey",
3791 private_key: "testkey.pem",
3792 }
3793
Jooyung Han31c470b2019-10-18 16:26:59 +09003794 vndk_prebuilt_shared {
3795 name: "libvndk27",
3796 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003797 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003798 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003799 vndk: {
3800 enabled: true,
3801 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003802 target_arch: "arm64",
3803 arch: {
3804 arm: {
3805 srcs: ["libvndk27_arm.so"],
3806 },
3807 arm64: {
3808 srcs: ["libvndk27_arm64.so"],
3809 },
3810 },
Colin Cross2807f002021-03-02 10:15:29 -08003811 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003812 }
3813
3814 vndk_prebuilt_shared {
3815 name: "libvndk27",
3816 version: "27",
3817 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003818 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003819 vndk: {
3820 enabled: true,
3821 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003822 target_arch: "x86_64",
3823 arch: {
3824 x86: {
3825 srcs: ["libvndk27_x86.so"],
3826 },
3827 x86_64: {
3828 srcs: ["libvndk27_x86_64.so"],
3829 },
3830 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003831 }
3832 `+vndkLibrariesTxtFiles("27"),
3833 withFiles(map[string][]byte{
3834 "libvndk27_arm.so": nil,
3835 "libvndk27_arm64.so": nil,
3836 "libvndk27_x86.so": nil,
3837 "libvndk27_x86_64.so": nil,
3838 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003839
Jooyung Hana0503a52023-08-23 13:12:50 +09003840 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003841 "lib/libvndk27_arm.so",
3842 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003843 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003844 })
Jooyung Han344d5432019-08-23 11:17:39 +09003845}
3846
Jooyung Han90eee022019-10-01 20:02:42 +09003847func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003848 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003849 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003850 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003851 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003852 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003853 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003854 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003855 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003856 }
3857 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003858 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09003859 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003860 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09003861 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003862 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003863 }
3864 apex_key {
3865 name: "myapex.key",
3866 public_key: "testkey.avbpubkey",
3867 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003868 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09003869
3870 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09003871 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09003872 apexManifestRule := module.Rule("apexManifestRule")
3873 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09003874 }
3875
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003876 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08003877 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09003878}
3879
Jooyung Han344d5432019-08-23 11:17:39 +09003880func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003881 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003882 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09003883 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003884 name: "com.android.vndk.v30",
3885 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003886 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003887 native_bridge_supported: true,
3888 }
3889
3890 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003891 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09003892 public_key: "testkey.avbpubkey",
3893 private_key: "testkey.pem",
3894 }
3895
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003896 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09003897 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09003898 version: "30",
3899 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09003900 srcs: ["mylib.cpp"],
3901 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003902 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003903 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003904 vndk: {
3905 enabled: true,
3906 },
Jooyung Han344d5432019-08-23 11:17:39 +09003907 }
3908 `)
3909}
3910
Jooyung Han31c470b2019-10-18 16:26:59 +09003911func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003912 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003913 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09003914 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003915 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09003916 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003917 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09003918 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003919 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09003920 }
3921
3922 apex_key {
3923 name: "myapex.key",
3924 public_key: "testkey.avbpubkey",
3925 private_key: "testkey.pem",
3926 }
3927
3928 vndk_prebuilt_shared {
3929 name: "libvndk27",
3930 version: "27",
3931 target_arch: "arm",
3932 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003933 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003934 vndk: {
3935 enabled: true,
3936 },
3937 arch: {
3938 arm: {
3939 srcs: ["libvndk27.so"],
3940 }
3941 },
3942 }
3943
3944 vndk_prebuilt_shared {
3945 name: "libvndk27",
3946 version: "27",
3947 target_arch: "arm",
3948 binder32bit: true,
3949 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003950 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09003951 vndk: {
3952 enabled: true,
3953 },
3954 arch: {
3955 arm: {
3956 srcs: ["libvndk27binder32.so"],
3957 }
3958 },
Colin Cross2807f002021-03-02 10:15:29 -08003959 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09003960 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003961 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09003962 withFiles(map[string][]byte{
3963 "libvndk27.so": nil,
3964 "libvndk27binder32.so": nil,
3965 }),
3966 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07003967 android.FixtureModifyConfig(func(config android.Config) {
3968 target := android.Target{
3969 Os: android.Android,
3970 Arch: android.Arch{
3971 ArchType: android.Arm,
3972 ArchVariant: "armv7-a-neon",
3973 Abi: []string{"armeabi-v7a"},
3974 },
3975 NativeBridge: android.NativeBridgeDisabled,
3976 NativeBridgeHostArchName: "",
3977 NativeBridgeRelativePath: "",
3978 }
3979 config.Targets[android.Android] = []android.Target{target}
3980 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09003981 }),
3982 )
3983
Jooyung Hana0503a52023-08-23 13:12:50 +09003984 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003985 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 })
3988}
3989
Jooyung Hane1633032019-08-01 17:41:43 +09003990func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09003993 apex {
3994 name: "myapex_nodep",
3995 key: "myapex.key",
3996 native_shared_libs: ["lib_nodep"],
3997 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003998 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003999 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004000 }
4001
4002 apex {
4003 name: "myapex_dep",
4004 key: "myapex.key",
4005 native_shared_libs: ["lib_dep"],
4006 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004007 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004008 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004009 }
4010
4011 apex {
4012 name: "myapex_provider",
4013 key: "myapex.key",
4014 native_shared_libs: ["libfoo"],
4015 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004016 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004017 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004018 }
4019
4020 apex {
4021 name: "myapex_selfcontained",
4022 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004023 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004024 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004025 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004026 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004027 }
4028
4029 apex_key {
4030 name: "myapex.key",
4031 public_key: "testkey.avbpubkey",
4032 private_key: "testkey.pem",
4033 }
4034
4035 cc_library {
4036 name: "lib_nodep",
4037 srcs: ["mylib.cpp"],
4038 system_shared_libs: [],
4039 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004040 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004041 }
4042
4043 cc_library {
4044 name: "lib_dep",
4045 srcs: ["mylib.cpp"],
4046 shared_libs: ["libfoo"],
4047 system_shared_libs: [],
4048 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004049 apex_available: [
4050 "myapex_dep",
4051 "myapex_provider",
4052 "myapex_selfcontained",
4053 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004054 }
4055
4056 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004057 name: "lib_dep_on_bar",
4058 srcs: ["mylib.cpp"],
4059 shared_libs: ["libbar"],
4060 system_shared_libs: [],
4061 stl: "none",
4062 apex_available: [
4063 "myapex_selfcontained",
4064 ],
4065 }
4066
4067
4068 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004069 name: "libfoo",
4070 srcs: ["mytest.cpp"],
4071 stubs: {
4072 versions: ["1"],
4073 },
4074 system_shared_libs: [],
4075 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004076 apex_available: [
4077 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004078 ],
4079 }
4080
4081 cc_library {
4082 name: "libbar",
4083 srcs: ["mytest.cpp"],
4084 stubs: {
4085 versions: ["1"],
4086 },
4087 system_shared_libs: [],
4088 stl: "none",
4089 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004090 "myapex_selfcontained",
4091 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004092 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004093
Jooyung Hane1633032019-08-01 17:41:43 +09004094 `)
4095
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004096 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004097 var provideNativeLibs, requireNativeLibs []string
4098
Jooyung Hana0503a52023-08-23 13:12:50 +09004099 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004100 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4101 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004102 ensureListEmpty(t, provideNativeLibs)
4103 ensureListEmpty(t, requireNativeLibs)
4104
Jooyung Hana0503a52023-08-23 13:12:50 +09004105 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004106 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4107 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004108 ensureListEmpty(t, provideNativeLibs)
4109 ensureListContains(t, requireNativeLibs, "libfoo.so")
4110
Jooyung Hana0503a52023-08-23 13:12:50 +09004111 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004112 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4113 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004114 ensureListContains(t, provideNativeLibs, "libfoo.so")
4115 ensureListEmpty(t, requireNativeLibs)
4116
Jooyung Hana0503a52023-08-23 13:12:50 +09004117 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004118 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4119 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004120 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004121 ensureListEmpty(t, requireNativeLibs)
4122}
4123
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004124func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004125 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004126 ctx := testApex(t, `
4127 apex {
4128 name: "myapex",
4129 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004130 native_shared_libs: ["mylib"],
4131 updatable: false,
4132 }
4133
4134 apex_key {
4135 name: "myapex.key",
4136 public_key: "testkey.avbpubkey",
4137 private_key: "testkey.pem",
4138 }
4139
4140 cc_library {
4141 name: "mylib",
4142 srcs: ["mylib.cpp"],
4143 system_shared_libs: [],
4144 stl: "none",
4145 apex_available: [
4146 "//apex_available:platform",
4147 "myapex",
4148 ],
4149 }
4150 `, android.FixtureMergeEnv(map[string]string{
4151 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4152 }))
4153
Jooyung Hana0503a52023-08-23 13:12:50 +09004154 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004155 apexManifestRule := module.Rule("apexManifestRule")
4156 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4157}
4158
Vinh Tran8f5310f2022-10-07 18:16:47 -04004159func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004160 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004161 testCases := []struct {
4162 compileMultiLibProp string
4163 containedLibs []string
4164 notContainedLibs []string
4165 }{
4166 {
4167 containedLibs: []string{
4168 "image.apex/lib64/mylib.so",
4169 "image.apex/lib/mylib.so",
4170 },
4171 compileMultiLibProp: `compile_multilib: "both",`,
4172 },
4173 {
4174 containedLibs: []string{"image.apex/lib64/mylib.so"},
4175 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4176 compileMultiLibProp: `compile_multilib: "first",`,
4177 },
4178 {
4179 containedLibs: []string{"image.apex/lib64/mylib.so"},
4180 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4181 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4182 },
4183 {
4184 containedLibs: []string{"image.apex/lib64/mylib.so"},
4185 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4186 compileMultiLibProp: `compile_multilib: "64",`,
4187 },
4188 {
4189 containedLibs: []string{"image.apex/lib/mylib.so"},
4190 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4191 compileMultiLibProp: `compile_multilib: "32",`,
4192 },
4193 }
4194 for _, testCase := range testCases {
4195 ctx := testApex(t, fmt.Sprintf(`
4196 apex {
4197 name: "myapex",
4198 key: "myapex.key",
4199 %s
4200 native_shared_libs: ["mylib"],
4201 updatable: false,
4202 }
4203 apex_key {
4204 name: "myapex.key",
4205 public_key: "testkey.avbpubkey",
4206 private_key: "testkey.pem",
4207 }
4208 cc_library {
4209 name: "mylib",
4210 srcs: ["mylib.cpp"],
4211 apex_available: [
4212 "//apex_available:platform",
4213 "myapex",
4214 ],
4215 }
4216 `, testCase.compileMultiLibProp),
4217 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004218 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004219 apexRule := module.Rule("apexRule")
4220 copyCmds := apexRule.Args["copy_commands"]
4221 for _, containedLib := range testCase.containedLibs {
4222 ensureContains(t, copyCmds, containedLib)
4223 }
4224 for _, notContainedLib := range testCase.notContainedLibs {
4225 ensureNotContains(t, copyCmds, notContainedLib)
4226 }
4227 }
4228}
4229
Alex Light0851b882019-02-07 13:20:53 -08004230func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004231 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004232 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004233 apex {
4234 name: "myapex",
4235 key: "myapex.key",
4236 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004237 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004238 }
4239
4240 apex_key {
4241 name: "myapex.key",
4242 public_key: "testkey.avbpubkey",
4243 private_key: "testkey.pem",
4244 }
4245
4246 cc_library {
4247 name: "mylib_common",
4248 srcs: ["mylib.cpp"],
4249 system_shared_libs: [],
4250 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004251 apex_available: [
4252 "//apex_available:platform",
4253 "myapex",
4254 ],
Alex Light0851b882019-02-07 13:20:53 -08004255 }
4256 `)
4257
Jooyung Hana0503a52023-08-23 13:12:50 +09004258 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004259 apexRule := module.Rule("apexRule")
4260 copyCmds := apexRule.Args["copy_commands"]
4261
4262 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4263 t.Log("Apex was a test apex!")
4264 t.Fail()
4265 }
4266 // Ensure that main rule creates an output
4267 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4268
4269 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004270 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004271
4272 // Ensure that both direct and indirect deps are copied into apex
4273 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4274
Colin Cross7113d202019-11-20 16:39:12 -08004275 // Ensure that the platform variant ends with _shared
4276 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004277
Colin Cross56a83212020-09-15 18:30:11 -07004278 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004279 t.Log("Found mylib_common not in any apex!")
4280 t.Fail()
4281 }
4282}
4283
4284func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004285 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004286 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004287 apex_test {
4288 name: "myapex",
4289 key: "myapex.key",
4290 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004291 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004292 }
4293
4294 apex_key {
4295 name: "myapex.key",
4296 public_key: "testkey.avbpubkey",
4297 private_key: "testkey.pem",
4298 }
4299
4300 cc_library {
4301 name: "mylib_common_test",
4302 srcs: ["mylib.cpp"],
4303 system_shared_libs: [],
4304 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004305 // TODO: remove //apex_available:platform
4306 apex_available: [
4307 "//apex_available:platform",
4308 "myapex",
4309 ],
Alex Light0851b882019-02-07 13:20:53 -08004310 }
4311 `)
4312
Jooyung Hana0503a52023-08-23 13:12:50 +09004313 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004314 apexRule := module.Rule("apexRule")
4315 copyCmds := apexRule.Args["copy_commands"]
4316
4317 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4318 t.Log("Apex was not a test apex!")
4319 t.Fail()
4320 }
4321 // Ensure that main rule creates an output
4322 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4323
4324 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004325 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004326
4327 // Ensure that both direct and indirect deps are copied into apex
4328 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4329
Colin Cross7113d202019-11-20 16:39:12 -08004330 // Ensure that the platform variant ends with _shared
4331 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004332}
4333
Jooyung Han85707de2023-12-01 14:21:13 +09004334func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004335 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004336 ctx := testApex(t, `
4337 apex {
4338 name: "myapex",
4339 key: "myapex.key",
4340 updatable: false,
4341 binaries: ["mybin"],
4342 }
4343 apex {
4344 name: "myvendorapex",
4345 key: "myapex.key",
4346 file_contexts: "myvendorapex_file_contexts",
4347 vendor: true,
4348 updatable: false,
4349 binaries: ["mybin"],
4350 }
4351 apex_key {
4352 name: "myapex.key",
4353 public_key: "testkey.avbpubkey",
4354 private_key: "testkey.pem",
4355 }
4356 cc_binary {
4357 name: "mybin",
4358 vendor_available: true,
4359 system_shared_libs: [],
4360 stl: "none",
4361 shared_libs: ["libz"],
4362 apex_available: ["//apex_available:anyapex"],
4363 }
4364 cc_library {
4365 name: "libz",
4366 vendor_available: true,
4367 system_shared_libs: [],
4368 stl: "none",
4369 stubs: {
4370 versions: ["28", "30"],
4371 },
4372 target: {
4373 vendor: {
4374 no_stubs: true,
4375 },
4376 },
4377 }
4378 `, withFiles(map[string][]byte{
4379 "myvendorapex_file_contexts": nil,
4380 }))
4381
4382 // libz provides stubs for core variant.
4383 {
4384 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4385 "bin/mybin",
4386 })
4387 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4388 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4389 }
4390 // libz doesn't provide stubs for vendor variant.
4391 {
4392 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4393 "bin/mybin",
4394 "lib64/libz.so",
4395 })
4396 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4397 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4398 }
4399}
4400
Alex Light9670d332019-01-29 18:07:33 -08004401func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004402 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004403 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004404 apex {
4405 name: "myapex",
4406 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004407 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004408 multilib: {
4409 first: {
4410 native_shared_libs: ["mylib_common"],
4411 }
4412 },
4413 target: {
4414 android: {
4415 multilib: {
4416 first: {
4417 native_shared_libs: ["mylib"],
4418 }
4419 }
4420 },
4421 host: {
4422 multilib: {
4423 first: {
4424 native_shared_libs: ["mylib2"],
4425 }
4426 }
4427 }
4428 }
4429 }
4430
4431 apex_key {
4432 name: "myapex.key",
4433 public_key: "testkey.avbpubkey",
4434 private_key: "testkey.pem",
4435 }
4436
4437 cc_library {
4438 name: "mylib",
4439 srcs: ["mylib.cpp"],
4440 system_shared_libs: [],
4441 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004442 // TODO: remove //apex_available:platform
4443 apex_available: [
4444 "//apex_available:platform",
4445 "myapex",
4446 ],
Alex Light9670d332019-01-29 18:07:33 -08004447 }
4448
4449 cc_library {
4450 name: "mylib_common",
4451 srcs: ["mylib.cpp"],
4452 system_shared_libs: [],
4453 stl: "none",
4454 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004455 // TODO: remove //apex_available:platform
4456 apex_available: [
4457 "//apex_available:platform",
4458 "myapex",
4459 ],
Alex Light9670d332019-01-29 18:07:33 -08004460 }
4461
4462 cc_library {
4463 name: "mylib2",
4464 srcs: ["mylib.cpp"],
4465 system_shared_libs: [],
4466 stl: "none",
4467 compile_multilib: "first",
4468 }
4469 `)
4470
Jooyung Hana0503a52023-08-23 13:12:50 +09004471 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004472 copyCmds := apexRule.Args["copy_commands"]
4473
4474 // Ensure that main rule creates an output
4475 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4476
4477 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004478 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4479 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4480 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004481
4482 // Ensure that both direct and indirect deps are copied into apex
4483 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4484 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4485 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4486
Colin Cross7113d202019-11-20 16:39:12 -08004487 // Ensure that the platform variant ends with _shared
4488 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4489 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4490 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004491}
Jiyong Park04480cf2019-02-06 00:16:29 +09004492
Jiyong Park59140302020-12-14 18:44:04 +09004493func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004494 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004495 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004496 apex {
4497 name: "myapex",
4498 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004499 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004500 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004501 arch: {
4502 arm64: {
4503 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004504 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004505 },
4506 x86_64: {
4507 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004508 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004509 },
4510 }
4511 }
4512
4513 apex_key {
4514 name: "myapex.key",
4515 public_key: "testkey.avbpubkey",
4516 private_key: "testkey.pem",
4517 }
4518
4519 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004520 name: "mylib.generic",
4521 srcs: ["mylib.cpp"],
4522 system_shared_libs: [],
4523 stl: "none",
4524 // TODO: remove //apex_available:platform
4525 apex_available: [
4526 "//apex_available:platform",
4527 "myapex",
4528 ],
4529 }
4530
4531 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004532 name: "mylib.arm64",
4533 srcs: ["mylib.cpp"],
4534 system_shared_libs: [],
4535 stl: "none",
4536 // TODO: remove //apex_available:platform
4537 apex_available: [
4538 "//apex_available:platform",
4539 "myapex",
4540 ],
4541 }
4542
4543 cc_library {
4544 name: "mylib.x64",
4545 srcs: ["mylib.cpp"],
4546 system_shared_libs: [],
4547 stl: "none",
4548 // TODO: remove //apex_available:platform
4549 apex_available: [
4550 "//apex_available:platform",
4551 "myapex",
4552 ],
4553 }
4554 `)
4555
Jooyung Hana0503a52023-08-23 13:12:50 +09004556 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004557 copyCmds := apexRule.Args["copy_commands"]
4558
4559 // Ensure that apex variant is created for the direct dep
4560 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004561 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004562 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4563
4564 // Ensure that both direct and indirect deps are copied into apex
4565 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4566 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4567}
4568
Jiyong Park04480cf2019-02-06 00:16:29 +09004569func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004570 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004571 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004572 apex {
4573 name: "myapex",
4574 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004575 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004576 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004577 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004578 }
4579
4580 apex_key {
4581 name: "myapex.key",
4582 public_key: "testkey.avbpubkey",
4583 private_key: "testkey.pem",
4584 }
4585
4586 sh_binary {
4587 name: "myscript",
4588 src: "mylib.cpp",
4589 filename: "myscript.sh",
4590 sub_dir: "script",
4591 }
4592 `)
4593
Jooyung Hana0503a52023-08-23 13:12:50 +09004594 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004595 copyCmds := apexRule.Args["copy_commands"]
4596
4597 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4598}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004599
Jooyung Han91df2082019-11-20 01:49:42 +09004600func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004601 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004602 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004603 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004604 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004605 {"", "system"},
4606 {"product_specific: true", "product"},
4607 {"soc_specific: true", "vendor"},
4608 {"proprietary: true", "vendor"},
4609 {"vendor: true", "vendor"},
4610 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004611 }
4612 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004613 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004614 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004615 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004616 apex {
4617 name: "myapex",
4618 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004619 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004620 `+tc.propName+`
4621 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004622
Jooyung Han91df2082019-11-20 01:49:42 +09004623 apex_key {
4624 name: "myapex.key",
4625 public_key: "testkey.avbpubkey",
4626 private_key: "testkey.pem",
4627 }
4628 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004629
Jooyung Hana0503a52023-08-23 13:12:50 +09004630 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08004631 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004632 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004633 if actual != expected {
4634 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4635 }
Jooyung Han91df2082019-11-20 01:49:42 +09004636 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004637 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004638}
Jiyong Park67882562019-03-21 01:11:21 +09004639
Jooyung Han580eb4f2020-06-24 19:33:06 +09004640func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004641 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004642 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004643 apex {
4644 name: "myapex",
4645 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004646 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004647 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004648
Jooyung Han580eb4f2020-06-24 19:33:06 +09004649 apex_key {
4650 name: "myapex.key",
4651 public_key: "testkey.avbpubkey",
4652 private_key: "testkey.pem",
4653 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004654 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004655 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004656 rule := module.Output("file_contexts")
4657 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4658}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004659
Jooyung Han580eb4f2020-06-24 19:33:06 +09004660func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004661 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004662 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004663 apex {
4664 name: "myapex",
4665 key: "myapex.key",
4666 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004667 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004668 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004669
Jooyung Han580eb4f2020-06-24 19:33:06 +09004670 apex_key {
4671 name: "myapex.key",
4672 public_key: "testkey.avbpubkey",
4673 private_key: "testkey.pem",
4674 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004675 `, withFiles(map[string][]byte{
4676 "my_own_file_contexts": nil,
4677 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004678}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004679
Jooyung Han580eb4f2020-06-24 19:33:06 +09004680func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004681 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004682 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004683 apex {
4684 name: "myapex",
4685 key: "myapex.key",
4686 product_specific: true,
4687 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004688 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004689 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004690
Jooyung Han580eb4f2020-06-24 19:33:06 +09004691 apex_key {
4692 name: "myapex.key",
4693 public_key: "testkey.avbpubkey",
4694 private_key: "testkey.pem",
4695 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004696 `)
4697
Colin Cross1c460562021-02-16 17:55:47 -08004698 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004699 apex {
4700 name: "myapex",
4701 key: "myapex.key",
4702 product_specific: true,
4703 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004704 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004705 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004706
Jooyung Han580eb4f2020-06-24 19:33:06 +09004707 apex_key {
4708 name: "myapex.key",
4709 public_key: "testkey.avbpubkey",
4710 private_key: "testkey.pem",
4711 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004712 `, withFiles(map[string][]byte{
4713 "product_specific_file_contexts": nil,
4714 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004715 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004716 rule := module.Output("file_contexts")
4717 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4718}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004719
Jooyung Han580eb4f2020-06-24 19:33:06 +09004720func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004721 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004722 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004723 apex {
4724 name: "myapex",
4725 key: "myapex.key",
4726 product_specific: true,
4727 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004728 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004729 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004730
Jooyung Han580eb4f2020-06-24 19:33:06 +09004731 apex_key {
4732 name: "myapex.key",
4733 public_key: "testkey.avbpubkey",
4734 private_key: "testkey.pem",
4735 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004736
Jooyung Han580eb4f2020-06-24 19:33:06 +09004737 filegroup {
4738 name: "my-file-contexts",
4739 srcs: ["product_specific_file_contexts"],
4740 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004741 `, withFiles(map[string][]byte{
4742 "product_specific_file_contexts": nil,
4743 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004744 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004745 rule := module.Output("file_contexts")
4746 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004747}
4748
Jiyong Park67882562019-03-21 01:11:21 +09004749func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004750 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004751 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004752 apex_key {
4753 name: "myapex.key",
4754 public_key: ":my.avbpubkey",
4755 private_key: ":my.pem",
4756 product_specific: true,
4757 }
4758
4759 filegroup {
4760 name: "my.avbpubkey",
4761 srcs: ["testkey2.avbpubkey"],
4762 }
4763
4764 filegroup {
4765 name: "my.pem",
4766 srcs: ["testkey2.pem"],
4767 }
4768 `)
4769
4770 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4771 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004772 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004773 if actual_pubkey != expected_pubkey {
4774 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4775 }
4776 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004777 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004778 if actual_privkey != expected_privkey {
4779 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4780 }
4781}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004782
4783func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004785 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004786 prebuilt_apex {
4787 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004788 arch: {
4789 arm64: {
4790 src: "myapex-arm64.apex",
4791 },
4792 arm: {
4793 src: "myapex-arm.apex",
4794 },
4795 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004796 }
4797 `)
4798
Wei Li340ee8e2022-03-18 17:33:24 -07004799 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4800 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004801
Jiyong Parkc95714e2019-03-29 14:23:10 +09004802 expectedInput := "myapex-arm64.apex"
4803 if prebuilt.inputApex.String() != expectedInput {
4804 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4805 }
Wei Li340ee8e2022-03-18 17:33:24 -07004806 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4807 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4808 rule := testingModule.Rule("genProvenanceMetaData")
4809 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4810 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4811 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4812 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004813
4814 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4815 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004816}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004817
Paul Duffinc0609c62021-03-01 17:27:16 +00004818func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004819 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004820 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004821 prebuilt_apex {
4822 name: "myapex",
4823 }
4824 `)
4825}
4826
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004827func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004828 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004829 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004830 prebuilt_apex {
4831 name: "myapex",
4832 src: "myapex-arm.apex",
4833 filename: "notmyapex.apex",
4834 }
4835 `)
4836
Wei Li340ee8e2022-03-18 17:33:24 -07004837 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4838 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004839
4840 expected := "notmyapex.apex"
4841 if p.installFilename != expected {
4842 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4843 }
Wei Li340ee8e2022-03-18 17:33:24 -07004844 rule := testingModule.Rule("genProvenanceMetaData")
4845 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4846 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4847 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4848 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004849}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004850
Samiul Islam7c02e262021-09-08 17:48:28 +01004851func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004852 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004853 testApex(t, `
4854 apex_set {
4855 name: "com.company.android.myapex",
4856 apex_name: "com.android.myapex",
4857 set: "company-myapex.apks",
4858 filename: "com.company.android.myapex.apex"
4859 }
4860 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4861
4862 testApex(t, `
4863 apex_set {
4864 name: "com.company.android.myapex",
4865 apex_name: "com.android.myapex",
4866 set: "company-myapex.apks",
4867 filename: "com.company.android.myapex.capex"
4868 }
4869 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4870
4871 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
4872 apex_set {
4873 name: "com.company.android.myapex",
4874 apex_name: "com.android.myapex",
4875 set: "company-myapex.apks",
4876 filename: "some-random-suffix"
4877 }
4878 `)
4879}
4880
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004881func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004882 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004883 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004884 prebuilt_apex {
4885 name: "myapex.prebuilt",
4886 src: "myapex-arm.apex",
4887 overrides: [
4888 "myapex",
4889 ],
4890 }
4891 `)
4892
Wei Li340ee8e2022-03-18 17:33:24 -07004893 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
4894 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004895
4896 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07004897 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004898 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09004899 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004900 }
Wei Li340ee8e2022-03-18 17:33:24 -07004901 rule := testingModule.Rule("genProvenanceMetaData")
4902 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4903 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
4904 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
4905 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07004906}
4907
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004908func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004909 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004910 testApex(t, `
4911 prebuilt_apex {
4912 name: "com.company.android.myapex",
4913 apex_name: "com.android.myapex",
4914 src: "company-myapex-arm.apex",
4915 }
4916 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4917
4918 testApex(t, `
4919 apex_set {
4920 name: "com.company.android.myapex",
4921 apex_name: "com.android.myapex",
4922 set: "company-myapex.apks",
4923 }
4924 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
4925}
4926
4927func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004928 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004929 _ = android.GroupFixturePreparers(
4930 java.PrepareForTestWithJavaDefaultModules,
4931 PrepareForTestWithApexBuildComponents,
4932 android.FixtureWithRootAndroidBp(`
4933 platform_bootclasspath {
4934 name: "platform-bootclasspath",
4935 fragments: [
4936 {
4937 apex: "com.android.art",
4938 module: "art-bootclasspath-fragment",
4939 },
4940 ],
4941 }
4942
4943 prebuilt_apex {
4944 name: "com.company.android.art",
4945 apex_name: "com.android.art",
4946 src: "com.company.android.art-arm.apex",
4947 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
4948 }
4949
4950 prebuilt_bootclasspath_fragment {
4951 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01004952 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004953 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01004954 hidden_api: {
4955 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
4956 metadata: "my-bootclasspath-fragment/metadata.csv",
4957 index: "my-bootclasspath-fragment/index.csv",
4958 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
4959 all_flags: "my-bootclasspath-fragment/all-flags.csv",
4960 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01004961 }
4962
4963 java_import {
4964 name: "core-oj",
4965 jars: ["prebuilt.jar"],
4966 }
4967 `),
4968 ).RunTest(t)
4969}
4970
Spandan Das59a4a2b2024-01-09 21:35:56 +00004971// A minimal context object for use with DexJarBuildPath
4972type moduleErrorfTestCtx struct {
4973}
4974
4975func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
4976}
4977
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00004978func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004979 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01004980 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01004981 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004982 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
4983 // is disabled.
4984 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00004985
4986 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
4987 // file creation.
4988 java.FixtureConfigureBootJars("platform:foo"),
4989 android.FixtureModifyMockFS(func(fs android.MockFS) {
4990 fs["platform/Android.bp"] = []byte(`
4991 java_library {
4992 name: "foo",
4993 srcs: ["Test.java"],
4994 compile_dex: true,
4995 }
4996 `)
4997 fs["platform/Test.java"] = nil
4998 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01004999 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005000
Paul Duffin40a3f652021-07-19 13:11:24 +01005001 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005002 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005003 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005004 var rule android.TestingBuildParams
5005
5006 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5007 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005008 }
5009
Paul Duffin40a3f652021-07-19 13:11:24 +01005010 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5011 t.Helper()
5012 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5013 var rule android.TestingBuildParams
5014
5015 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5016 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5017 }
5018
Paul Duffin89f570a2021-06-16 01:42:33 +01005019 fragment := java.ApexVariantReference{
5020 Apex: proptools.StringPtr("myapex"),
5021 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5022 }
5023
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005024 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005025 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005026 bp := `
5027 prebuilt_apex {
5028 name: "myapex",
5029 arch: {
5030 arm64: {
5031 src: "myapex-arm64.apex",
5032 },
5033 arm: {
5034 src: "myapex-arm.apex",
5035 },
5036 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005037 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5038 }
5039
5040 prebuilt_bootclasspath_fragment {
5041 name: "my-bootclasspath-fragment",
5042 contents: ["libfoo", "libbar"],
5043 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005044 hidden_api: {
5045 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5046 metadata: "my-bootclasspath-fragment/metadata.csv",
5047 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005048 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5049 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5050 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005051 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005052 }
5053
Spandan Das52c01a12024-09-20 01:09:48 +00005054 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005055 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005056 public: {
5057 jars: ["libfoo.jar"],
5058 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005059 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005060 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005061 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005062 }
Paul Duffin37856732021-02-26 14:24:15 +00005063
5064 java_sdk_library_import {
5065 name: "libbar",
5066 public: {
5067 jars: ["libbar.jar"],
5068 },
5069 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005070 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005071 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005072 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005073 `
5074
Paul Duffin89f570a2021-06-16 01:42:33 +01005075 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005076
Paul Duffin537ea3d2021-05-14 10:38:00 +01005077 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005078 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005079 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005080 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005081 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005082 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005083 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005084 })
5085
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005086 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005087 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005088 bp := `
5089 apex_set {
5090 name: "myapex",
5091 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005092 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005093 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5094 }
5095
Paul Duffin89f570a2021-06-16 01:42:33 +01005096 prebuilt_bootclasspath_fragment {
5097 name: "my-bootclasspath-fragment",
5098 contents: ["libfoo", "libbar"],
5099 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005100 hidden_api: {
5101 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5102 metadata: "my-bootclasspath-fragment/metadata.csv",
5103 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005104 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5105 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5106 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005107 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005108 }
5109
Liz Kammer2dc72442023-04-20 10:10:48 -04005110 prebuilt_systemserverclasspath_fragment {
5111 name: "my-systemserverclasspath-fragment",
5112 contents: ["libbaz"],
5113 apex_available: ["myapex"],
5114 }
5115
Spandan Das52c01a12024-09-20 01:09:48 +00005116 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005117 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005118 public: {
5119 jars: ["libfoo.jar"],
5120 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005121 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005122 shared_library: false,
5123 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005124 }
5125
Spandan Das52c01a12024-09-20 01:09:48 +00005126
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005127 java_sdk_library_import {
5128 name: "libbar",
5129 public: {
5130 jars: ["libbar.jar"],
5131 },
5132 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005133 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005134 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005135 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005136
5137 java_sdk_library_import {
5138 name: "libbaz",
5139 public: {
5140 jars: ["libbaz.jar"],
5141 },
5142 apex_available: ["myapex"],
5143 shared_library: false,
5144 permitted_packages: ["baz"],
5145 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005146 `
5147
Paul Duffin89f570a2021-06-16 01:42:33 +01005148 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005149
Paul Duffin537ea3d2021-05-14 10:38:00 +01005150 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005151 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005152 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005153 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005154 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005155 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005156 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005157
5158 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5159
5160 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005161 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005162 "myjavalib.myapex",
5163 "libfoo.myapex",
5164 "libbar.myapex",
5165 "libbaz.myapex",
5166 }
5167 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5168 for i, e := range mkEntries {
5169 g := e.OverrideName
5170 if w := overrideNames[i]; w != g {
5171 t.Errorf("Expected override name %q, got %q", w, g)
5172 }
5173 }
5174
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005175 })
5176
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005177 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005178 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005179 bp := `
5180 prebuilt_apex {
5181 name: "myapex",
5182 arch: {
5183 arm64: {
5184 src: "myapex-arm64.apex",
5185 },
5186 arm: {
5187 src: "myapex-arm.apex",
5188 },
5189 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005190 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5191 }
5192
5193 prebuilt_bootclasspath_fragment {
5194 name: "my-bootclasspath-fragment",
5195 contents: ["libfoo", "libbar"],
5196 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005197 hidden_api: {
5198 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5199 metadata: "my-bootclasspath-fragment/metadata.csv",
5200 index: "my-bootclasspath-fragment/index.csv",
5201 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5202 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5203 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005204 }
5205
5206 java_import {
5207 name: "libfoo",
5208 jars: ["libfoo.jar"],
5209 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005210 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005211 }
5212
5213 java_library {
5214 name: "libfoo",
5215 srcs: ["foo/bar/MyClass.java"],
5216 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005217 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005218 }
Paul Duffin37856732021-02-26 14:24:15 +00005219
5220 java_sdk_library_import {
5221 name: "libbar",
5222 public: {
5223 jars: ["libbar.jar"],
5224 },
5225 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005226 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005227 }
5228
5229 java_sdk_library {
5230 name: "libbar",
5231 srcs: ["foo/bar/MyClass.java"],
5232 unsafe_ignore_missing_latest_api: true,
5233 apex_available: ["myapex"],
5234 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005235 `
5236
5237 // In this test the source (java_library) libfoo is active since the
5238 // prebuilt (java_import) defaults to prefer:false. However the
5239 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5240 // find the dex boot jar in it. We either need to disable the source libfoo
5241 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005242 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005243 // dexbootjar check is skipped if AllowMissingDependencies is true
5244 preparerAllowMissingDeps := android.GroupFixturePreparers(
5245 preparer,
5246 android.PrepareForTestWithAllowMissingDependencies,
5247 )
5248 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005249 })
5250
5251 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005252 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005253 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005254 apex {
5255 name: "myapex",
5256 key: "myapex.key",
5257 updatable: false,
5258 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5259 }
5260
5261 apex_key {
5262 name: "myapex.key",
5263 public_key: "testkey.avbpubkey",
5264 private_key: "testkey.pem",
5265 }
5266
5267 bootclasspath_fragment {
5268 name: "my-bootclasspath-fragment",
5269 contents: ["libfoo", "libbar"],
5270 apex_available: ["myapex"],
5271 hidden_api: {
5272 split_packages: ["*"],
5273 },
5274 }
5275
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005276 prebuilt_apex {
5277 name: "myapex",
5278 arch: {
5279 arm64: {
5280 src: "myapex-arm64.apex",
5281 },
5282 arm: {
5283 src: "myapex-arm.apex",
5284 },
5285 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005286 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5287 }
5288
5289 prebuilt_bootclasspath_fragment {
5290 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005291 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005292 contents: ["libfoo", "libbar"],
5293 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005294 hidden_api: {
5295 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5296 metadata: "my-bootclasspath-fragment/metadata.csv",
5297 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005298 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5299 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5300 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005301 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005302 }
5303
Spandan Das52c01a12024-09-20 01:09:48 +00005304 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005305 name: "libfoo",
5306 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005307 public: {
5308 jars: ["libfoo.jar"],
5309 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005311 shared_library: false,
5312 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005313 }
5314
5315 java_library {
5316 name: "libfoo",
5317 srcs: ["foo/bar/MyClass.java"],
5318 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005319 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005320 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005321 }
Paul Duffin37856732021-02-26 14:24:15 +00005322
5323 java_sdk_library_import {
5324 name: "libbar",
5325 prefer: true,
5326 public: {
5327 jars: ["libbar.jar"],
5328 },
5329 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005330 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005331 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005332 }
5333
5334 java_sdk_library {
5335 name: "libbar",
5336 srcs: ["foo/bar/MyClass.java"],
5337 unsafe_ignore_missing_latest_api: true,
5338 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005339 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005340 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005341 `
5342
Paul Duffin89f570a2021-06-16 01:42:33 +01005343 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005344
Paul Duffin537ea3d2021-05-14 10:38:00 +01005345 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005346 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005347 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005348 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005349 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005350 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005351 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005352 })
5353
5354 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005355 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 bp := `
5357 apex {
5358 name: "myapex",
5359 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005360 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005361 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005362 }
5363
5364 apex_key {
5365 name: "myapex.key",
5366 public_key: "testkey.avbpubkey",
5367 private_key: "testkey.pem",
5368 }
5369
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005370 bootclasspath_fragment {
5371 name: "my-bootclasspath-fragment",
5372 contents: ["libfoo", "libbar"],
5373 apex_available: ["myapex"],
5374 hidden_api: {
5375 split_packages: ["*"],
5376 },
5377 }
5378
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005379 prebuilt_apex {
5380 name: "myapex",
5381 arch: {
5382 arm64: {
5383 src: "myapex-arm64.apex",
5384 },
5385 arm: {
5386 src: "myapex-arm.apex",
5387 },
5388 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005389 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5390 }
5391
5392 prebuilt_bootclasspath_fragment {
5393 name: "my-bootclasspath-fragment",
5394 contents: ["libfoo", "libbar"],
5395 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005396 hidden_api: {
5397 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5398 metadata: "my-bootclasspath-fragment/metadata.csv",
5399 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005400 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5401 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5402 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005403 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005404 }
5405
5406 java_import {
5407 name: "libfoo",
5408 jars: ["libfoo.jar"],
5409 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005410 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005411 }
5412
5413 java_library {
5414 name: "libfoo",
5415 srcs: ["foo/bar/MyClass.java"],
5416 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005417 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005418 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005419 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 }
Paul Duffin37856732021-02-26 14:24:15 +00005421
5422 java_sdk_library_import {
5423 name: "libbar",
5424 public: {
5425 jars: ["libbar.jar"],
5426 },
5427 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005428 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005429 }
5430
5431 java_sdk_library {
5432 name: "libbar",
5433 srcs: ["foo/bar/MyClass.java"],
5434 unsafe_ignore_missing_latest_api: true,
5435 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005436 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005437 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005438 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005439 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005440 `
5441
Paul Duffin89f570a2021-06-16 01:42:33 +01005442 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005443
Paul Duffin537ea3d2021-05-14 10:38:00 +01005444 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005445 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005446 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5447 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005448 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5449 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005450 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 })
5452
5453 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005454 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 bp := `
5456 apex {
5457 name: "myapex",
5458 enabled: false,
5459 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005460 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005461 }
5462
5463 apex_key {
5464 name: "myapex.key",
5465 public_key: "testkey.avbpubkey",
5466 private_key: "testkey.pem",
5467 }
5468
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005469 bootclasspath_fragment {
5470 name: "my-bootclasspath-fragment",
5471 enabled: false,
5472 contents: ["libfoo", "libbar"],
5473 apex_available: ["myapex"],
5474 hidden_api: {
5475 split_packages: ["*"],
5476 },
5477 }
5478
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005479 prebuilt_apex {
5480 name: "myapex",
5481 arch: {
5482 arm64: {
5483 src: "myapex-arm64.apex",
5484 },
5485 arm: {
5486 src: "myapex-arm.apex",
5487 },
5488 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005489 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5490 }
5491
5492 prebuilt_bootclasspath_fragment {
5493 name: "my-bootclasspath-fragment",
5494 contents: ["libfoo", "libbar"],
5495 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005496 hidden_api: {
5497 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5498 metadata: "my-bootclasspath-fragment/metadata.csv",
5499 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005500 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5501 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5502 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005503 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005504 }
5505
5506 java_import {
5507 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005508 jars: ["libfoo.jar"],
5509 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005510 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 }
5512
5513 java_library {
5514 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005515 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005516 srcs: ["foo/bar/MyClass.java"],
5517 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005518 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005519 }
Paul Duffin37856732021-02-26 14:24:15 +00005520
5521 java_sdk_library_import {
5522 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005523 public: {
5524 jars: ["libbar.jar"],
5525 },
5526 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005527 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005528 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005529 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005530 }
5531
5532 java_sdk_library {
5533 name: "libbar",
5534 srcs: ["foo/bar/MyClass.java"],
5535 unsafe_ignore_missing_latest_api: true,
5536 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005537 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005538 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005539 `
Cole Fausta963b942024-04-11 17:43:00 -07005540 // This test disables libbar, which causes the ComponentDepsMutator to add
5541 // deps on libbar.stubs and other sub-modules that don't exist. We can
5542 // enable AllowMissingDependencies to work around that, but enabling that
5543 // causes extra checks for missing source files to dex_bootjars, so add those
5544 // to the mock fs as well.
5545 preparer2 := android.GroupFixturePreparers(
5546 preparer,
5547 android.PrepareForTestWithAllowMissingDependencies,
5548 android.FixtureMergeMockFs(map[string][]byte{
5549 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005550 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005551 }),
5552 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005553
Cole Fausta963b942024-04-11 17:43:00 -07005554 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005555
Paul Duffin537ea3d2021-05-14 10:38:00 +01005556 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005557 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005558 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005559 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005560 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005561 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005562 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 })
Spandan Das3a392012024-01-17 18:26:27 +00005564
Spandan Dasf2c10572024-02-27 04:49:52 +00005565 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005566 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005567 bp := `
5568 // Source
5569 apex {
5570 name: "myapex",
5571 enabled: false,
5572 key: "myapex.key",
5573 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5574 }
5575
5576 apex_key {
5577 name: "myapex.key",
5578 public_key: "testkey.avbpubkey",
5579 private_key: "testkey.pem",
5580 }
5581
5582 // Prebuilt
5583 prebuilt_apex {
5584 name: "myapex.v1",
5585 source_apex_name: "myapex",
5586 arch: {
5587 arm64: {
5588 src: "myapex-arm64.apex",
5589 },
5590 arm: {
5591 src: "myapex-arm.apex",
5592 },
5593 },
5594 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5595 prefer: true,
5596 }
5597 prebuilt_apex {
5598 name: "myapex.v2",
5599 source_apex_name: "myapex",
5600 arch: {
5601 arm64: {
5602 src: "myapex-arm64.apex",
5603 },
5604 arm: {
5605 src: "myapex-arm.apex",
5606 },
5607 },
5608 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5609 prefer: true,
5610 }
5611
5612 prebuilt_bootclasspath_fragment {
5613 name: "my-bootclasspath-fragment",
5614 contents: ["libfoo", "libbar"],
5615 apex_available: ["myapex"],
5616 hidden_api: {
5617 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5618 metadata: "my-bootclasspath-fragment/metadata.csv",
5619 index: "my-bootclasspath-fragment/index.csv",
5620 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5621 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5622 },
5623 prefer: true,
5624 }
5625
5626 java_import {
5627 name: "libfoo",
5628 jars: ["libfoo.jar"],
5629 apex_available: ["myapex"],
5630 prefer: true,
5631 }
5632 java_import {
5633 name: "libbar",
5634 jars: ["libbar.jar"],
5635 apex_available: ["myapex"],
5636 prefer: true,
5637 }
5638 `
5639
Spandan Dasf2c10572024-02-27 04:49:52 +00005640 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 +00005641 })
5642
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005643}
5644
Roland Levillain630846d2019-06-26 12:48:34 +01005645func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005646 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005647 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005648 apex_test {
5649 name: "myapex",
5650 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005651 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005652 tests: [
5653 "mytest",
5654 ],
5655 }
5656
5657 apex_key {
5658 name: "myapex.key",
5659 public_key: "testkey.avbpubkey",
5660 private_key: "testkey.pem",
5661 }
5662
Liz Kammer1c14a212020-05-12 15:26:55 -07005663 filegroup {
5664 name: "fg",
5665 srcs: [
5666 "baz",
5667 "bar/baz"
5668 ],
5669 }
5670
Roland Levillain630846d2019-06-26 12:48:34 +01005671 cc_test {
5672 name: "mytest",
5673 gtest: false,
5674 srcs: ["mytest.cpp"],
5675 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005676 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005677 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01005678 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005679 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005680 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005681
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005682 cc_library {
5683 name: "mylib",
5684 srcs: ["mylib.cpp"],
5685 system_shared_libs: [],
5686 stl: "none",
5687 }
5688
Liz Kammer5bd365f2020-05-27 15:15:11 -07005689 filegroup {
5690 name: "fg2",
5691 srcs: [
5692 "testdata/baz"
5693 ],
5694 }
Roland Levillain630846d2019-06-26 12:48:34 +01005695 `)
5696
Jooyung Hana0503a52023-08-23 13:12:50 +09005697 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005698 copyCmds := apexRule.Args["copy_commands"]
5699
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005700 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005701 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005702 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005703
Liz Kammer1c14a212020-05-12 15:26:55 -07005704 //Ensure that test data are copied into apex.
5705 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5706 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5707
Roland Levillainf89cd092019-07-29 16:22:59 +01005708 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005709 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005710 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005711 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005712 prefix := "TARGET_"
5713 var builder strings.Builder
5714 data.Custom(&builder, name, prefix, "", data)
5715 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005716 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005717 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005718}
5719
Jooyung Hand48f3c32019-08-23 11:18:57 +09005720func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005721 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005722 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5723 apex {
5724 name: "myapex",
5725 key: "myapex.key",
5726 native_shared_libs: ["libfoo"],
5727 }
5728
5729 apex_key {
5730 name: "myapex.key",
5731 public_key: "testkey.avbpubkey",
5732 private_key: "testkey.pem",
5733 }
5734
5735 cc_library {
5736 name: "libfoo",
5737 stl: "none",
5738 system_shared_libs: [],
5739 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005740 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005741 }
5742 `)
5743 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5744 apex {
5745 name: "myapex",
5746 key: "myapex.key",
5747 java_libs: ["myjar"],
5748 }
5749
5750 apex_key {
5751 name: "myapex.key",
5752 public_key: "testkey.avbpubkey",
5753 private_key: "testkey.pem",
5754 }
5755
5756 java_library {
5757 name: "myjar",
5758 srcs: ["foo/bar/MyClass.java"],
5759 sdk_version: "none",
5760 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005761 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005762 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005763 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005764 }
5765 `)
5766}
5767
Bill Peckhama41a6962021-01-11 10:58:54 -08005768func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005769 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005770 apex {
5771 name: "myapex",
5772 key: "myapex.key",
5773 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005774 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005775 }
5776
5777 apex_key {
5778 name: "myapex.key",
5779 public_key: "testkey.avbpubkey",
5780 private_key: "testkey.pem",
5781 }
5782
5783 java_import {
5784 name: "myjavaimport",
5785 apex_available: ["myapex"],
5786 jars: ["my.jar"],
5787 compile_dex: true,
5788 }
5789 `)
5790
Jooyung Hana0503a52023-08-23 13:12:50 +09005791 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005792 apexRule := module.Rule("apexRule")
5793 copyCmds := apexRule.Args["copy_commands"]
5794 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5795}
5796
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005797func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005799 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005800 apex {
5801 name: "myapex",
5802 key: "myapex.key",
5803 apps: [
5804 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005805 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005806 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005807 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005808 }
5809
5810 apex_key {
5811 name: "myapex.key",
5812 public_key: "testkey.avbpubkey",
5813 private_key: "testkey.pem",
5814 }
5815
5816 android_app {
5817 name: "AppFoo",
5818 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005819 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005820 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005821 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005822 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005823 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005824 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005825 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005826
5827 android_app {
5828 name: "AppFooPriv",
5829 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005830 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005831 system_modules: "none",
5832 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005833 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005834 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005835 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005836 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005837
5838 cc_library_shared {
5839 name: "libjni",
5840 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005841 shared_libs: ["libfoo"],
5842 stl: "none",
5843 system_shared_libs: [],
5844 apex_available: [ "myapex" ],
5845 sdk_version: "current",
5846 }
5847
5848 cc_library_shared {
5849 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005850 stl: "none",
5851 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005852 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005853 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005854 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005855 `)
5856
Jooyung Hana0503a52023-08-23 13:12:50 +09005857 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005858 apexRule := module.Rule("apexRule")
5859 copyCmds := apexRule.Args["copy_commands"]
5860
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005861 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
5862 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00005863 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005864
Colin Crossaede88c2020-08-11 12:17:01 -07005865 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005866 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09005867 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005868 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09005869 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005870 // JNI libraries including transitive deps are
5871 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01005872 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005873 // ... embedded inside APK (jnilibs.zip)
5874 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
5875 // ... and not directly inside the APEX
5876 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
5877 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04005878
5879 apexBundle := module.Module().(*apexBundle)
5880 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
5881 var builder strings.Builder
5882 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
5883 androidMk := builder.String()
5884 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
5885 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
5886 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
5887 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
5888 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
5889 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 +01005890}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005891
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005892func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005893 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005894 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
5895 for _, id := range invalidBuildIds {
5896 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
5897 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
5898 variables.BuildId = proptools.StringPtr(id)
5899 })
5900 testApexError(t, message, `apex {
5901 name: "myapex",
5902 key: "myapex.key",
5903 apps: ["AppFooPrebuilt"],
5904 updatable: false,
5905 }
5906
5907 apex_key {
5908 name: "myapex.key",
5909 public_key: "testkey.avbpubkey",
5910 private_key: "testkey.pem",
5911 }
5912
5913 android_app_import {
5914 name: "AppFooPrebuilt",
5915 apk: "PrebuiltAppFoo.apk",
5916 presigned: true,
5917 apex_available: ["myapex"],
5918 }
5919 `, fixture)
5920 }
5921}
5922
Dario Frenicde2a032019-10-27 00:29:22 +01005923func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005924 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005925 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01005926 apex {
5927 name: "myapex",
5928 key: "myapex.key",
5929 apps: [
5930 "AppFooPrebuilt",
5931 "AppFooPrivPrebuilt",
5932 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005933 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01005934 }
5935
5936 apex_key {
5937 name: "myapex.key",
5938 public_key: "testkey.avbpubkey",
5939 private_key: "testkey.pem",
5940 }
5941
5942 android_app_import {
5943 name: "AppFooPrebuilt",
5944 apk: "PrebuiltAppFoo.apk",
5945 presigned: true,
5946 dex_preopt: {
5947 enabled: false,
5948 },
Jiyong Park592a6a42020-04-21 22:34:28 +09005949 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005950 }
5951
5952 android_app_import {
5953 name: "AppFooPrivPrebuilt",
5954 apk: "PrebuiltAppFooPriv.apk",
5955 privileged: true,
5956 presigned: true,
5957 dex_preopt: {
5958 enabled: false,
5959 },
Jooyung Han39ee1192020-03-23 20:21:11 +09005960 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09005961 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01005962 }
5963 `)
5964
Jooyung Hana0503a52023-08-23 13:12:50 +09005965 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01005966 apexRule := module.Rule("apexRule")
5967 copyCmds := apexRule.Args["copy_commands"]
5968
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00005969 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
5970 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09005971}
5972
5973func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005974 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005975 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09005976 apex {
5977 name: "myapex",
5978 key: "myapex.key",
5979 apps: [
5980 "AppFoo",
5981 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005982 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09005983 }
5984
5985 apex_key {
5986 name: "myapex.key",
5987 public_key: "testkey.avbpubkey",
5988 private_key: "testkey.pem",
5989 }
5990
5991 android_app {
5992 name: "AppFoo",
5993 srcs: ["foo/bar/MyClass.java"],
5994 sdk_version: "none",
5995 system_modules: "none",
5996 apex_available: [ "myapex" ],
5997 }
5998
5999 android_app_import {
6000 name: "AppFoo",
6001 apk: "AppFooPrebuilt.apk",
6002 filename: "AppFooPrebuilt.apk",
6003 presigned: true,
6004 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006005 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006006 }
6007 `, withFiles(map[string][]byte{
6008 "AppFooPrebuilt.apk": nil,
6009 }))
6010
Jooyung Hana0503a52023-08-23 13:12:50 +09006011 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006012 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006013 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006014}
6015
Dario Freni6f3937c2019-12-20 22:58:03 +00006016func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006017 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006018 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006019 apex {
6020 name: "myapex",
6021 key: "myapex.key",
6022 apps: [
6023 "TesterHelpAppFoo",
6024 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006025 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006026 }
6027
6028 apex_key {
6029 name: "myapex.key",
6030 public_key: "testkey.avbpubkey",
6031 private_key: "testkey.pem",
6032 }
6033
6034 android_test_helper_app {
6035 name: "TesterHelpAppFoo",
6036 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006037 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006038 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006039 }
6040
6041 `)
6042
Jooyung Hana0503a52023-08-23 13:12:50 +09006043 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006044 apexRule := module.Rule("apexRule")
6045 copyCmds := apexRule.Args["copy_commands"]
6046
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006047 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006048}
6049
Jooyung Han18020ea2019-11-13 10:50:48 +09006050func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006051 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006052 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006053 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006054 apex {
6055 name: "myapex",
6056 key: "myapex.key",
6057 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006058 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006059 }
6060
6061 apex_key {
6062 name: "myapex.key",
6063 public_key: "testkey.avbpubkey",
6064 private_key: "testkey.pem",
6065 }
6066
6067 apex {
6068 name: "otherapex",
6069 key: "myapex.key",
6070 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006071 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006072 }
6073
6074 cc_defaults {
6075 name: "libfoo-defaults",
6076 apex_available: ["otherapex"],
6077 }
6078
6079 cc_library {
6080 name: "libfoo",
6081 defaults: ["libfoo-defaults"],
6082 stl: "none",
6083 system_shared_libs: [],
6084 }`)
6085}
6086
Paul Duffine52e66f2020-03-30 17:54:29 +01006087func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006088 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006089 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006090 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006091 apex {
6092 name: "myapex",
6093 key: "myapex.key",
6094 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006095 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006096 }
6097
6098 apex_key {
6099 name: "myapex.key",
6100 public_key: "testkey.avbpubkey",
6101 private_key: "testkey.pem",
6102 }
6103
6104 apex {
6105 name: "otherapex",
6106 key: "otherapex.key",
6107 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006108 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006109 }
6110
6111 apex_key {
6112 name: "otherapex.key",
6113 public_key: "testkey.avbpubkey",
6114 private_key: "testkey.pem",
6115 }
6116
6117 cc_library {
6118 name: "libfoo",
6119 stl: "none",
6120 system_shared_libs: [],
6121 apex_available: ["otherapex"],
6122 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006123
6124 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6125 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6126 testApex(t, `
6127 apex {
6128 name: "com.sdv.myapex",
6129 key: "myapex.key",
6130 native_shared_libs: ["libfoo"],
6131 updatable: false,
6132 product_specific: true,
6133 }
6134
6135 apex_key {
6136 name: "myapex.key",
6137 public_key: "testkey.avbpubkey",
6138 private_key: "testkey.pem",
6139 }
6140
6141 apex {
6142 name: "com.any.otherapex",
6143 key: "otherapex.key",
6144 native_shared_libs: ["libfoo"],
6145 updatable: false,
6146 }
6147
6148 apex_key {
6149 name: "otherapex.key",
6150 public_key: "testkey.avbpubkey",
6151 private_key: "testkey.pem",
6152 }
6153
6154 cc_library {
6155 name: "libfoo",
6156 stl: "none",
6157 system_shared_libs: [],
6158 apex_available: ["com.any.otherapex"],
6159 product_specific: true,
6160 }`,
6161 android.FixtureMergeMockFs(android.MockFS{
6162 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6163 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6164 }))
6165
6166 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6167 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6168 apex {
6169 name: "com.sdv.myapex",
6170 key: "myapex.key",
6171 native_shared_libs: ["libfoo"],
6172 updatable: false,
6173 }
6174
6175 apex_key {
6176 name: "myapex.key",
6177 public_key: "testkey.avbpubkey",
6178 private_key: "testkey.pem",
6179 }
6180
6181 apex {
6182 name: "com.any.otherapex",
6183 key: "otherapex.key",
6184 native_shared_libs: ["libfoo"],
6185 updatable: false,
6186 }
6187
6188 apex_key {
6189 name: "otherapex.key",
6190 public_key: "testkey.avbpubkey",
6191 private_key: "testkey.pem",
6192 }
6193
6194 cc_library {
6195 name: "libfoo",
6196 stl: "none",
6197 system_shared_libs: [],
6198 apex_available: ["com.any.otherapex"],
6199 }`,
6200 android.FixtureMergeMockFs(android.MockFS{
6201 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6202 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6203 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006204}
Jiyong Park127b40b2019-09-30 16:04:35 +09006205
Paul Duffine52e66f2020-03-30 17:54:29 +01006206func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006207 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006208 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006209 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006210.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006211.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006212.*via tag cc\.dependencyTag.*
6213.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006214.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006215.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006216.*via tag cc\.dependencyTag.*
6217.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006218.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006219.*-> libbaz.*link:shared.*
6220.*via tag cc\.dependencyTag.*
6221.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006222 apex {
6223 name: "myapex",
6224 key: "myapex.key",
6225 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006226 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006227 }
6228
6229 apex_key {
6230 name: "myapex.key",
6231 public_key: "testkey.avbpubkey",
6232 private_key: "testkey.pem",
6233 }
6234
Jiyong Park127b40b2019-09-30 16:04:35 +09006235 cc_library {
6236 name: "libfoo",
6237 stl: "none",
6238 shared_libs: ["libbar"],
6239 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006240 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006241 }
6242
6243 cc_library {
6244 name: "libbar",
6245 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006246 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006247 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006248 apex_available: ["myapex"],
6249 }
6250
6251 cc_library {
6252 name: "libbaz",
6253 stl: "none",
6254 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006255 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006256
6257 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6258 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6259 testApex(t, `
6260 apex {
6261 name: "com.sdv.myapex",
6262 key: "myapex.key",
6263 native_shared_libs: ["libfoo"],
6264 updatable: false,
6265 product_specific: true,
6266 }
6267
6268 apex_key {
6269 name: "myapex.key",
6270 public_key: "testkey.avbpubkey",
6271 private_key: "testkey.pem",
6272 }
6273
6274 cc_library {
6275 name: "libfoo",
6276 stl: "none",
6277 shared_libs: ["libbar"],
6278 system_shared_libs: [],
6279 apex_available: ["com.sdv.myapex"],
6280 product_specific: true,
6281 }
6282
6283 cc_library {
6284 name: "libbar",
6285 stl: "none",
6286 shared_libs: ["libbaz"],
6287 system_shared_libs: [],
6288 apex_available: ["com.sdv.myapex"],
6289 product_specific: true,
6290 }
6291
6292 cc_library {
6293 name: "libbaz",
6294 stl: "none",
6295 system_shared_libs: [],
6296 product_specific: true,
6297 }`,
6298 android.FixtureMergeMockFs(android.MockFS{
6299 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6300 }))
6301
6302 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6303 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6304 apex {
6305 name: "com.sdv.myapex",
6306 key: "myapex.key",
6307 native_shared_libs: ["libfoo"],
6308 updatable: false,
6309 }
6310
6311 apex_key {
6312 name: "myapex.key",
6313 public_key: "testkey.avbpubkey",
6314 private_key: "testkey.pem",
6315 }
6316
6317 cc_library {
6318 name: "libfoo",
6319 stl: "none",
6320 shared_libs: ["libbar"],
6321 system_shared_libs: [],
6322 apex_available: ["com.sdv.myapex"],
6323 }
6324
6325 cc_library {
6326 name: "libbar",
6327 stl: "none",
6328 shared_libs: ["libbaz"],
6329 system_shared_libs: [],
6330 apex_available: ["com.sdv.myapex"],
6331 }
6332
6333 cc_library {
6334 name: "libbaz",
6335 stl: "none",
6336 system_shared_libs: [],
6337 }`,
6338 android.FixtureMergeMockFs(android.MockFS{
6339 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6340 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006341}
Jiyong Park127b40b2019-09-30 16:04:35 +09006342
Liz Kammer5f108fa2023-05-11 14:33:17 -04006343func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006344 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006345 testApex(t, `
6346 apex {
6347 name: "myapex",
6348 key: "myapex.key",
6349 native_shared_libs: ["libfoo"],
6350 updatable: false,
6351 }
6352
6353 apex_key {
6354 name: "myapex.key",
6355 public_key: "testkey.avbpubkey",
6356 private_key: "testkey.pem",
6357 }
6358
6359 cc_library {
6360 name: "libfoo",
6361 stl: "none",
6362 static_libs: ["libbar"],
6363 system_shared_libs: [],
6364 apex_available: ["myapex"],
6365 }
6366
6367 cc_library {
6368 name: "libbar",
6369 stl: "none",
6370 shared_libs: ["libbaz"],
6371 system_shared_libs: [],
6372 apex_available: ["myapex"],
6373 }
6374
6375 cc_library {
6376 name: "libbaz",
6377 stl: "none",
6378 system_shared_libs: [],
6379 }`)
6380
6381 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6382 apex {
6383 name: "myapex",
6384 key: "myapex.key",
6385 native_shared_libs: ["libfoo"],
6386 updatable: false,
6387 }
6388
6389 apex_key {
6390 name: "myapex.key",
6391 public_key: "testkey.avbpubkey",
6392 private_key: "testkey.pem",
6393 }
6394
6395 cc_library {
6396 name: "libfoo",
6397 stl: "none",
6398 static_libs: ["libbar"],
6399 system_shared_libs: [],
6400 apex_available: ["myapex"],
6401 }
6402
6403 cc_library {
6404 name: "libbar",
6405 stl: "none",
6406 system_shared_libs: [],
6407 }`)
6408}
6409
Paul Duffine52e66f2020-03-30 17:54:29 +01006410func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006411 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006412 testApexError(t, "\"otherapex\" is not a valid module name", `
6413 apex {
6414 name: "myapex",
6415 key: "myapex.key",
6416 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006417 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006418 }
6419
6420 apex_key {
6421 name: "myapex.key",
6422 public_key: "testkey.avbpubkey",
6423 private_key: "testkey.pem",
6424 }
6425
6426 cc_library {
6427 name: "libfoo",
6428 stl: "none",
6429 system_shared_libs: [],
6430 apex_available: ["otherapex"],
6431 }`)
6432
Paul Duffine52e66f2020-03-30 17:54:29 +01006433 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006434 apex {
6435 name: "myapex",
6436 key: "myapex.key",
6437 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006438 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006439 }
6440
6441 apex_key {
6442 name: "myapex.key",
6443 public_key: "testkey.avbpubkey",
6444 private_key: "testkey.pem",
6445 }
6446
6447 cc_library {
6448 name: "libfoo",
6449 stl: "none",
6450 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006451 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006452 apex_available: ["myapex"],
6453 }
6454
6455 cc_library {
6456 name: "libbar",
6457 stl: "none",
6458 system_shared_libs: [],
6459 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006460 }
6461
6462 cc_library {
6463 name: "libbaz",
6464 stl: "none",
6465 system_shared_libs: [],
6466 stubs: {
6467 versions: ["10", "20", "30"],
6468 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006469 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006470}
Jiyong Park127b40b2019-09-30 16:04:35 +09006471
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006472func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006473 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006474 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006475 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006476 testApexError(t, "expected an integer between 0-9; got -1", `
6477 apex {
6478 name: "myapex",
6479 key: "myapex.key",
6480 apex_available_name: "com.android.foo",
6481 variant_version: "-1",
6482 updatable: false,
6483 }
6484 apex_key {
6485 name: "myapex.key",
6486 public_key: "testkey.avbpubkey",
6487 private_key: "testkey.pem",
6488 }
6489 `)
6490 })
6491
6492 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006493 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006494 testApexError(t, "expected an integer between 0-9; got 10", `
6495 apex {
6496 name: "myapex",
6497 key: "myapex.key",
6498 apex_available_name: "com.android.foo",
6499 variant_version: "10",
6500 updatable: false,
6501 }
6502 apex_key {
6503 name: "myapex.key",
6504 public_key: "testkey.avbpubkey",
6505 private_key: "testkey.pem",
6506 }
6507 `)
6508 })
6509}
6510
6511func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006512 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006513 context := android.GroupFixturePreparers(
6514 android.PrepareForIntegrationTestWithAndroid,
6515 PrepareForTestWithApexBuildComponents,
6516 android.FixtureMergeMockFs(android.MockFS{
6517 "system/sepolicy/apex/foo-file_contexts": nil,
6518 "system/sepolicy/apex/bar-file_contexts": nil,
6519 }),
6520 )
6521 result := context.RunTestWithBp(t, `
6522 apex {
6523 name: "foo",
6524 key: "myapex.key",
6525 apex_available_name: "com.android.foo",
6526 variant_version: "0",
6527 updatable: false,
6528 }
6529 apex {
6530 name: "bar",
6531 key: "myapex.key",
6532 apex_available_name: "com.android.foo",
6533 variant_version: "3",
6534 updatable: false,
6535 }
6536 apex_key {
6537 name: "myapex.key",
6538 public_key: "testkey.avbpubkey",
6539 private_key: "testkey.pem",
6540 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006541 override_apex {
6542 name: "myoverrideapex",
6543 base: "bar",
6544 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006545 `)
6546
Jooyung Hana0503a52023-08-23 13:12:50 +09006547 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006548 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006549 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6550 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6551 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6552 }
6553
Jooyung Hana0503a52023-08-23 13:12:50 +09006554 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006555 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006556 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6557 barActualDefaultVersion := barManifestRule.Args["default_version"]
6558 if barActualDefaultVersion != barExpectedDefaultVersion {
6559 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6560 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006561
Spandan Das50801e22024-05-13 18:29:45 +00006562 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006563 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6564 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6565 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6566 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006567}
6568
Sam Delmericoca816532023-06-02 14:09:50 -04006569func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006570 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006571 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 -07006572 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006573 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6574 apex {
6575 name: "myapex_sminus",
6576 key: "myapex.key",
6577 apps: ["AppFoo"],
6578 apex_available_name: "myapex",
6579 updatable: false,
6580 }
6581 apex {
6582 name: "myapex",
6583 key: "myapex.key",
6584 apps: ["AppFoo"],
6585 updatable: false,
6586 }
6587 apex_key {
6588 name: "myapex.key",
6589 public_key: "testkey.avbpubkey",
6590 private_key: "testkey.pem",
6591 }
6592 android_app {
6593 name: "AppFoo",
6594 srcs: ["foo/bar/MyClass.java"],
6595 sdk_version: "none",
6596 system_modules: "none",
6597 apex_available: [ "myapex_sminus" ],
6598 }`,
6599 android.FixtureMergeMockFs(android.MockFS{
6600 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6601 }),
6602 )
6603 })
6604
6605 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 -07006606 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006607 testApex(t, `
6608 apex {
6609 name: "myapex_sminus",
6610 key: "myapex.key",
6611 apps: ["AppFoo"],
6612 apex_available_name: "myapex",
6613 updatable: false,
6614 }
6615 apex {
6616 name: "myapex",
6617 key: "myapex.key",
6618 apps: ["AppFoo"],
6619 updatable: false,
6620 }
6621 apex_key {
6622 name: "myapex.key",
6623 public_key: "testkey.avbpubkey",
6624 private_key: "testkey.pem",
6625 }
6626 android_app {
6627 name: "AppFoo",
6628 srcs: ["foo/bar/MyClass.java"],
6629 sdk_version: "none",
6630 system_modules: "none",
6631 apex_available: [ "myapex" ],
6632 }`,
6633 android.FixtureMergeMockFs(android.MockFS{
6634 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6635 }),
6636 )
6637 })
6638
6639 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006640 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006641 testApex(t, `
6642 override_apex {
6643 name: "myoverrideapex_sminus",
6644 base: "myapex_sminus",
6645 key: "myapex.key",
6646 apps: ["AppFooOverride"],
6647 }
6648 override_apex {
6649 name: "myoverrideapex",
6650 base: "myapex",
6651 key: "myapex.key",
6652 apps: ["AppFooOverride"],
6653 }
6654 apex {
6655 name: "myapex_sminus",
6656 key: "myapex.key",
6657 apps: ["AppFoo"],
6658 apex_available_name: "myapex",
6659 updatable: false,
6660 }
6661 apex {
6662 name: "myapex",
6663 key: "myapex.key",
6664 apps: ["AppFoo"],
6665 updatable: false,
6666 }
6667 apex_key {
6668 name: "myapex.key",
6669 public_key: "testkey.avbpubkey",
6670 private_key: "testkey.pem",
6671 }
6672 android_app {
6673 name: "AppFooOverride",
6674 srcs: ["foo/bar/MyClass.java"],
6675 sdk_version: "none",
6676 system_modules: "none",
6677 apex_available: [ "myapex" ],
6678 }
6679 android_app {
6680 name: "AppFoo",
6681 srcs: ["foo/bar/MyClass.java"],
6682 sdk_version: "none",
6683 system_modules: "none",
6684 apex_available: [ "myapex" ],
6685 }`,
6686 android.FixtureMergeMockFs(android.MockFS{
6687 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6688 }),
6689 )
6690 })
6691}
6692
6693func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006694 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006695 context := android.GroupFixturePreparers(
6696 android.PrepareForIntegrationTestWithAndroid,
6697 PrepareForTestWithApexBuildComponents,
6698 java.PrepareForTestWithDexpreopt,
6699 android.FixtureMergeMockFs(android.MockFS{
6700 "system/sepolicy/apex/myapex-file_contexts": nil,
6701 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6702 }),
6703 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6704 variables.BuildId = proptools.StringPtr("buildid")
6705 }),
6706 )
6707 context.RunTestWithBp(t, `
6708 override_apex {
6709 name: "myoverrideapex_sminus",
6710 base: "myapex_sminus",
6711 }
6712 override_apex {
6713 name: "myoverrideapex",
6714 base: "myapex",
6715 }
6716 apex {
6717 name: "myapex",
6718 key: "myapex.key",
6719 apps: ["AppFoo"],
6720 updatable: false,
6721 }
6722 apex {
6723 name: "myapex_sminus",
6724 apex_available_name: "myapex",
6725 key: "myapex.key",
6726 apps: ["AppFoo_sminus"],
6727 updatable: false,
6728 }
6729 apex_key {
6730 name: "myapex.key",
6731 public_key: "testkey.avbpubkey",
6732 private_key: "testkey.pem",
6733 }
6734 android_app {
6735 name: "AppFoo",
6736 srcs: ["foo/bar/MyClass.java"],
6737 sdk_version: "none",
6738 system_modules: "none",
6739 apex_available: [ "myapex" ],
6740 }
6741 android_app {
6742 name: "AppFoo_sminus",
6743 srcs: ["foo/bar/MyClass.java"],
6744 sdk_version: "none",
6745 min_sdk_version: "29",
6746 system_modules: "none",
6747 apex_available: [ "myapex" ],
6748 }`)
6749}
6750
Jiyong Park89e850a2020-04-07 16:37:39 +09006751func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006752 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006753 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006754 apex {
6755 name: "myapex",
6756 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006757 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006758 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006759 }
6760
6761 apex_key {
6762 name: "myapex.key",
6763 public_key: "testkey.avbpubkey",
6764 private_key: "testkey.pem",
6765 }
6766
6767 cc_library {
6768 name: "libfoo",
6769 stl: "none",
6770 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006771 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006772 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006773 }
6774
6775 cc_library {
6776 name: "libfoo2",
6777 stl: "none",
6778 system_shared_libs: [],
6779 shared_libs: ["libbaz"],
6780 apex_available: ["//apex_available:platform"],
6781 }
6782
6783 cc_library {
6784 name: "libbar",
6785 stl: "none",
6786 system_shared_libs: [],
6787 apex_available: ["myapex"],
6788 }
6789
6790 cc_library {
6791 name: "libbaz",
6792 stl: "none",
6793 system_shared_libs: [],
6794 apex_available: ["myapex"],
6795 stubs: {
6796 versions: ["1"],
6797 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006798 }`)
6799
Jiyong Park89e850a2020-04-07 16:37:39 +09006800 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6801 // because it depends on libbar which isn't available to platform
6802 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6803 if libfoo.NotAvailableForPlatform() != true {
6804 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6805 }
6806
6807 // libfoo2 however can be available to platform because it depends on libbaz which provides
6808 // stubs
6809 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6810 if libfoo2.NotAvailableForPlatform() == true {
6811 t.Errorf("%q should be available to platform", libfoo2.String())
6812 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006813}
Jiyong Parka90ca002019-10-07 15:47:24 +09006814
Paul Duffine52e66f2020-03-30 17:54:29 +01006815func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006816 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006817 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006818 apex {
6819 name: "myapex",
6820 key: "myapex.key",
6821 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006822 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006823 }
6824
6825 apex_key {
6826 name: "myapex.key",
6827 public_key: "testkey.avbpubkey",
6828 private_key: "testkey.pem",
6829 }
6830
6831 cc_library {
6832 name: "libfoo",
6833 stl: "none",
6834 system_shared_libs: [],
6835 apex_available: ["myapex"],
6836 static: {
6837 apex_available: ["//apex_available:platform"],
6838 },
6839 }`)
6840
Jiyong Park89e850a2020-04-07 16:37:39 +09006841 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6842 if libfooShared.NotAvailableForPlatform() != true {
6843 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6844 }
6845 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6846 if libfooStatic.NotAvailableForPlatform() != false {
6847 t.Errorf("%q should be available to platform", libfooStatic.String())
6848 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006849}
6850
Jooyung Han9a419e22024-08-16 17:14:21 +09006851func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006852 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006853
6854 for _, tc := range []struct {
6855 name string
6856 apexAvailable string
6857 expectedError string
6858 }{
6859 {
6860 name: "prefix matches correctly",
6861 apexAvailable: "com.foo.*",
6862 },
6863 {
6864 name: "prefix doesn't match",
6865 apexAvailable: "com.bar.*",
6866 expectedError: `Consider .* "com.foo\.\*"`,
6867 },
6868 {
6869 name: "short prefix",
6870 apexAvailable: "com.*",
6871 expectedError: "requires two or more components",
6872 },
6873 {
6874 name: "wildcard not in the end",
6875 apexAvailable: "com.*.foo",
6876 expectedError: "should end with .*",
6877 },
6878 {
6879 name: "wildcard in the middle",
6880 apexAvailable: "com.foo*.*",
6881 expectedError: "not allowed in the middle",
6882 },
6883 {
6884 name: "hint with prefix pattern",
6885 apexAvailable: "//apex_available:platform",
6886 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
6887 },
6888 } {
6889 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006890 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006891 errorHandler := android.FixtureExpectsNoErrors
6892 if tc.expectedError != "" {
6893 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
6894 }
6895 context := android.GroupFixturePreparers(
6896 prepareForApexTest,
6897 android.FixtureMergeMockFs(android.MockFS{
6898 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
6899 }),
6900 ).ExtendWithErrorHandler(errorHandler)
6901
6902 context.RunTestWithBp(t, `
6903 apex {
6904 name: "com.foo.bar",
6905 key: "myapex.key",
6906 native_shared_libs: ["libfoo"],
6907 updatable: false,
6908 }
6909
6910 apex_key {
6911 name: "myapex.key",
6912 public_key: "testkey.avbpubkey",
6913 private_key: "testkey.pem",
6914 }
6915
6916 cc_library {
6917 name: "libfoo",
6918 stl: "none",
6919 system_shared_libs: [],
6920 apex_available: ["`+tc.apexAvailable+`"],
6921 }`)
6922 })
6923 }
6924 testApexError(t, `Consider adding "com.foo" to`, `
6925 apex {
6926 name: "com.foo", // too short for a partner apex
6927 key: "myapex.key",
6928 native_shared_libs: ["libfoo"],
6929 updatable: false,
6930 }
6931
6932 apex_key {
6933 name: "myapex.key",
6934 public_key: "testkey.avbpubkey",
6935 private_key: "testkey.pem",
6936 }
6937
6938 cc_library {
6939 name: "libfoo",
6940 stl: "none",
6941 system_shared_libs: [],
6942 }
6943 `)
6944}
6945
Jooyung Hanb9518072024-11-22 14:05:20 +09006946func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
6947 t.Parallel()
6948 ctx := testApex(t, `
6949 apex_test {
6950 name: "myapex",
6951 key: "myapex.key",
6952 skip_validations: {
6953 host_apex_verifier: true,
6954 },
6955 updatable: false,
6956 }
6957 apex_key {
6958 name: "myapex.key",
6959 public_key: "testkey.avbpubkey",
6960 private_key: "testkey.pem",
6961 }
6962 `)
6963
6964 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
6965 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
6966 t.Error("should not run host_apex_verifier")
6967 }
6968}
6969
6970func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
6971 t.Parallel()
6972 ctx := testApex(t, `
6973 apex_test {
6974 name: "myapex",
6975 key: "myapex.key",
6976 updatable: false,
6977 }
6978 apex_key {
6979 name: "myapex.key",
6980 public_key: "testkey.avbpubkey",
6981 private_key: "testkey.pem",
6982 }
6983 `)
6984
6985 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
6986 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
6987 t.Error("should run host_apex_verifier")
6988 }
6989}
6990
Jiyong Park5d790c32019-11-15 18:40:32 +09006991func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006992 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006993 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09006994 apex {
6995 name: "myapex",
6996 key: "myapex.key",
6997 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08006998 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07006999 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007000 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007001 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007002 }
7003
7004 override_apex {
7005 name: "override_myapex",
7006 base: "myapex",
7007 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007008 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007009 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007010 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007011 compile_multilib: "first",
7012 multilib: {
7013 lib32: {
7014 native_shared_libs: ["mylib32"],
7015 },
7016 lib64: {
7017 native_shared_libs: ["mylib64"],
7018 },
7019 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007020 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007021 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007022 key: "mynewapex.key",
7023 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007024 }
7025
7026 apex_key {
7027 name: "myapex.key",
7028 public_key: "testkey.avbpubkey",
7029 private_key: "testkey.pem",
7030 }
7031
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007032 apex_key {
7033 name: "mynewapex.key",
7034 public_key: "testkey2.avbpubkey",
7035 private_key: "testkey2.pem",
7036 }
7037
7038 android_app_certificate {
7039 name: "myapex.certificate",
7040 certificate: "testkey",
7041 }
7042
Jiyong Park5d790c32019-11-15 18:40:32 +09007043 android_app {
7044 name: "app",
7045 srcs: ["foo/bar/MyClass.java"],
7046 package_name: "foo",
7047 sdk_version: "none",
7048 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007049 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007050 }
7051
7052 override_android_app {
7053 name: "override_app",
7054 base: "app",
7055 package_name: "bar",
7056 }
markchien7c803b82021-08-26 22:10:06 +08007057
7058 bpf {
7059 name: "bpf",
7060 srcs: ["bpf.c"],
7061 }
7062
7063 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007064 name: "overrideBpf",
7065 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007066 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007067
7068 prebuilt_etc {
7069 name: "myetc",
7070 src: "myprebuilt",
7071 }
7072
7073 prebuilt_etc {
7074 name: "override_myetc",
7075 src: "override_myprebuilt",
7076 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007077
7078 cc_library {
7079 name: "mylib32",
7080 apex_available: [ "myapex" ],
7081 }
7082
7083 cc_library {
7084 name: "mylib64",
7085 apex_available: [ "myapex" ],
7086 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007087 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007088
Jooyung Hana0503a52023-08-23 13:12:50 +09007089 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007090 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007091 if originalVariant.GetOverriddenBy() != "" {
7092 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7093 }
7094 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7095 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7096 }
7097
Spandan Das50801e22024-05-13 18:29:45 +00007098 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007099 apexRule := module.Rule("apexRule")
7100 copyCmds := apexRule.Args["copy_commands"]
7101
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007102 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7103 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007104
markchien7c803b82021-08-26 22:10:06 +08007105 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007106 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007107
Daniel Norman5a3ce132021-08-26 15:44:43 -07007108 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7109 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7110
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007111 apexBundle := module.Module().(*apexBundle)
7112 name := apexBundle.Name()
7113 if name != "override_myapex" {
7114 t.Errorf("name should be \"override_myapex\", but was %q", name)
7115 }
7116
Baligh Uddin004d7172020-02-19 21:29:28 -08007117 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7118 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7119 }
7120
Jiyong Park20bacab2020-03-03 11:45:41 +09007121 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007122 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007123 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7124
7125 signApkRule := module.Rule("signapk")
7126 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007127
Colin Crossaa255532020-07-03 13:18:24 -07007128 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007129 var builder strings.Builder
7130 data.Custom(&builder, name, "TARGET_", "", data)
7131 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007132 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7133 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007134 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007135 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007136 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007137 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007138 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007139 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007140}
7141
Albert Martineefabcf2022-03-21 20:11:16 +00007142func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007143 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007144 // Override from 29 to 31
7145 minSdkOverride31 := "31"
7146 ctx := testApex(t, `
7147 apex {
7148 name: "myapex",
7149 key: "myapex.key",
7150 native_shared_libs: ["mylib"],
7151 updatable: true,
7152 min_sdk_version: "29"
7153 }
7154
7155 override_apex {
7156 name: "override_myapex",
7157 base: "myapex",
7158 logging_parent: "com.foo.bar",
7159 package_name: "test.overridden.package"
7160 }
7161
7162 apex_key {
7163 name: "myapex.key",
7164 public_key: "testkey.avbpubkey",
7165 private_key: "testkey.pem",
7166 }
7167
7168 cc_library {
7169 name: "mylib",
7170 srcs: ["mylib.cpp"],
7171 runtime_libs: ["libbar"],
7172 system_shared_libs: [],
7173 stl: "none",
7174 apex_available: [ "myapex" ],
7175 min_sdk_version: "apex_inherit"
7176 }
7177
7178 cc_library {
7179 name: "libbar",
7180 srcs: ["mylib.cpp"],
7181 system_shared_libs: [],
7182 stl: "none",
7183 apex_available: [ "myapex" ],
7184 min_sdk_version: "apex_inherit"
7185 }
7186
7187 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7188
Jooyung Hana0503a52023-08-23 13:12:50 +09007189 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007190 copyCmds := apexRule.Args["copy_commands"]
7191
7192 // Ensure that direct non-stubs dep is always included
7193 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7194
7195 // Ensure that runtime_libs dep in included
7196 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7197
7198 // Ensure libraries target overridden min_sdk_version value
7199 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7200}
7201
7202func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007203 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007204 // Attempt to override from 31 to 29, should be a NOOP
7205 minSdkOverride29 := "29"
7206 ctx := testApex(t, `
7207 apex {
7208 name: "myapex",
7209 key: "myapex.key",
7210 native_shared_libs: ["mylib"],
7211 updatable: true,
7212 min_sdk_version: "31"
7213 }
7214
7215 override_apex {
7216 name: "override_myapex",
7217 base: "myapex",
7218 logging_parent: "com.foo.bar",
7219 package_name: "test.overridden.package"
7220 }
7221
7222 apex_key {
7223 name: "myapex.key",
7224 public_key: "testkey.avbpubkey",
7225 private_key: "testkey.pem",
7226 }
7227
7228 cc_library {
7229 name: "mylib",
7230 srcs: ["mylib.cpp"],
7231 runtime_libs: ["libbar"],
7232 system_shared_libs: [],
7233 stl: "none",
7234 apex_available: [ "myapex" ],
7235 min_sdk_version: "apex_inherit"
7236 }
7237
7238 cc_library {
7239 name: "libbar",
7240 srcs: ["mylib.cpp"],
7241 system_shared_libs: [],
7242 stl: "none",
7243 apex_available: [ "myapex" ],
7244 min_sdk_version: "apex_inherit"
7245 }
7246
7247 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7248
Jooyung Hana0503a52023-08-23 13:12:50 +09007249 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007250 copyCmds := apexRule.Args["copy_commands"]
7251
7252 // Ensure that direct non-stubs dep is always included
7253 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7254
7255 // Ensure that runtime_libs dep in included
7256 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7257
7258 // Ensure libraries target the original min_sdk_version value rather than the overridden
7259 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7260}
7261
Jooyung Han214bf372019-11-12 13:03:50 +09007262func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007263 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007264 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007265 apex {
7266 name: "myapex",
7267 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007268 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007269 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007270 }
7271
7272 apex_key {
7273 name: "myapex.key",
7274 public_key: "testkey.avbpubkey",
7275 private_key: "testkey.pem",
7276 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007277
7278 cc_library {
7279 name: "mylib",
7280 srcs: ["mylib.cpp"],
7281 stl: "libc++",
7282 system_shared_libs: [],
7283 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007284 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007285 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007286 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007287
Jooyung Hana0503a52023-08-23 13:12:50 +09007288 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007289 args := module.Rule("apexRule").Args
7290 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007291
7292 // The copies of the libraries in the apex should have one more dependency than
7293 // the ones outside the apex, namely the unwinder. Ideally we should check
7294 // the dependency names directly here but for some reason the names are blank in
7295 // this test.
7296 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007297 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007298 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7299 if len(apexImplicits) != len(nonApexImplicits)+1 {
7300 t.Errorf("%q missing unwinder dep", lib)
7301 }
7302 }
Jooyung Han214bf372019-11-12 13:03:50 +09007303}
7304
Paul Duffine05480a2021-03-08 15:07:14 +00007305var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007306 "api/current.txt": nil,
7307 "api/removed.txt": nil,
7308 "api/system-current.txt": nil,
7309 "api/system-removed.txt": nil,
7310 "api/test-current.txt": nil,
7311 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007312
Anton Hanssondff2c782020-12-21 17:10:01 +00007313 "100/public/api/foo.txt": nil,
7314 "100/public/api/foo-removed.txt": nil,
7315 "100/system/api/foo.txt": nil,
7316 "100/system/api/foo-removed.txt": nil,
7317
Paul Duffineedc5d52020-06-12 17:46:39 +01007318 // For java_sdk_library_import
7319 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007320}
7321
Jooyung Han58f26ab2019-12-18 15:34:32 +09007322func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007323 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007324 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007325 apex {
7326 name: "myapex",
7327 key: "myapex.key",
7328 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007329 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007330 }
7331
7332 apex_key {
7333 name: "myapex.key",
7334 public_key: "testkey.avbpubkey",
7335 private_key: "testkey.pem",
7336 }
7337
7338 java_sdk_library {
7339 name: "foo",
7340 srcs: ["a.java"],
7341 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007342 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007343 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007344
7345 prebuilt_apis {
7346 name: "sdk",
7347 api_dirs: ["100"],
7348 }
Paul Duffin9b879592020-05-26 13:21:35 +01007349 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007350
7351 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007352 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007353 "javalib/foo.jar",
7354 "etc/permissions/foo.xml",
7355 })
7356 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007357 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7358 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7359 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007360}
7361
Spandan Das3ee19692024-06-19 04:47:40 +00007362func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007363 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007364 ctx := testApex(t, `
7365 override_apex {
7366 name: "mycompanyapex",
7367 base: "myapex",
7368 }
7369 apex {
7370 name: "myapex",
7371 key: "myapex.key",
7372 java_libs: ["foo"],
7373 updatable: false,
7374 }
7375
7376 apex_key {
7377 name: "myapex.key",
7378 public_key: "testkey.avbpubkey",
7379 private_key: "testkey.pem",
7380 }
7381
7382 java_sdk_library {
7383 name: "foo",
7384 srcs: ["a.java"],
7385 api_packages: ["foo"],
7386 apex_available: [ "myapex" ],
7387 }
7388
7389 prebuilt_apis {
7390 name: "sdk",
7391 api_dirs: ["100"],
7392 }
7393 `, withFiles(filesForSdkLibrary))
7394
7395 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7396 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7397 // (com.android.foo), the filepath should not contain override apex name.
7398 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7399 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7400 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7401}
7402
Paul Duffin9b879592020-05-26 13:21:35 +01007403func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007404 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007405 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007406 apex {
7407 name: "myapex",
7408 key: "myapex.key",
7409 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007410 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007411 }
7412
7413 apex_key {
7414 name: "myapex.key",
7415 public_key: "testkey.avbpubkey",
7416 private_key: "testkey.pem",
7417 }
7418
7419 java_sdk_library {
7420 name: "foo",
7421 srcs: ["a.java"],
7422 api_packages: ["foo"],
7423 apex_available: ["myapex"],
7424 sdk_version: "none",
7425 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007426 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007427 }
7428
7429 java_library {
7430 name: "bar",
7431 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007432 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007433 apex_available: ["myapex"],
7434 sdk_version: "none",
7435 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007436 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007437 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007438
7439 prebuilt_apis {
7440 name: "sdk",
7441 api_dirs: ["100"],
7442 }
Paul Duffin9b879592020-05-26 13:21:35 +01007443 `, withFiles(filesForSdkLibrary))
7444
7445 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007446 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007447 "javalib/bar.jar",
7448 "javalib/foo.jar",
7449 "etc/permissions/foo.xml",
7450 })
7451
7452 // The bar library should depend on the implementation jar.
7453 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007454 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007455 t.Errorf("expected %q, found %#q", expected, actual)
7456 }
7457}
7458
7459func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007460 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007461 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007462 apex {
7463 name: "myapex",
7464 key: "myapex.key",
7465 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007466 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007467 }
7468
7469 apex_key {
7470 name: "myapex.key",
7471 public_key: "testkey.avbpubkey",
7472 private_key: "testkey.pem",
7473 }
7474
7475 java_sdk_library {
7476 name: "foo",
7477 srcs: ["a.java"],
7478 api_packages: ["foo"],
7479 apex_available: ["myapex"],
7480 sdk_version: "none",
7481 system_modules: "none",
7482 }
7483
7484 java_library {
7485 name: "bar",
7486 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007487 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007488 sdk_version: "none",
7489 system_modules: "none",
7490 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007491
7492 prebuilt_apis {
7493 name: "sdk",
7494 api_dirs: ["100"],
7495 }
Paul Duffin9b879592020-05-26 13:21:35 +01007496 `, withFiles(filesForSdkLibrary))
7497
7498 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007499 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007500 "javalib/foo.jar",
7501 "etc/permissions/foo.xml",
7502 })
7503
7504 // The bar library should depend on the stubs jar.
7505 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007506 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007507 t.Errorf("expected %q, found %#q", expected, actual)
7508 }
7509}
7510
Paul Duffineedc5d52020-06-12 17:46:39 +01007511func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007512 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007513 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007514 prebuilt_apis {
7515 name: "sdk",
7516 api_dirs: ["100"],
7517 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007518 withFiles(map[string][]byte{
7519 "apex/a.java": nil,
7520 "apex/apex_manifest.json": nil,
7521 "apex/Android.bp": []byte(`
7522 package {
7523 default_visibility: ["//visibility:private"],
7524 }
7525
7526 apex {
7527 name: "myapex",
7528 key: "myapex.key",
7529 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007530 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007531 }
7532
7533 apex_key {
7534 name: "myapex.key",
7535 public_key: "testkey.avbpubkey",
7536 private_key: "testkey.pem",
7537 }
7538
7539 java_library {
7540 name: "bar",
7541 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007542 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007543 apex_available: ["myapex"],
7544 sdk_version: "none",
7545 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007546 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007547 }
7548`),
7549 "source/a.java": nil,
7550 "source/api/current.txt": nil,
7551 "source/api/removed.txt": nil,
7552 "source/Android.bp": []byte(`
7553 package {
7554 default_visibility: ["//visibility:private"],
7555 }
7556
7557 java_sdk_library {
7558 name: "foo",
7559 visibility: ["//apex"],
7560 srcs: ["a.java"],
7561 api_packages: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
7565 public: {
7566 enabled: true,
7567 },
Colin Crosse4f34882024-11-14 12:26:00 -08007568 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007569 }
7570`),
7571 "prebuilt/a.jar": nil,
7572 "prebuilt/Android.bp": []byte(`
7573 package {
7574 default_visibility: ["//visibility:private"],
7575 }
7576
7577 java_sdk_library_import {
7578 name: "foo",
7579 visibility: ["//apex", "//source"],
7580 apex_available: ["myapex"],
7581 prefer: true,
7582 public: {
7583 jars: ["a.jar"],
7584 },
Colin Crosse4f34882024-11-14 12:26:00 -08007585 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007586 }
7587`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007588 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007589 )
7590
7591 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007592 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007593 "javalib/bar.jar",
7594 "javalib/foo.jar",
7595 "etc/permissions/foo.xml",
7596 })
7597
7598 // The bar library should depend on the implementation jar.
7599 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007600 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007601 t.Errorf("expected %q, found %#q", expected, actual)
7602 }
7603}
7604
7605func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007606 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007607 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7608 apex {
7609 name: "myapex",
7610 key: "myapex.key",
7611 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007612 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007613 }
7614
7615 apex_key {
7616 name: "myapex.key",
7617 public_key: "testkey.avbpubkey",
7618 private_key: "testkey.pem",
7619 }
7620
7621 java_sdk_library_import {
7622 name: "foo",
7623 apex_available: ["myapex"],
7624 prefer: true,
7625 public: {
7626 jars: ["a.jar"],
7627 },
7628 }
7629
7630 `, withFiles(filesForSdkLibrary))
7631}
7632
atrost6e126252020-01-27 17:01:16 +00007633func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007634 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007635 result := android.GroupFixturePreparers(
7636 prepareForApexTest,
7637 java.PrepareForTestWithPlatformCompatConfig,
7638 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007639 apex {
7640 name: "myapex",
7641 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007642 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007643 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007644 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007645 }
7646
7647 apex_key {
7648 name: "myapex.key",
7649 public_key: "testkey.avbpubkey",
7650 private_key: "testkey.pem",
7651 }
7652
7653 platform_compat_config {
7654 name: "myjar-platform-compat-config",
7655 src: ":myjar",
7656 }
7657
7658 java_library {
7659 name: "myjar",
7660 srcs: ["foo/bar/MyClass.java"],
7661 sdk_version: "none",
7662 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007663 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007664 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007665 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007666
7667 // Make sure that a preferred prebuilt does not affect the apex contents.
7668 prebuilt_platform_compat_config {
7669 name: "myjar-platform-compat-config",
7670 metadata: "compat-config/metadata.xml",
7671 prefer: true,
7672 }
atrost6e126252020-01-27 17:01:16 +00007673 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007674 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007675 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007676 "etc/compatconfig/myjar-platform-compat-config.xml",
7677 "javalib/myjar.jar",
7678 })
7679}
7680
Jooyung Han862c0d62022-12-21 10:15:37 +09007681func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007682 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007683 android.GroupFixturePreparers(
7684 android.PrepareForTestWithAndroidBuildComponents,
7685 PrepareForTestWithApexBuildComponents,
7686 prepareForTestWithMyapex,
7687 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7688 ).
7689 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7690 RunTestWithBp(t, `
7691 apex {
7692 name: "myapex",
7693 key: "myapex.key",
7694 prebuilts: ["foo", "bar"],
7695 updatable: false,
7696 }
7697
7698 apex_key {
7699 name: "myapex.key",
7700 public_key: "testkey.avbpubkey",
7701 private_key: "testkey.pem",
7702 }
7703
7704 prebuilt_etc {
7705 name: "foo",
7706 src: "myprebuilt",
7707 filename_from_src: true,
7708 }
7709
7710 prebuilt_etc {
7711 name: "bar",
7712 src: "myprebuilt",
7713 filename_from_src: true,
7714 }
7715 `)
7716}
7717
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007718func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007719 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007720 bp := `
7721 apex {
7722 name: "myapex",
7723 key: "myapex.key",
7724 native_shared_libs: ["libfoo"],
7725 updatable: false,
7726 unwanted_transitive_deps: ["libbar"],
7727 }
7728
7729 apex_key {
7730 name: "myapex.key",
7731 public_key: "testkey.avbpubkey",
7732 private_key: "testkey.pem",
7733 }
7734
7735 cc_library {
7736 name: "libfoo",
7737 srcs: ["foo.cpp"],
7738 shared_libs: ["libbar"],
7739 apex_available: ["myapex"],
7740 }
7741
7742 cc_library {
7743 name: "libbar",
7744 srcs: ["bar.cpp"],
7745 apex_available: ["myapex"],
7746 }`
7747 ctx := testApex(t, bp)
7748 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7749 "*/libc++.so",
7750 "*/libfoo.so",
7751 // not libbar.so
7752 })
7753}
7754
Jiyong Park479321d2019-12-16 11:47:12 +09007755func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007756 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007757 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7758 apex {
7759 name: "myapex",
7760 key: "myapex.key",
7761 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007762 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007763 }
7764
7765 apex_key {
7766 name: "myapex.key",
7767 public_key: "testkey.avbpubkey",
7768 private_key: "testkey.pem",
7769 }
7770
7771 java_library {
7772 name: "myjar",
7773 srcs: ["foo/bar/MyClass.java"],
7774 sdk_version: "none",
7775 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007776 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007777 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007778 }
7779 `)
7780}
7781
Jiyong Park7cd10e32020-01-14 09:22:18 +09007782func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007783 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007784 bp := `
7785 apex {
7786 name: "myapex",
7787 key: "myapex.key",
7788 native_shared_libs: ["mylib"],
7789 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007790 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007791 }
7792
Jiyong Park9d677202020-02-19 16:29:35 +09007793 apex {
7794 name: "myapex.updatable",
7795 key: "myapex.key",
7796 native_shared_libs: ["mylib"],
7797 java_libs: ["myjar"],
7798 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007799 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007800 }
7801
Jiyong Park7cd10e32020-01-14 09:22:18 +09007802 apex_key {
7803 name: "myapex.key",
7804 public_key: "testkey.avbpubkey",
7805 private_key: "testkey.pem",
7806 }
7807
7808 cc_library {
7809 name: "mylib",
7810 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007811 shared_libs: [
7812 "myotherlib",
7813 "myotherlib_ext",
7814 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007815 system_shared_libs: [],
7816 stl: "none",
7817 apex_available: [
7818 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007819 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007820 "//apex_available:platform",
7821 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007822 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007823 }
7824
7825 cc_library {
7826 name: "myotherlib",
7827 srcs: ["mylib.cpp"],
7828 system_shared_libs: [],
7829 stl: "none",
7830 apex_available: [
7831 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007832 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007833 "//apex_available:platform",
7834 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007835 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007836 }
7837
Jiyong Parkce243632023-02-17 18:22:25 +09007838 cc_library {
7839 name: "myotherlib_ext",
7840 srcs: ["mylib.cpp"],
7841 system_shared_libs: [],
7842 system_ext_specific: true,
7843 stl: "none",
7844 apex_available: [
7845 "myapex",
7846 "myapex.updatable",
7847 "//apex_available:platform",
7848 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007849 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007850 }
7851
Jiyong Park7cd10e32020-01-14 09:22:18 +09007852 java_library {
7853 name: "myjar",
7854 srcs: ["foo/bar/MyClass.java"],
7855 sdk_version: "none",
7856 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007857 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007858 apex_available: [
7859 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007860 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007861 "//apex_available:platform",
7862 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007863 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08007864 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007865 }
7866
7867 java_library {
7868 name: "myotherjar",
7869 srcs: ["foo/bar/MyClass.java"],
7870 sdk_version: "none",
7871 system_modules: "none",
7872 apex_available: [
7873 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007874 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007875 "//apex_available:platform",
7876 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007877 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007878 }
7879 `
7880
7881 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
7882 for _, f := range files {
7883 if f.path == file {
7884 if f.isLink {
7885 t.Errorf("%q is not a real file", file)
7886 }
7887 return
7888 }
7889 }
7890 t.Errorf("%q is not found", file)
7891 }
7892
Jiyong Parkce243632023-02-17 18:22:25 +09007893 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09007894 for _, f := range files {
7895 if f.path == file {
7896 if !f.isLink {
7897 t.Errorf("%q is not a symlink", file)
7898 }
Jiyong Parkce243632023-02-17 18:22:25 +09007899 if f.src != target {
7900 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
7901 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09007902 return
7903 }
7904 }
7905 t.Errorf("%q is not found", file)
7906 }
7907
Jiyong Park9d677202020-02-19 16:29:35 +09007908 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
7909 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08007910 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09007911 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007912 ensureRealfileExists(t, files, "javalib/myjar.jar")
7913 ensureRealfileExists(t, files, "lib64/mylib.so")
7914 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007915 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007916
Jooyung Hana0503a52023-08-23 13:12:50 +09007917 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007918 ensureRealfileExists(t, files, "javalib/myjar.jar")
7919 ensureRealfileExists(t, files, "lib64/mylib.so")
7920 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007921 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09007922
7923 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08007924 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09007925 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09007926 ensureRealfileExists(t, files, "javalib/myjar.jar")
7927 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007928 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
7929 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09007930
Jooyung Hana0503a52023-08-23 13:12:50 +09007931 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09007932 ensureRealfileExists(t, files, "javalib/myjar.jar")
7933 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09007934 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
7935 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09007936}
7937
Yo Chiange8128052020-07-23 20:09:18 +08007938func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007939 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007940 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08007941 apex {
7942 name: "myapex",
7943 key: "myapex.key",
7944 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007945 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08007946 }
7947
7948 apex_key {
7949 name: "myapex.key",
7950 public_key: "testkey.avbpubkey",
7951 private_key: "testkey.pem",
7952 }
7953
7954 cc_library_shared {
7955 name: "mylib",
7956 srcs: ["mylib.cpp"],
7957 shared_libs: ["myotherlib"],
7958 system_shared_libs: [],
7959 stl: "none",
7960 apex_available: [
7961 "myapex",
7962 "//apex_available:platform",
7963 ],
7964 }
7965
7966 cc_prebuilt_library_shared {
7967 name: "myotherlib",
7968 srcs: ["prebuilt.so"],
7969 system_shared_libs: [],
7970 stl: "none",
7971 apex_available: [
7972 "myapex",
7973 "//apex_available:platform",
7974 ],
7975 }
7976 `)
7977
Jooyung Hana0503a52023-08-23 13:12:50 +09007978 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07007979 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08007980 var builder strings.Builder
7981 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
7982 androidMk := builder.String()
7983 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007984 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08007985 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
7986 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
7987 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09007988 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08007989}
7990
Jooyung Han643adc42020-02-27 13:50:06 +09007991func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007992 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007993 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09007994 apex {
7995 name: "myapex",
7996 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01007997 binaries: ["mybin"],
7998 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007999 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008000 }
8001
8002 apex_key {
8003 name: "myapex.key",
8004 public_key: "testkey.avbpubkey",
8005 private_key: "testkey.pem",
8006 }
8007
8008 cc_library {
8009 name: "mylib",
8010 srcs: ["mylib.cpp"],
8011 shared_libs: ["mylib2"],
8012 system_shared_libs: [],
8013 stl: "none",
8014 apex_available: [ "myapex" ],
8015 }
8016
8017 cc_library {
8018 name: "mylib2",
8019 srcs: ["mylib.cpp"],
8020 system_shared_libs: [],
8021 stl: "none",
8022 apex_available: [ "myapex" ],
8023 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008024
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008025 // Used as both a JNI library and a regular shared library.
8026 cc_library {
8027 name: "mylib3",
8028 srcs: ["mylib.cpp"],
8029 system_shared_libs: [],
8030 stl: "none",
8031 apex_available: [ "myapex" ],
8032 }
8033
8034 cc_binary {
8035 name: "mybin",
8036 srcs: ["mybin.cpp"],
8037 shared_libs: ["mylib3"],
8038 system_shared_libs: [],
8039 stl: "none",
8040 apex_available: [ "myapex" ],
8041 }
8042
Jiyong Park34d5c332022-02-24 18:02:44 +09008043 rust_ffi_shared {
8044 name: "libfoo.rust",
8045 crate_name: "foo",
8046 srcs: ["foo.rs"],
8047 shared_libs: ["libfoo.shared_from_rust"],
8048 prefer_rlib: true,
8049 apex_available: ["myapex"],
8050 }
8051
8052 cc_library_shared {
8053 name: "libfoo.shared_from_rust",
8054 srcs: ["mylib.cpp"],
8055 system_shared_libs: [],
8056 stl: "none",
8057 stubs: {
8058 versions: ["10", "11", "12"],
8059 },
8060 }
8061
Jooyung Han643adc42020-02-27 13:50:06 +09008062 `)
8063
Jooyung Hana0503a52023-08-23 13:12:50 +09008064 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008065 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008066 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008067 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008068 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008069 "lib64/mylib.so",
8070 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008071 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008072 "lib64/libfoo.rust.so",
8073 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8074 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008075 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008076
8077 // b/220397949
8078 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008079}
8080
Jooyung Han49f67012020-04-17 13:43:10 +09008081func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008082 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008083 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008084 apex {
8085 name: "myapex",
8086 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008087 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008088 }
8089 apex_key {
8090 name: "myapex.key",
8091 public_key: "testkey.avbpubkey",
8092 private_key: "testkey.pem",
8093 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008094 `,
8095 android.FixtureModifyConfig(func(config android.Config) {
8096 delete(config.Targets, android.Android)
8097 config.AndroidCommonTarget = android.Target{}
8098 }),
8099 )
Jooyung Han49f67012020-04-17 13:43:10 +09008100
8101 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8102 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8103 }
8104}
8105
Jiyong Parkbd159612020-02-28 15:22:21 +09008106func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008107 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008108 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008109 apex {
8110 name: "myapex",
8111 key: "myapex.key",
8112 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008113 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008114 }
8115
8116 apex_key {
8117 name: "myapex.key",
8118 public_key: "testkey.avbpubkey",
8119 private_key: "testkey.pem",
8120 }
8121
8122 android_app {
8123 name: "AppFoo",
8124 srcs: ["foo/bar/MyClass.java"],
8125 sdk_version: "none",
8126 system_modules: "none",
8127 apex_available: [ "myapex" ],
8128 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008129 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008130
Jooyung Hana0503a52023-08-23 13:12:50 +09008131 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008132 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008133
8134 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008135 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 +09008136}
8137
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008138func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008139 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008140 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008141 apex {
8142 name: "myapex",
8143 key: "myapex.key",
8144 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008145 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008146 }
8147
8148 apex_key {
8149 name: "myapex.key",
8150 public_key: "testkey.avbpubkey",
8151 private_key: "testkey.pem",
8152 }
8153
8154 android_app_set {
8155 name: "AppSet",
8156 set: "AppSet.apks",
8157 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008158 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008159 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008160 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008161 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8162 s := mod.Rule("apexRule").Args["copy_commands"]
8163 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008164 if len(copyCmds) != 4 {
8165 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008166 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008167 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8168 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008169 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8170 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008171
8172 // Ensure that canned_fs_config has an entry for the app set zip file
8173 generateFsRule := mod.Rule("generateFsConfig")
8174 cmd := generateFsRule.RuleParams.Command
8175 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008176}
8177
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008178func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008179 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008180 apex_set {
8181 name: "myapex",
8182 filename: "foo_v2.apex",
8183 sanitized: {
8184 none: { set: "myapex.apks", },
8185 hwaddress: { set: "myapex.hwasan.apks", },
8186 },
Paul Duffin24704672021-04-06 16:09:30 +01008187 }
8188 `
8189 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008190
Paul Duffin24704672021-04-06 16:09:30 +01008191 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008192 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008193
Spandan Das9d6e2092024-09-21 02:50:00 +00008194 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008195 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008196
Paul Duffin24704672021-04-06 16:09:30 +01008197 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8198
8199 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008200 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8201 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008202
8203 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008204}
8205
Pranav Guptaeba03b02022-09-27 00:27:08 +00008206func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008207 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008208 ctx := testApex(t, `
8209 apex_set {
8210 name: "myapex",
8211 set: ":myapex_apks_file",
8212 }
8213
8214 filegroup {
8215 name: "myapex_apks_file",
8216 srcs: ["myapex.apks"],
8217 }
8218 `)
8219
Spandan Das9d6e2092024-09-21 02:50:00 +00008220 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008221
8222 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008223 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008224 extractedApex := m.Output(extractorOutput)
8225
8226 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8227}
8228
Paul Duffin89f570a2021-06-16 01:42:33 +01008229func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008230 t.Helper()
8231
Paul Duffin55607122021-03-30 23:32:51 +01008232 fs := android.MockFS{
8233 "a.java": nil,
8234 "a.jar": nil,
8235 "apex_manifest.json": nil,
8236 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008237 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008238 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8239 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8240 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008241 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008242 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008243
Paul Duffin55607122021-03-30 23:32:51 +01008244 errorHandler := android.FixtureExpectsNoErrors
8245 if errmsg != "" {
8246 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008247 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008248
Paul Duffin55607122021-03-30 23:32:51 +01008249 result := android.GroupFixturePreparers(
8250 cc.PrepareForTestWithCcDefaultModules,
8251 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008252 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008253 java.PrepareForTestWithJavaSdkLibraryFiles,
8254 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008255 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008256 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008257 android.FixtureModifyMockFS(func(fs android.MockFS) {
8258 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8259 insert := ""
8260 for _, fragment := range fragments {
8261 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8262 }
8263 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8264 platform_bootclasspath {
8265 name: "platform-bootclasspath",
8266 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008267 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008268 %s
8269 ],
8270 }
8271 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008272 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008273 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008274 // Dexpreopt for boot jars requires the ART boot image profile.
8275 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8276 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008277 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008278 ).
8279 ExtendWithErrorHandler(errorHandler).
8280 RunTestWithBp(t, bp)
8281
8282 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008283}
8284
Jooyung Han548640b2020-04-27 12:10:30 +09008285func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008286 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008287 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8288 apex {
8289 name: "myapex",
8290 key: "myapex.key",
8291 updatable: true,
8292 }
8293
8294 apex_key {
8295 name: "myapex.key",
8296 public_key: "testkey.avbpubkey",
8297 private_key: "testkey.pem",
8298 }
8299 `)
8300}
8301
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008302func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008303 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008304 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8305 apex {
8306 name: "myapex",
8307 key: "myapex.key",
8308 }
8309
8310 apex_key {
8311 name: "myapex.key",
8312 public_key: "testkey.avbpubkey",
8313 private_key: "testkey.pem",
8314 }
8315 `)
8316}
8317
satayevb98371c2021-06-15 16:49:50 +01008318func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008319 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008320 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8321 apex {
8322 name: "myapex",
8323 key: "myapex.key",
8324 systemserverclasspath_fragments: [
8325 "mysystemserverclasspathfragment",
8326 ],
8327 min_sdk_version: "29",
8328 updatable: true,
8329 }
8330
8331 apex_key {
8332 name: "myapex.key",
8333 public_key: "testkey.avbpubkey",
8334 private_key: "testkey.pem",
8335 }
8336
8337 java_library {
8338 name: "foo",
8339 srcs: ["b.java"],
8340 min_sdk_version: "29",
8341 installable: true,
8342 apex_available: [
8343 "myapex",
8344 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008345 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008346 }
8347
8348 systemserverclasspath_fragment {
8349 name: "mysystemserverclasspathfragment",
8350 generate_classpaths_proto: false,
8351 contents: [
8352 "foo",
8353 ],
8354 apex_available: [
8355 "myapex",
8356 ],
8357 }
satayevabcd5972021-08-06 17:49:46 +01008358 `,
8359 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8360 )
satayevb98371c2021-06-15 16:49:50 +01008361}
8362
Paul Duffin064b70c2020-11-02 17:32:38 +00008363func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008364 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008365 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008366 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008367 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008368 fragment := java.ApexVariantReference{
8369 Apex: proptools.StringPtr("myapex"),
8370 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8371 }
8372
Paul Duffin064b70c2020-11-02 17:32:38 +00008373 testDexpreoptWithApexes(t, `
8374 prebuilt_apex {
8375 name: "myapex" ,
8376 arch: {
8377 arm64: {
8378 src: "myapex-arm64.apex",
8379 },
8380 arm: {
8381 src: "myapex-arm.apex",
8382 },
8383 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008384 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8385 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008386
Paul Duffin89f570a2021-06-16 01:42:33 +01008387 prebuilt_bootclasspath_fragment {
8388 name: "my-bootclasspath-fragment",
8389 contents: ["libfoo"],
8390 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008391 hidden_api: {
8392 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8393 metadata: "my-bootclasspath-fragment/metadata.csv",
8394 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008395 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8396 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8397 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008398 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008399 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008400
Spandan Das52c01a12024-09-20 01:09:48 +00008401 java_sdk_library_import {
8402 name: "libfoo",
8403 prefer: true,
8404 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008405 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008406 },
8407 apex_available: ["myapex"],
8408 shared_library: false,
8409 permitted_packages: ["libfoo"],
8410 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008411 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008412 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008413}
8414
Spandan Dasf14e2542021-11-12 00:01:37 +00008415func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008416 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008417 bp += `
8418 apex_key {
8419 name: "myapex.key",
8420 public_key: "testkey.avbpubkey",
8421 private_key: "testkey.pem",
8422 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008423 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008424 "lib1/src/A.java": nil,
8425 "lib2/src/B.java": nil,
8426 "system/sepolicy/apex/myapex-file_contexts": nil,
8427 }
8428
Paul Duffin45338f02021-03-30 23:07:52 +01008429 errorHandler := android.FixtureExpectsNoErrors
8430 if errmsg != "" {
8431 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008432 }
Colin Crossae8600b2020-10-29 17:09:13 -07008433
Paul Duffin45338f02021-03-30 23:07:52 +01008434 android.GroupFixturePreparers(
8435 android.PrepareForTestWithAndroidBuildComponents,
8436 java.PrepareForTestWithJavaBuildComponents,
8437 PrepareForTestWithApexBuildComponents,
8438 android.PrepareForTestWithNeverallowRules(rules),
8439 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008440 apexBootJars := make([]string, 0, len(bootJars))
8441 for _, apexBootJar := range bootJars {
8442 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008443 }
satayevd604b212021-07-21 14:23:52 +01008444 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008445 }),
8446 fs.AddToFixture(),
8447 ).
8448 ExtendWithErrorHandler(errorHandler).
8449 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008450}
8451
8452func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008453 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008454 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008455 name string
8456 expectedError string
8457 bp string
8458 bootJars []string
8459 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008460 }{
8461
8462 {
8463 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8464 expectedError: "",
8465 bp: `
8466 java_library {
8467 name: "bcp_lib1",
8468 srcs: ["lib1/src/*.java"],
8469 permitted_packages: ["foo.bar"],
8470 apex_available: ["myapex"],
8471 sdk_version: "none",
8472 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008473 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008474 }
8475 java_library {
8476 name: "nonbcp_lib2",
8477 srcs: ["lib2/src/*.java"],
8478 apex_available: ["myapex"],
8479 permitted_packages: ["a.b"],
8480 sdk_version: "none",
8481 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008482 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008483 }
8484 apex {
8485 name: "myapex",
8486 key: "myapex.key",
8487 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008488 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008489 }`,
8490 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008491 bcpPermittedPackages: map[string][]string{
8492 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008493 "foo.bar",
8494 },
8495 },
8496 },
8497 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008498 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008499 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 +01008500 bp: `
8501 java_library {
8502 name: "bcp_lib1",
8503 srcs: ["lib1/src/*.java"],
8504 apex_available: ["myapex"],
8505 permitted_packages: ["foo.bar"],
8506 sdk_version: "none",
8507 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008508 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008509 }
8510 java_library {
8511 name: "bcp_lib2",
8512 srcs: ["lib2/src/*.java"],
8513 apex_available: ["myapex"],
8514 permitted_packages: ["foo.bar", "bar.baz"],
8515 sdk_version: "none",
8516 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008517 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008518 }
8519 apex {
8520 name: "myapex",
8521 key: "myapex.key",
8522 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008523 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008524 }
8525 `,
8526 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008527 bcpPermittedPackages: map[string][]string{
8528 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008529 "foo.bar",
8530 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008531 "bcp_lib2": []string{
8532 "foo.bar",
8533 },
8534 },
8535 },
8536 {
8537 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8538 expectedError: "",
8539 bp: `
8540 java_library {
8541 name: "bcp_lib_restricted",
8542 srcs: ["lib1/src/*.java"],
8543 apex_available: ["myapex"],
8544 permitted_packages: ["foo.bar"],
8545 sdk_version: "none",
8546 min_sdk_version: "29",
8547 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008548 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008549 }
8550 java_library {
8551 name: "bcp_lib_unrestricted",
8552 srcs: ["lib2/src/*.java"],
8553 apex_available: ["myapex"],
8554 permitted_packages: ["foo.bar", "bar.baz"],
8555 sdk_version: "none",
8556 min_sdk_version: "29",
8557 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008558 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008559 }
8560 apex {
8561 name: "myapex",
8562 key: "myapex.key",
8563 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8564 updatable: true,
8565 min_sdk_version: "29",
8566 }
8567 `,
8568 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8569 bcpPermittedPackages: map[string][]string{
8570 "bcp_lib1_non_updateable": []string{
8571 "foo.bar",
8572 },
8573 // 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 +01008574 },
8575 },
8576 }
8577 for _, tc := range testcases {
8578 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008579 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008580 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8581 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008582 })
8583 }
8584}
8585
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008586// TODO(jungjw): Move this to proptools
8587func intPtr(i int) *int {
8588 return &i
8589}
8590
8591func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008592 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008593 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008594 apex_set {
8595 name: "myapex",
8596 set: "myapex.apks",
8597 filename: "foo_v2.apex",
8598 overrides: ["foo"],
8599 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008600 `,
8601 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8602 variables.Platform_sdk_version = intPtr(30)
8603 }),
8604 android.FixtureModifyConfig(func(config android.Config) {
8605 config.Targets[android.Android] = []android.Target{
8606 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8607 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8608 }
8609 }),
8610 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008611
Spandan Das9d6e2092024-09-21 02:50:00 +00008612 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008613
8614 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008615 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008616 actual := extractedApex.Args["abis"]
8617 expected := "ARMEABI_V7A,ARM64_V8A"
8618 if actual != expected {
8619 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8620 }
8621 actual = extractedApex.Args["sdk-version"]
8622 expected = "30"
8623 if actual != expected {
8624 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8625 }
8626
Paul Duffin6717d882021-06-15 19:09:41 +01008627 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008628 a := m.Module().(*ApexSet)
8629 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008630 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008631 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8632 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8633 }
8634}
8635
Anton Hansson805e0a52022-11-25 14:06:46 +00008636func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008637 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008638 ctx := testApex(t, `
8639 apex_set {
8640 name: "myapex",
8641 set: "myapex.apks",
8642 filename: "foo_v2.apex",
8643 overrides: ["foo"],
8644 }
8645 `,
8646 android.FixtureModifyConfig(func(config android.Config) {
8647 config.Targets[android.Android] = []android.Target{
8648 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8649 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8650 }
8651 }),
8652 )
8653
Spandan Das9d6e2092024-09-21 02:50:00 +00008654 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008655
8656 // Check extract_apks tool parameters. No native bridge arch expected
8657 extractedApex := m.Output("extracted/myapex.apks")
8658 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8659}
8660
Jiyong Park7d95a512020-05-10 15:16:24 +09008661func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008662 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008663 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8664 apex {
8665 name: "myapex",
8666 key: "myapex.key",
8667 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008668 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008669 }
8670
8671 apex_key {
8672 name: "myapex.key",
8673 public_key: "testkey.avbpubkey",
8674 private_key: "testkey.pem",
8675 }
8676
8677 cc_library {
8678 name: "mylib",
8679 srcs: ["mylib.cpp"],
8680 static_libs: ["otherlib"],
8681 system_shared_libs: [],
8682 stl: "none",
8683 apex_available: [ "myapex" ],
8684 }
8685
8686 cc_library {
8687 name: "otherlib",
8688 srcs: ["mylib.cpp"],
8689 system_shared_libs: [],
8690 stl: "none",
8691 stubs: {
8692 versions: ["1", "2", "3"],
8693 },
8694 apex_available: [ "myapex" ],
8695 }
8696 `)
8697}
8698
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008699func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008700 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008701 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008702 apex {
8703 name: "myapex",
8704 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008705 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008706 custom_sign_tool: "sign_myapex",
8707 }
8708
8709 apex_key {
8710 name: "myapex.key",
8711 public_key: "testkey.avbpubkey",
8712 private_key: "testkey.pem",
8713 }
8714 `)
8715
Jooyung Han286957d2023-10-30 16:17:56 +09008716 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008717 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008718 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 +09008719}
8720
8721func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008722 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008723 ctx := testApex(t, `
8724 apex {
8725 name: "myapex",
8726 key: "myapex.key",
8727 updatable: false,
8728 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008729 }
8730
8731 apex_key {
8732 name: "myapex.key",
8733 public_key: "testkey.avbpubkey",
8734 private_key: "testkey.pem",
8735 }
8736
8737 prebuilt_apex {
8738 name: "myapex",
8739 prefer: true,
8740 arch: {
8741 arm64: {
8742 src: "myapex-arm64.apex",
8743 },
8744 arm: {
8745 src: "myapex-arm.apex",
8746 },
8747 },
8748 }
8749
8750 apex_set {
8751 name: "myapex_set",
8752 set: "myapex.apks",
8753 filename: "myapex_set.apex",
8754 overrides: ["myapex"],
8755 }
8756 `)
8757
Colin Crossf61d03d2023-11-02 16:56:39 -07008758 content := android.ContentFromFileRuleForTests(t, ctx,
8759 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008760 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 -07008761 content = android.ContentFromFileRuleForTests(t, ctx,
8762 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008763 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 +09008764}
8765
Jooyung Han938b5932020-06-20 12:47:47 +09008766func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008767 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008768 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008769 apex {
8770 name: "myapex",
8771 key: "myapex.key",
8772 apps: ["app"],
8773 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008774 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008775 }
8776
8777 apex_key {
8778 name: "myapex.key",
8779 public_key: "testkey.avbpubkey",
8780 private_key: "testkey.pem",
8781 }
8782
8783 android_app {
8784 name: "app",
8785 srcs: ["foo/bar/MyClass.java"],
8786 package_name: "foo",
8787 sdk_version: "none",
8788 system_modules: "none",
8789 apex_available: [ "myapex" ],
8790 }
8791 `, withFiles(map[string][]byte{
8792 "sub/Android.bp": []byte(`
8793 override_apex {
8794 name: "override_myapex",
8795 base: "myapex",
8796 apps: ["override_app"],
8797 allowed_files: ":allowed",
8798 }
8799 // Overridable "path" property should be referenced indirectly
8800 filegroup {
8801 name: "allowed",
8802 srcs: ["allowed.txt"],
8803 }
8804 override_android_app {
8805 name: "override_app",
8806 base: "app",
8807 package_name: "bar",
8808 }
8809 `),
8810 }))
8811
Jooyung Hana0503a52023-08-23 13:12:50 +09008812 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008813 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8814 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8815 }
8816
Spandan Das50801e22024-05-13 18:29:45 +00008817 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008818 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8819 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8820 }
8821}
8822
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008823func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008824 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008825 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008826 apex {
8827 name: "myapex",
8828 key: "myapex.key",
8829 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008830 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008831 }
8832
8833 apex_key {
8834 name: "myapex.key",
8835 public_key: "testkey.avbpubkey",
8836 private_key: "testkey.pem",
8837 }
8838
8839 cc_library {
8840 name: "mylib",
8841 srcs: ["mylib.cpp"],
8842 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008843 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008844 },
8845 apex_available: ["myapex"],
8846 }
8847
8848 cc_prebuilt_library_shared {
8849 name: "mylib",
8850 prefer: false,
8851 srcs: ["prebuilt.so"],
8852 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008853 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008854 },
8855 apex_available: ["myapex"],
8856 }
8857 `)
8858}
8859
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008860func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008861 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008862 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008863 apex {
8864 name: "myapex",
8865 key: "myapex.key",
8866 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008867 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008868 }
8869 apex_key {
8870 name: "myapex.key",
8871 public_key: "testkey.avbpubkey",
8872 private_key: "testkey.pem",
8873 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008874 `,
8875 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8876 variables.CompressedApex = proptools.BoolPtr(true)
8877 }),
8878 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008879
Jooyung Hana0503a52023-08-23 13:12:50 +09008880 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008881 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
8882
Jooyung Hana0503a52023-08-23 13:12:50 +09008883 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008884 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
8885
8886 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09008887 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008888 ensureContains(t, ab.outputFile.String(), "myapex.capex")
8889
8890 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07008891 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008892 var builder strings.Builder
8893 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8894 androidMk := builder.String()
8895 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
8896}
8897
Jooyung Hana8fb73b2024-11-25 16:51:25 +09008898func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
8899 t.Parallel()
8900 ctx := testApex(t, `
8901 apex {
8902 name: "myapex",
8903 key: "myapex.key",
8904 compressible: true,
8905 updatable: false,
8906 payload_fs_type: "erofs",
8907 }
8908 apex_key {
8909 name: "myapex.key",
8910 public_key: "testkey.avbpubkey",
8911 private_key: "testkey.pem",
8912 }
8913 `,
8914 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8915 variables.CompressedApex = proptools.BoolPtr(true)
8916 }),
8917 )
8918
8919 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
8920 if compressRule.Rule != nil {
8921 t.Error("erofs apex should not be compressed")
8922 }
8923}
8924
Jooyung Han26ec8482024-07-31 15:04:05 +09008925func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008926 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09008927 for _, compressionEnabled := range []bool{true, false} {
8928 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008929 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09008930 ctx := testApex(t, `
8931 apex_set {
8932 name: "com.company.android.myapex",
8933 apex_name: "com.android.myapex",
8934 set: "company-myapex.apks",
8935 }
8936 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8937 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
8938 }),
8939 )
8940
8941 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
8942 if compressionEnabled {
8943 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
8944 } else {
8945 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
8946 }
8947 })
8948 }
8949}
8950
Martin Stjernholm2856c662020-12-02 15:03:42 +00008951func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008952 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008953 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00008954 apex {
8955 name: "myapex",
8956 key: "myapex.key",
8957 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008958 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00008959 }
8960
8961 apex_key {
8962 name: "myapex.key",
8963 public_key: "testkey.avbpubkey",
8964 private_key: "testkey.pem",
8965 }
8966
8967 cc_library {
8968 name: "mylib",
8969 srcs: ["mylib.cpp"],
8970 apex_available: ["myapex"],
8971 shared_libs: ["otherlib"],
8972 system_shared_libs: [],
8973 }
8974
8975 cc_library {
8976 name: "otherlib",
8977 srcs: ["mylib.cpp"],
8978 stubs: {
8979 versions: ["current"],
8980 },
8981 }
8982
8983 cc_prebuilt_library_shared {
8984 name: "otherlib",
8985 prefer: true,
8986 srcs: ["prebuilt.so"],
8987 stubs: {
8988 versions: ["current"],
8989 },
8990 }
8991 `)
8992
Jooyung Hana0503a52023-08-23 13:12:50 +09008993 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008994 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00008995 var builder strings.Builder
8996 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
8997 androidMk := builder.String()
8998
8999 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9000 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009001 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009002}
9003
Jiyong Parke3867542020-12-03 17:28:25 +09009004func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009005 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009006 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009007 apex {
9008 name: "myapex",
9009 key: "myapex.key",
9010 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009011 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009012 }
9013
9014 apex_key {
9015 name: "myapex.key",
9016 public_key: "testkey.avbpubkey",
9017 private_key: "testkey.pem",
9018 }
9019
9020 cc_library {
9021 name: "mylib",
9022 srcs: ["mylib.cpp"],
9023 system_shared_libs: [],
9024 stl: "none",
9025 apex_available: ["myapex"],
9026 shared_libs: ["mylib2"],
9027 target: {
9028 apex: {
9029 exclude_shared_libs: ["mylib2"],
9030 },
9031 },
9032 }
9033
9034 cc_library {
9035 name: "mylib2",
9036 srcs: ["mylib.cpp"],
9037 system_shared_libs: [],
9038 stl: "none",
9039 }
9040 `)
9041
9042 // Check if mylib is linked to mylib2 for the non-apex target
9043 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9044 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9045
9046 // Make sure that the link doesn't occur for the apex target
9047 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9048 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9049
9050 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009051 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009052 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9053}
9054
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009055func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009056 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009057 bpBase := `
9058 apex {
9059 name: "myapex",
9060 key: "myapex.key",
9061 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009062 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009063 }
9064 apex_key {
9065 name: "myapex.key",
9066 public_key: "testkey.avbpubkey",
9067 private_key: "testkey.pem",
9068 }
9069 cc_library {
9070 name: "mylib",
9071 srcs: ["mylib.cpp"],
9072 apex_available: ["myapex"],
9073 shared_libs: ["stublib"],
9074 system_shared_libs: [],
9075 }
9076 apex {
9077 name: "otherapex",
9078 enabled: %s,
9079 key: "myapex.key",
9080 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009081 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009082 }
9083 `
9084
9085 stublibSourceBp := `
9086 cc_library {
9087 name: "stublib",
9088 srcs: ["mylib.cpp"],
9089 apex_available: ["otherapex"],
9090 system_shared_libs: [],
9091 stl: "none",
9092 stubs: {
9093 versions: ["1"],
9094 },
9095 }
9096 `
9097
9098 stublibPrebuiltBp := `
9099 cc_prebuilt_library_shared {
9100 name: "stublib",
9101 srcs: ["prebuilt.so"],
9102 apex_available: ["otherapex"],
9103 stubs: {
9104 versions: ["1"],
9105 },
9106 %s
9107 }
9108 `
9109
9110 tests := []struct {
9111 name string
9112 stublibBp string
9113 usePrebuilt bool
9114 modNames []string // Modules to collect AndroidMkEntries for
9115 otherApexEnabled []string
9116 }{
9117 {
9118 name: "only_source",
9119 stublibBp: stublibSourceBp,
9120 usePrebuilt: false,
9121 modNames: []string{"stublib"},
9122 otherApexEnabled: []string{"true", "false"},
9123 },
9124 {
9125 name: "source_preferred",
9126 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9127 usePrebuilt: false,
9128 modNames: []string{"stublib", "prebuilt_stublib"},
9129 otherApexEnabled: []string{"true", "false"},
9130 },
9131 {
9132 name: "prebuilt_preferred",
9133 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9134 usePrebuilt: true,
9135 modNames: []string{"stublib", "prebuilt_stublib"},
9136 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9137 },
9138 {
9139 name: "only_prebuilt",
9140 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9141 usePrebuilt: true,
9142 modNames: []string{"stublib"},
9143 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9144 },
9145 }
9146
9147 for _, test := range tests {
9148 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009149 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009150 for _, otherApexEnabled := range test.otherApexEnabled {
9151 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009152 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009153 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009154
9155 type modAndMkEntries struct {
9156 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009157 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009158 }
9159 entries := []*modAndMkEntries{}
9160
9161 // Gather shared lib modules that are installable
9162 for _, modName := range test.modNames {
9163 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9164 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9165 continue
9166 }
9167 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009168 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009169 continue
9170 }
Yu Liue70976d2024-10-15 20:45:35 +00009171 info := android.AndroidMkInfoForTest(t, ctx, mod)
9172 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9173 ents = append(ents, info.ExtraInfo...)
9174 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009175 if ent.Disabled {
9176 continue
9177 }
9178 entries = append(entries, &modAndMkEntries{
9179 mod: mod,
9180 mkEntries: ent,
9181 })
9182 }
9183 }
9184 }
9185
9186 var entry *modAndMkEntries = nil
9187 for _, ent := range entries {
9188 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9189 if entry != nil {
9190 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9191 } else {
9192 entry = ent
9193 }
9194 }
9195 }
9196
9197 if entry == nil {
9198 t.Errorf("AndroidMk entry for \"stublib\" missing")
9199 } else {
9200 isPrebuilt := entry.mod.Prebuilt() != nil
9201 if isPrebuilt != test.usePrebuilt {
9202 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9203 }
9204 if !entry.mod.IsStubs() {
9205 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9206 }
9207 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9208 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9209 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009210 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009211 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009212 if !android.InList(expected, cflags) {
9213 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9214 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009215 }
9216 })
9217 }
9218 })
9219 }
9220}
9221
Colin Crossc33e5212021-05-25 18:16:02 -07009222func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009223 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009224 bp := `
9225 apex {
9226 name: "myapex",
9227 key: "myapex.key",
9228 java_libs: ["mylib"],
9229 bootclasspath_fragments: ["mybootclasspathfragment"],
9230 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9231 updatable: false,
9232 }
9233
9234 apex_key {
9235 name: "myapex.key",
9236 public_key: "testkey.avbpubkey",
9237 private_key: "testkey.pem",
9238 }
9239
9240 java_library {
9241 name: "mylib",
9242 srcs: ["mylib.java"],
9243 apex_available: ["myapex"],
9244 compile_dex: true,
9245 }
9246
9247 bootclasspath_fragment {
9248 name: "mybootclasspathfragment",
9249 contents: ["mybootclasspathlib"],
9250 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009251 hidden_api: {
9252 split_packages: ["*"],
9253 },
Colin Crossc33e5212021-05-25 18:16:02 -07009254 }
9255
9256 java_library {
9257 name: "mybootclasspathlib",
9258 srcs: ["mybootclasspathlib.java"],
9259 apex_available: ["myapex"],
9260 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009261 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009262 }
9263
9264 systemserverclasspath_fragment {
9265 name: "mysystemserverclasspathfragment",
9266 contents: ["mysystemserverclasspathlib"],
9267 apex_available: ["myapex"],
9268 }
9269
9270 java_library {
9271 name: "mysystemserverclasspathlib",
9272 srcs: ["mysystemserverclasspathlib.java"],
9273 apex_available: ["myapex"],
9274 compile_dex: true,
9275 }
9276 `
9277
9278 result := android.GroupFixturePreparers(
9279 PrepareForTestWithApexBuildComponents,
9280 prepareForTestWithMyapex,
9281 java.PrepareForTestWithJavaDefaultModules,
9282 android.PrepareForTestWithAndroidBuildComponents,
9283 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009284 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9285 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009286 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009287 ).RunTest(t)
9288
9289 // Make sure jacoco ran on both mylib and mybootclasspathlib
9290 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9291 t.Errorf("Failed to find jacoco rule for mylib")
9292 }
9293 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9294 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9295 }
9296 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9297 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9298 }
9299}
9300
Jiyong Park192600a2021-08-03 07:52:17 +00009301func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009302 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009303 testApexError(t, `executable mybin is static`, `
9304 apex {
9305 name: "myapex",
9306 key: "myapex.key",
9307 binaries: ["mybin"],
9308 min_sdk_version: "29",
9309 }
9310
9311 apex_key {
9312 name: "myapex.key",
9313 public_key: "testkey.avbpubkey",
9314 private_key: "testkey.pem",
9315 }
9316
9317 cc_binary {
9318 name: "mybin",
9319 srcs: ["mylib.cpp"],
9320 relative_install_path: "foo/bar",
9321 static_executable: true,
9322 system_shared_libs: [],
9323 stl: "none",
9324 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009325 min_sdk_version: "29",
9326 }
9327 `)
9328
9329 testApexError(t, `executable mybin.rust is static`, `
9330 apex {
9331 name: "myapex",
9332 key: "myapex.key",
9333 binaries: ["mybin.rust"],
9334 min_sdk_version: "29",
9335 }
9336
9337 apex_key {
9338 name: "myapex.key",
9339 public_key: "testkey.avbpubkey",
9340 private_key: "testkey.pem",
9341 }
9342
9343 rust_binary {
9344 name: "mybin.rust",
9345 srcs: ["foo.rs"],
9346 static_executable: true,
9347 apex_available: ["myapex"],
9348 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009349 }
9350 `)
9351}
9352
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009353func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009354 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009355 ctx := testApex(t, `
9356 apex {
9357 name: "myapex",
9358 key: "myapex.key",
9359 updatable: false,
9360 java_libs: ["foo"],
9361 }
9362
9363 apex_key {
9364 name: "myapex.key",
9365 public_key: "testkey.avbpubkey",
9366 private_key: "testkey.pem",
9367 }
9368
9369 java_library {
9370 name: "foo",
9371 srcs: ["foo.java"],
9372 apex_available: ["myapex"],
9373 installable: true,
9374 }
9375 `,
9376 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9377 )
9378
Jooyung Hana0503a52023-08-23 13:12:50 +09009379 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009380 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9381 var builder strings.Builder
9382 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9383 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009384 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009385}
9386
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009387func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009388 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009389 ctx := testApex(t, `
9390 apex {
9391 name: "myapex",
9392 key: "myapex.key",
9393 updatable: false,
9394 java_libs: ["foo"],
9395 required: ["otherapex"],
9396 }
9397
9398 apex {
9399 name: "otherapex",
9400 key: "myapex.key",
9401 updatable: false,
9402 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009403 }
9404
9405 apex_key {
9406 name: "myapex.key",
9407 public_key: "testkey.avbpubkey",
9408 private_key: "testkey.pem",
9409 }
9410
9411 java_library {
9412 name: "foo",
9413 srcs: ["foo.java"],
9414 apex_available: ["myapex", "otherapex"],
9415 installable: true,
9416 }
9417 `)
9418
Jooyung Hana0503a52023-08-23 13:12:50 +09009419 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009420 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9421 var builder strings.Builder
9422 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9423 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009424 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009425}
9426
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009427func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009428 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009429 ctx := testApex(t, `
9430 apex {
9431 name: "myapex",
9432 key: "myapex.key",
9433 updatable: false,
9434 }
9435
9436 apex_key {
9437 name: "myapex.key",
9438 public_key: "testkey.avbpubkey",
9439 private_key: "testkey.pem",
9440 }
9441 `)
9442
Jooyung Hana0503a52023-08-23 13:12:50 +09009443 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009444 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009445 data := android.AndroidMkDataForTest(t, ctx, bundle)
9446 var builder strings.Builder
9447 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9448 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009449 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009450}
9451
Jooyung Hana6d36672022-02-24 13:58:07 +09009452func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009453 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009454 for _, tc := range []struct {
9455 name string
9456 ref string
9457 expected_data []string
9458 }{
9459 {
9460 name: "test_using_output",
9461 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009462 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009463 },
9464 {
9465 name: "test_using_apex",
9466 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009467 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009468 },
9469 } {
9470 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009471 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009472 ctx := testApex(t, `
9473 apex {
9474 name: "myapex",
9475 key: "myapex.key",
9476 compressible: true,
9477 updatable: false,
9478 }
9479
9480 apex_key {
9481 name: "myapex.key",
9482 public_key: "testkey.avbpubkey",
9483 private_key: "testkey.pem",
9484 }
9485
9486 java_test {
9487 name: "`+tc.name+`",
9488 srcs: ["a.java"],
9489 data: ["`+tc.ref+`"],
9490 }
9491 `,
9492 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9493 variables.CompressedApex = proptools.BoolPtr(true)
9494 }))
9495 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9496 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9497 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9498 })
9499 }
9500}
9501
satayev758968a2021-12-06 11:42:40 +00009502func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009503 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009504 preparer := android.GroupFixturePreparers(
9505 PrepareForTestWithApexBuildComponents,
9506 prepareForTestWithMyapex,
9507 java.PrepareForTestWithJavaSdkLibraryFiles,
9508 java.PrepareForTestWithJavaDefaultModules,
9509 android.PrepareForTestWithAndroidBuildComponents,
9510 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9511 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9512 )
9513
9514 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9515 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009516 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009517 preparer.RunTestWithBp(t, `
9518 apex {
9519 name: "myapex",
9520 key: "myapex.key",
9521 bootclasspath_fragments: ["mybootclasspathfragment"],
9522 min_sdk_version: "30",
9523 updatable: false,
9524 }
9525
9526 apex_key {
9527 name: "myapex.key",
9528 public_key: "testkey.avbpubkey",
9529 private_key: "testkey.pem",
9530 }
9531
9532 bootclasspath_fragment {
9533 name: "mybootclasspathfragment",
9534 contents: ["mybootclasspathlib"],
9535 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009536 hidden_api: {
9537 split_packages: ["*"],
9538 },
satayev758968a2021-12-06 11:42:40 +00009539 }
9540
9541 java_sdk_library {
9542 name: "mybootclasspathlib",
9543 srcs: ["mybootclasspathlib.java"],
9544 apex_available: ["myapex"],
9545 compile_dex: true,
9546 unsafe_ignore_missing_latest_api: true,
9547 min_sdk_version: "31",
9548 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009549 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009550 }
9551
9552 java_library {
9553 name: "util",
9554 srcs: ["a.java"],
9555 apex_available: ["myapex"],
9556 min_sdk_version: "31",
9557 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009558 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009559 }
9560
9561 java_library {
9562 name: "another_util",
9563 srcs: ["a.java"],
9564 min_sdk_version: "31",
9565 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009566 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009567 }
9568 `)
9569 })
9570
9571 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9572 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009573 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009574 preparer.RunTestWithBp(t, `
9575 apex {
9576 name: "myapex",
9577 key: "myapex.key",
9578 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9579 min_sdk_version: "30",
9580 updatable: false,
9581 }
9582
9583 apex_key {
9584 name: "myapex.key",
9585 public_key: "testkey.avbpubkey",
9586 private_key: "testkey.pem",
9587 }
9588
9589 systemserverclasspath_fragment {
9590 name: "mysystemserverclasspathfragment",
9591 contents: ["mysystemserverclasspathlib"],
9592 apex_available: ["myapex"],
9593 }
9594
9595 java_sdk_library {
9596 name: "mysystemserverclasspathlib",
9597 srcs: ["mysystemserverclasspathlib.java"],
9598 apex_available: ["myapex"],
9599 compile_dex: true,
9600 min_sdk_version: "32",
9601 unsafe_ignore_missing_latest_api: true,
9602 static_libs: ["util"],
9603 }
9604
9605 java_library {
9606 name: "util",
9607 srcs: ["a.java"],
9608 apex_available: ["myapex"],
9609 min_sdk_version: "31",
9610 static_libs: ["another_util"],
9611 }
9612
9613 java_library {
9614 name: "another_util",
9615 srcs: ["a.java"],
9616 min_sdk_version: "31",
9617 apex_available: ["myapex"],
9618 }
9619 `)
9620 })
9621
9622 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009623 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009624 preparer.
satayev758968a2021-12-06 11:42:40 +00009625 RunTestWithBp(t, `
9626 apex {
9627 name: "myapex",
9628 key: "myapex.key",
9629 bootclasspath_fragments: ["mybootclasspathfragment"],
9630 min_sdk_version: "30",
9631 updatable: false,
9632 }
9633
9634 apex_key {
9635 name: "myapex.key",
9636 public_key: "testkey.avbpubkey",
9637 private_key: "testkey.pem",
9638 }
9639
9640 bootclasspath_fragment {
9641 name: "mybootclasspathfragment",
9642 contents: ["mybootclasspathlib"],
9643 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009644 hidden_api: {
9645 split_packages: ["*"],
9646 },
satayev758968a2021-12-06 11:42:40 +00009647 }
9648
9649 java_sdk_library {
9650 name: "mybootclasspathlib",
9651 srcs: ["mybootclasspathlib.java"],
9652 apex_available: ["myapex"],
9653 compile_dex: true,
9654 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009655 sdk_version: "current",
9656 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009657 }
9658 `)
9659 })
9660
9661 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009662 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009663 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9664 RunTestWithBp(t, `
9665 apex {
9666 name: "myapex",
9667 key: "myapex.key",
9668 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9669 min_sdk_version: "30",
9670 updatable: false,
9671 }
9672
9673 apex_key {
9674 name: "myapex.key",
9675 public_key: "testkey.avbpubkey",
9676 private_key: "testkey.pem",
9677 }
9678
9679 systemserverclasspath_fragment {
9680 name: "mysystemserverclasspathfragment",
9681 contents: ["mysystemserverclasspathlib"],
9682 apex_available: ["myapex"],
9683 }
9684
9685 java_sdk_library {
9686 name: "mysystemserverclasspathlib",
9687 srcs: ["mysystemserverclasspathlib.java"],
9688 apex_available: ["myapex"],
9689 compile_dex: true,
9690 unsafe_ignore_missing_latest_api: true,
9691 }
9692 `)
9693 })
9694}
9695
Jiakai Zhang6decef92022-01-12 17:56:19 +00009696// Verifies that the APEX depends on all the Make modules in the list.
9697func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9698 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9699 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009700 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009701 }
9702}
9703
9704// Verifies that the APEX does not depend on any of the Make modules in the list.
9705func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9706 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9707 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009708 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009709 }
9710}
9711
Cole Faust24e25c02024-01-19 14:12:17 -08009712func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009713 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009714 bpTemplate := `
9715 apex {
9716 name: "myapex",
9717 key: "myapex.key",
9718 java_libs: ["myjavalib"],
9719 updatable: %v,
9720 min_sdk_version: "29",
9721 }
9722 apex_key {
9723 name: "myapex.key",
9724 }
9725 java_library {
9726 name: "myjavalib",
9727 srcs: ["MyClass.java"],
9728 apex_available: [ "myapex" ],
9729 lint: {
9730 strict_updatability_linting: %v,
9731 %s
9732 },
9733 sdk_version: "current",
9734 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009735 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009736 }
9737 `
9738 fs := android.MockFS{
9739 "lint-baseline.xml": nil,
9740 }
9741
9742 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009743 testCaseName string
9744 apexUpdatable bool
9745 javaStrictUpdtabilityLint bool
9746 lintFileExists bool
9747 disallowedFlagExpectedOnApex bool
9748 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009749 }{
9750 {
Colin Cross87427352024-09-25 15:41:19 -07009751 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9752 apexUpdatable: true,
9753 javaStrictUpdtabilityLint: true,
9754 lintFileExists: false,
9755 disallowedFlagExpectedOnApex: false,
9756 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009757 },
9758 {
Colin Cross87427352024-09-25 15:41:19 -07009759 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9760 apexUpdatable: false,
9761 javaStrictUpdtabilityLint: false,
9762 lintFileExists: true,
9763 disallowedFlagExpectedOnApex: false,
9764 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009765 },
9766 {
Colin Cross87427352024-09-25 15:41:19 -07009767 testCaseName: "non-updatable apex respects strict updatability of javalib",
9768 apexUpdatable: false,
9769 javaStrictUpdtabilityLint: true,
9770 lintFileExists: true,
9771 disallowedFlagExpectedOnApex: false,
9772 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009773 },
9774 {
Colin Cross87427352024-09-25 15:41:19 -07009775 testCaseName: "updatable apex checks strict updatability of javalib",
9776 apexUpdatable: true,
9777 javaStrictUpdtabilityLint: false,
9778 lintFileExists: true,
9779 disallowedFlagExpectedOnApex: true,
9780 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009781 },
9782 }
9783
9784 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009785 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009786 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009787 fixtures := []android.FixturePreparer{}
9788 baselineProperty := ""
9789 if testCase.lintFileExists {
9790 fixtures = append(fixtures, fs.AddToFixture())
9791 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9792 }
9793 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009794
Colin Cross87427352024-09-25 15:41:19 -07009795 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009796
Colin Cross87427352024-09-25 15:41:19 -07009797 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9798 if expectStrictUpdatability {
9799 if m.Rule == nil {
9800 t.Errorf("expected strict updatability check rule on %s", name)
9801 } else {
9802 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9803 m.RuleParams.Command, "--disallowed_issues NewApi")
9804 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9805 m.Inputs.Strings(), "lint-baseline.xml")
9806 }
9807 } else {
9808 if m.Rule != nil {
9809 t.Errorf("expected no strict updatability check rule on %s", name)
9810 }
9811 }
9812 }
9813
9814 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9815 apex := result.ModuleForTests("myapex", "android_common_myapex")
9816 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9817 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9818
9819 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9820 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9821 })
Cole Faust24e25c02024-01-19 14:12:17 -08009822 }
9823}
9824
Cole Faust24e25c02024-01-19 14:12:17 -08009825// checks transtive deps of an apex coming from bootclasspath_fragment
9826func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009827 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009828 bp := `
9829 apex {
9830 name: "myapex",
9831 key: "myapex.key",
9832 bootclasspath_fragments: ["mybootclasspathfragment"],
9833 updatable: true,
9834 min_sdk_version: "29",
9835 }
9836 apex_key {
9837 name: "myapex.key",
9838 }
9839 bootclasspath_fragment {
9840 name: "mybootclasspathfragment",
9841 contents: ["myjavalib"],
9842 apex_available: ["myapex"],
9843 hidden_api: {
9844 split_packages: ["*"],
9845 },
9846 }
9847 java_library {
9848 name: "myjavalib",
9849 srcs: ["MyClass.java"],
9850 apex_available: [ "myapex" ],
9851 sdk_version: "current",
9852 min_sdk_version: "29",
9853 compile_dex: true,
9854 lint: {
9855 baseline_filename: "lint-baseline.xml",
9856 }
9857 }
9858 `
9859 fs := android.MockFS{
9860 "lint-baseline.xml": nil,
9861 }
9862
9863 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -07009864 apex := result.ModuleForTests("myapex", "android_common_myapex")
9865 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
9866 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
9867 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
9868 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
9869 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -08009870}
Spandan Das66773252022-01-15 00:23:18 +00009871
Jihoon Kang784c0052024-06-25 22:15:39 +00009872func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009873 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +00009874 bp := `
9875 apex {
9876 name: "myapex",
9877 key: "myapex.key",
9878 bootclasspath_fragments: ["mybootclasspathfragment"],
9879 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +00009880 java_libs: [
9881 "jacocoagent",
9882 ],
Jihoon Kang784c0052024-06-25 22:15:39 +00009883 }
9884 apex_key {
9885 name: "myapex.key",
9886 }
9887 bootclasspath_fragment {
9888 name: "mybootclasspathfragment",
9889 contents: ["foo"],
9890 apex_available: ["myapex"],
9891 hidden_api: {
9892 split_packages: ["*"],
9893 },
9894 }
9895 java_sdk_library {
9896 name: "foo",
9897 srcs: ["MyClass.java"],
9898 apex_available: [ "myapex" ],
9899 sdk_version: "current",
9900 min_sdk_version: "29",
9901 compile_dex: true,
9902 }
9903 `
9904 fs := android.MockFS{
9905 "lint-baseline.xml": nil,
9906 }
9907
9908 result := android.GroupFixturePreparers(
9909 prepareForApexTest,
9910 java.PrepareForTestWithJavaSdkLibraryFiles,
9911 java.PrepareForTestWithJacocoInstrumentation,
9912 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +00009913 android.FixtureMergeMockFs(fs),
9914 ).RunTestWithBp(t, bp)
9915
9916 myapex := result.ModuleForTests("myapex", "android_common_myapex")
9917 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
9918 android.AssertStringDoesContain(t,
9919 "myapex lint report expected to contain that of the sdk library impl lib as an input",
9920 lintReportInputs, "foo.impl")
9921}
9922
Spandan Das42e89502022-05-06 22:12:55 +00009923// updatable apexes should propagate updatable=true to its apps
9924func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009925 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +00009926 bp := `
9927 apex {
9928 name: "myapex",
9929 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -07009930 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +00009931 apps: [
9932 "myapp",
9933 ],
9934 min_sdk_version: "30",
9935 }
9936 apex_key {
9937 name: "myapex.key",
9938 }
9939 android_app {
9940 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +00009941 apex_available: [
9942 "myapex",
9943 ],
9944 sdk_version: "current",
9945 min_sdk_version: "30",
9946 }
9947 `
Colin Cross99939e92024-10-01 16:02:46 -07009948 _ = android.GroupFixturePreparers(
9949 prepareForApexTest,
9950 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
9951 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +00009952}
9953
Jingwen Chendea7a642023-03-28 11:30:50 +00009954func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009955 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +00009956 ctx := testApex(t, `
9957 apex {
9958 name: "myapex",
9959 key: "myapex.key",
9960 updatable: false,
9961 }
9962
9963 apex_key {
9964 name: "myapex.key",
9965 public_key: "testkey.avbpubkey",
9966 private_key: "testkey.pem",
9967 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009968 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009969 generateFsRule := mod.Rule("generateFsConfig")
9970 cmd := generateFsRule.RuleParams.Command
9971
9972 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
9973}
9974
9975func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009976 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +00009977 ctx := testApex(t, `
9978 apex {
9979 name: "myapex",
9980 key: "myapex.key",
9981 canned_fs_config: "my_config",
9982 updatable: false,
9983 }
9984
9985 apex_key {
9986 name: "myapex.key",
9987 public_key: "testkey.avbpubkey",
9988 private_key: "testkey.pem",
9989 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09009990 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +00009991 generateFsRule := mod.Rule("generateFsConfig")
9992 cmd := generateFsRule.RuleParams.Command
9993
9994 // Ensure that canned_fs_config has "cat my_config" at the end
9995 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
9996}
Spandan Das20fce2d2023-04-12 17:21:39 +00009997
9998func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009999 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010000 testCases := []struct {
10001 desc string
10002 hasStubs bool
10003 apexAvailable string
10004 expectedError string
10005 }{
10006 {
10007 desc: "non-stub library can have multiple apex_available",
10008 hasStubs: false,
10009 apexAvailable: `["myapex", "otherapex"]`,
10010 },
10011 {
10012 desc: "stub library should not be available to anyapex",
10013 hasStubs: true,
10014 apexAvailable: `["//apex_available:anyapex"]`,
10015 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10016 },
10017 {
10018 desc: "stub library should not be available to multiple apexes",
10019 hasStubs: true,
10020 apexAvailable: `["myapex", "otherapex"]`,
10021 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10022 },
10023 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010024 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 +000010025 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010026 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010027 },
10028 }
10029 bpTemplate := `
10030 cc_library {
10031 name: "libfoo",
10032 %v
10033 apex_available: %v,
10034 }
10035 apex {
10036 name: "myapex",
10037 key: "apex.key",
10038 updatable: false,
10039 native_shared_libs: ["libfoo"],
10040 }
10041 apex {
10042 name: "otherapex",
10043 key: "apex.key",
10044 updatable: false,
10045 }
10046 apex_test {
10047 name: "test_myapex",
10048 key: "apex.key",
10049 updatable: false,
10050 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010051 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010052 }
10053 apex_key {
10054 name: "apex.key",
10055 }
10056 `
10057 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010058 t.Run(tc.desc, func(t *testing.T) {
10059 stubs := ""
10060 if tc.hasStubs {
10061 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10062 }
10063 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10064 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10065 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10066 })
10067 if tc.expectedError == "" {
10068 testApex(t, bp, mockFsFixturePreparer)
10069 } else {
10070 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10071 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010072 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010073 }
10074}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010075
10076func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010077 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010078 context := android.GroupFixturePreparers(
10079 android.PrepareForIntegrationTestWithAndroid,
10080 cc.PrepareForIntegrationTestWithCc,
10081 PrepareForTestWithApexBuildComponents,
10082 prepareForTestWithMyapex,
10083 filesystem.PrepareForTestWithFilesystemBuildComponents,
10084 )
10085 result := context.RunTestWithBp(t, `
10086 android_system_image {
10087 name: "myfilesystem",
10088 deps: [
10089 "libfoo",
10090 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010091 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010092 gen_linker_config: true,
10093 linker_config_srcs: ["linker.config.json"],
10094 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010095 }
10096
10097 cc_library {
10098 name: "libfoo",
10099 shared_libs: [
10100 "libbar",
10101 ],
10102 stl: "none",
10103 }
10104
10105 cc_library {
10106 name: "libbar",
10107 stl: "none",
10108 apex_available: ["myapex"],
10109 }
10110
10111 apex {
10112 name: "myapex",
10113 native_shared_libs: ["libbar"],
10114 key: "myapex.key",
10115 updatable: false,
10116 }
10117
10118 apex_key {
10119 name: "myapex.key",
10120 public_key: "testkey.avbpubkey",
10121 private_key: "testkey.pem",
10122 }
10123 `)
10124
Cole Faust3b806d32024-03-11 15:15:03 -070010125 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010126 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10127 inputs.Strings(),
10128 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10129}
Yu Liueae7b362023-11-16 17:05:47 -080010130
10131var apex_default_bp = `
10132 apex_key {
10133 name: "myapex.key",
10134 public_key: "testkey.avbpubkey",
10135 private_key: "testkey.pem",
10136 }
10137
10138 filegroup {
10139 name: "myapex.manifest",
10140 srcs: ["apex_manifest.json"],
10141 }
10142
10143 filegroup {
10144 name: "myapex.androidmanifest",
10145 srcs: ["AndroidManifest.xml"],
10146 }
10147`
10148
10149func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010150 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010151 ctx := testApex(t, apex_default_bp+`
10152 apex {
10153 name: "myapex",
10154 manifest: ":myapex.manifest",
10155 androidManifest: ":myapex.androidmanifest",
10156 key: "myapex.key",
10157 java_libs: [
10158 "my_java_library_foo",
10159 "my_java_library_bar",
10160 ],
10161 updatable: false,
10162 }
10163
10164 java_library {
10165 name: "my_java_library_foo",
10166 srcs: ["foo/bar/MyClass.java"],
10167 sdk_version: "none",
10168 system_modules: "none",
10169 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010170 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010171 "myapex",
10172 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010173 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010174 }
10175
10176 java_library {
10177 name: "my_java_library_bar",
10178 srcs: ["foo/bar/MyClass.java"],
10179 sdk_version: "none",
10180 system_modules: "none",
10181 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010182 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010183 "myapex",
10184 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010185 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010186 }
10187
10188 aconfig_declarations {
10189 name: "my_aconfig_declarations_foo",
10190 package: "com.example.package",
10191 container: "myapex",
10192 srcs: ["foo.aconfig"],
10193 }
10194
10195 java_aconfig_library {
10196 name: "my_java_aconfig_library_foo",
10197 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010198 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010199 "myapex",
10200 ],
10201 }
10202
10203 aconfig_declarations {
10204 name: "my_aconfig_declarations_bar",
10205 package: "com.example.package",
10206 container: "myapex",
10207 srcs: ["bar.aconfig"],
10208 }
10209
10210 java_aconfig_library {
10211 name: "my_java_aconfig_library_bar",
10212 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010213 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010214 "myapex",
10215 ],
10216 }
10217 `)
10218
10219 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10220 s := mod.Rule("apexRule").Args["copy_commands"]
10221 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010222 if len(copyCmds) != 14 {
10223 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010224 }
10225
Jooyung Hana3fddf42024-09-03 13:22:21 +090010226 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10227 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10228 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10229 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010230 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010231
Yu Liubba555e2024-02-17 00:36:42 +000010232 inputs := []string{
10233 "my_aconfig_declarations_foo/intermediate.pb",
10234 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010235 }
Yu Liubba555e2024-02-17 00:36:42 +000010236 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10237 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10238 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10239 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010240 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010241}
10242
10243func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010244 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010245 ctx := testApex(t, apex_default_bp+`
10246 apex {
10247 name: "myapex",
10248 manifest: ":myapex.manifest",
10249 androidManifest: ":myapex.androidmanifest",
10250 key: "myapex.key",
10251 java_libs: [
10252 "my_java_library_foo",
10253 ],
10254 native_shared_libs: [
10255 "my_cc_library_bar",
10256 ],
10257 binaries: [
10258 "my_cc_binary_baz",
10259 ],
10260 updatable: false,
10261 }
10262
10263 java_library {
10264 name: "my_java_library_foo",
10265 srcs: ["foo/bar/MyClass.java"],
10266 sdk_version: "none",
10267 system_modules: "none",
10268 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010269 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010270 "myapex",
10271 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010272 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010273 }
10274
10275 cc_library {
10276 name: "my_cc_library_bar",
10277 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010278 static_libs: [
10279 "my_cc_aconfig_library_bar",
10280 "my_cc_aconfig_library_baz",
10281 ],
Yu Liueae7b362023-11-16 17:05:47 -080010282 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010283 "myapex",
10284 ],
10285 }
10286
10287 cc_binary {
10288 name: "my_cc_binary_baz",
10289 srcs: ["foo/bar/MyClass.cc"],
10290 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010291 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010292 "myapex",
10293 ],
10294 }
10295
10296 aconfig_declarations {
10297 name: "my_aconfig_declarations_foo",
10298 package: "com.example.package",
10299 container: "myapex",
10300 srcs: ["foo.aconfig"],
10301 }
10302
10303 java_aconfig_library {
10304 name: "my_java_aconfig_library_foo",
10305 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010306 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010307 "myapex",
10308 ],
10309 }
10310
10311 aconfig_declarations {
10312 name: "my_aconfig_declarations_bar",
10313 package: "com.example.package",
10314 container: "myapex",
10315 srcs: ["bar.aconfig"],
10316 }
10317
10318 cc_aconfig_library {
10319 name: "my_cc_aconfig_library_bar",
10320 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010321 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010322 "myapex",
10323 ],
10324 }
10325
10326 aconfig_declarations {
10327 name: "my_aconfig_declarations_baz",
10328 package: "com.example.package",
10329 container: "myapex",
10330 srcs: ["baz.aconfig"],
10331 }
10332
10333 cc_aconfig_library {
10334 name: "my_cc_aconfig_library_baz",
10335 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010336 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010337 "myapex",
10338 ],
10339 }
10340
10341 cc_library {
10342 name: "server_configurable_flags",
10343 srcs: ["server_configurable_flags.cc"],
10344 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010345 cc_library {
10346 name: "libbase",
10347 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010348 apex_available: [
10349 "myapex",
10350 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010351 }
10352 cc_library {
10353 name: "libaconfig_storage_read_api_cc",
10354 srcs: ["libaconfig_storage_read_api_cc.cc"],
10355 }
Yu Liueae7b362023-11-16 17:05:47 -080010356 `)
10357
10358 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10359 s := mod.Rule("apexRule").Args["copy_commands"]
10360 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010361 if len(copyCmds) != 18 {
10362 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010363 }
10364
Jooyung Hana3fddf42024-09-03 13:22:21 +090010365 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10366 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10367 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10368 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010369 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010370
Yu Liubba555e2024-02-17 00:36:42 +000010371 inputs := []string{
10372 "my_aconfig_declarations_foo/intermediate.pb",
10373 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10374 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010375 }
Yu Liubba555e2024-02-17 00:36:42 +000010376 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10377 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10378 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10379 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010380 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010381}
10382
Yu Liucec0e412023-11-30 16:45:50 -080010383func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010384 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010385 ctx := testApex(t, apex_default_bp+`
10386 apex {
10387 name: "myapex",
10388 manifest: ":myapex.manifest",
10389 androidManifest: ":myapex.androidmanifest",
10390 key: "myapex.key",
10391 native_shared_libs: [
10392 "libmy_rust_library",
10393 ],
10394 binaries: [
10395 "my_rust_binary",
10396 ],
10397 rust_dyn_libs: [
10398 "libmy_rust_dylib",
10399 ],
10400 updatable: false,
10401 }
10402
10403 rust_library {
10404 name: "libflags_rust", // test mock
10405 crate_name: "flags_rust",
10406 srcs: ["lib.rs"],
10407 apex_available: [
10408 "myapex",
10409 ],
10410 }
10411
10412 rust_library {
10413 name: "liblazy_static", // test mock
10414 crate_name: "lazy_static",
10415 srcs: ["src/lib.rs"],
10416 apex_available: [
10417 "myapex",
10418 ],
10419 }
10420
Ted Bauer02d475c2024-03-27 20:56:26 +000010421 rust_library {
10422 name: "libaconfig_storage_read_api", // test mock
10423 crate_name: "aconfig_storage_read_api",
10424 srcs: ["src/lib.rs"],
10425 apex_available: [
10426 "myapex",
10427 ],
10428 }
10429
Ted Bauer6ef40db2024-03-29 14:04:10 +000010430 rust_library {
10431 name: "liblogger", // test mock
10432 crate_name: "logger",
10433 srcs: ["src/lib.rs"],
10434 apex_available: [
10435 "myapex",
10436 ],
10437 }
10438
10439 rust_library {
10440 name: "liblog_rust", // test mock
10441 crate_name: "log_rust",
10442 srcs: ["src/lib.rs"],
10443 apex_available: [
10444 "myapex",
10445 ],
10446 }
10447
Yu Liucec0e412023-11-30 16:45:50 -080010448 rust_ffi_shared {
10449 name: "libmy_rust_library",
10450 srcs: ["src/lib.rs"],
10451 rustlibs: ["libmy_rust_aconfig_library_foo"],
10452 crate_name: "my_rust_library",
10453 apex_available: [
10454 "myapex",
10455 ],
10456 }
10457
10458 rust_library_dylib {
10459 name: "libmy_rust_dylib",
10460 srcs: ["foo/bar/MyClass.rs"],
10461 rustlibs: ["libmy_rust_aconfig_library_bar"],
10462 crate_name: "my_rust_dylib",
10463 apex_available: [
10464 "myapex",
10465 ],
10466 }
10467
10468 rust_binary {
10469 name: "my_rust_binary",
10470 srcs: ["foo/bar/MyClass.rs"],
10471 rustlibs: [
10472 "libmy_rust_aconfig_library_baz",
10473 "libmy_rust_dylib",
10474 ],
10475 apex_available: [
10476 "myapex",
10477 ],
10478 }
10479
10480 aconfig_declarations {
10481 name: "my_aconfig_declarations_foo",
10482 package: "com.example.package",
10483 container: "myapex",
10484 srcs: ["foo.aconfig"],
10485 }
10486
10487 aconfig_declarations {
10488 name: "my_aconfig_declarations_bar",
10489 package: "com.example.package",
10490 container: "myapex",
10491 srcs: ["bar.aconfig"],
10492 }
10493
10494 aconfig_declarations {
10495 name: "my_aconfig_declarations_baz",
10496 package: "com.example.package",
10497 container: "myapex",
10498 srcs: ["baz.aconfig"],
10499 }
10500
10501 rust_aconfig_library {
10502 name: "libmy_rust_aconfig_library_foo",
10503 aconfig_declarations: "my_aconfig_declarations_foo",
10504 crate_name: "my_rust_aconfig_library_foo",
10505 apex_available: [
10506 "myapex",
10507 ],
10508 }
10509
10510 rust_aconfig_library {
10511 name: "libmy_rust_aconfig_library_bar",
10512 aconfig_declarations: "my_aconfig_declarations_bar",
10513 crate_name: "my_rust_aconfig_library_bar",
10514 apex_available: [
10515 "myapex",
10516 ],
10517 }
10518
10519 rust_aconfig_library {
10520 name: "libmy_rust_aconfig_library_baz",
10521 aconfig_declarations: "my_aconfig_declarations_baz",
10522 crate_name: "my_rust_aconfig_library_baz",
10523 apex_available: [
10524 "myapex",
10525 ],
10526 }
10527 `)
10528
10529 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10530 s := mod.Rule("apexRule").Args["copy_commands"]
10531 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010532 if len(copyCmds) != 38 {
10533 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010534 }
10535
Jooyung Hana3fddf42024-09-03 13:22:21 +090010536 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10537 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10538 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10539 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010540 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010541
Yu Liubba555e2024-02-17 00:36:42 +000010542 inputs := []string{
10543 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010544 "my_aconfig_declarations_bar/intermediate.pb",
10545 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010546 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10547 }
10548 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10549 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10550 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10551 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010552 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010553}
10554
10555func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10556 aconfigRule := mod.Description(desc)
10557 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010558 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010559 if len(aconfigArgs) != len(inputs) {
10560 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010561 }
Yu Liucec0e412023-11-30 16:45:50 -080010562
Yu Liubba555e2024-02-17 00:36:42 +000010563 ensureEquals(t, container, aconfigRule.Args["container"])
10564 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10565
10566 buildParams := aconfigRule.BuildParams
10567 for _, input := range inputs {
10568 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10569 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010570 }
Yu Liubba555e2024-02-17 00:36:42 +000010571
10572 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010573}
10574
Yu Liueae7b362023-11-16 17:05:47 -080010575func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010576 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010577 ctx := testApex(t, apex_default_bp+`
10578 apex {
10579 name: "myapex",
10580 manifest: ":myapex.manifest",
10581 androidManifest: ":myapex.androidmanifest",
10582 key: "myapex.key",
10583 java_libs: [
10584 "my_java_library_foo",
10585 "other_java_library_bar",
10586 ],
10587 updatable: false,
10588 }
10589
10590 java_library {
10591 name: "my_java_library_foo",
10592 srcs: ["foo/bar/MyClass.java"],
10593 sdk_version: "none",
10594 system_modules: "none",
10595 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010596 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010597 "myapex",
10598 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010599 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010600 }
10601
10602 java_library {
10603 name: "other_java_library_bar",
10604 srcs: ["foo/bar/MyClass.java"],
10605 sdk_version: "none",
10606 system_modules: "none",
10607 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010608 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010609 "myapex",
10610 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010611 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010612 }
10613
10614 aconfig_declarations {
10615 name: "my_aconfig_declarations_foo",
10616 package: "com.example.package",
10617 container: "myapex",
10618 srcs: ["foo.aconfig"],
10619 }
10620
10621 java_aconfig_library {
10622 name: "my_java_aconfig_library_foo",
10623 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010624 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010625 "myapex",
10626 ],
10627 }
10628
10629 aconfig_declarations {
10630 name: "other_aconfig_declarations_bar",
10631 package: "com.example.package",
10632 container: "otherapex",
10633 srcs: ["bar.aconfig"],
10634 }
10635
10636 java_aconfig_library {
10637 name: "other_java_aconfig_library_bar",
10638 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010639 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010640 "myapex",
10641 ],
10642 }
10643 `)
10644
10645 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10646 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10647 s := " " + combineAconfigRule.Args["cache_files"]
10648 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10649 if len(aconfigArgs) != 1 {
10650 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10651 }
10652 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10653
10654 buildParams := combineAconfigRule.BuildParams
10655 if len(buildParams.Inputs) != 1 {
10656 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10657 }
10658 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10659 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10660}
10661
10662func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010663 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010664 ctx := testApex(t, apex_default_bp+`
10665 apex {
10666 name: "myapex",
10667 manifest: ":myapex.manifest",
10668 androidManifest: ":myapex.androidmanifest",
10669 key: "myapex.key",
10670 java_libs: [
10671 "my_java_library_foo",
10672 "my_java_library_bar",
10673 ],
10674 updatable: false,
10675 }
10676
10677 java_library {
10678 name: "my_java_library_foo",
10679 srcs: ["foo/bar/MyClass.java"],
10680 sdk_version: "none",
10681 system_modules: "none",
10682 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010683 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010684 "myapex",
10685 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010686 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010687 }
10688
10689 java_library {
10690 name: "my_java_library_bar",
10691 srcs: ["foo/bar/MyClass.java"],
10692 sdk_version: "none",
10693 system_modules: "none",
10694 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010695 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010696 "myapex",
10697 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010698 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010699 }
10700
10701 aconfig_declarations {
10702 name: "my_aconfig_declarations_foo",
10703 package: "com.example.package",
10704 container: "myapex",
10705 srcs: ["foo.aconfig"],
10706 }
10707
10708 java_aconfig_library {
10709 name: "my_java_aconfig_library_foo",
10710 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010711 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010712 "myapex",
10713 ],
10714 }
10715
10716 java_aconfig_library {
10717 name: "my_java_aconfig_library_bar",
10718 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010719 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010720 "myapex",
10721 ],
10722 }
10723 `)
10724
10725 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10726 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10727 s := " " + combineAconfigRule.Args["cache_files"]
10728 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10729 if len(aconfigArgs) != 1 {
10730 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10731 }
10732 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10733
10734 buildParams := combineAconfigRule.BuildParams
10735 if len(buildParams.Inputs) != 1 {
10736 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10737 }
10738 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10739 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10740}
Spandan Das5be63332023-12-13 00:06:32 +000010741
10742// Test that the boot jars come from the _selected_ apex prebuilt
10743// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10744func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010745 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010746 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10747 t.Helper()
10748 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10749 foundLibfooJar := false
10750 base := stem + ".jar"
10751 for _, output := range s.AllOutputs() {
10752 if filepath.Base(output) == base {
10753 foundLibfooJar = true
10754 buildRule := s.Output(output)
10755 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10756 }
10757 }
10758 if !foundLibfooJar {
10759 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10760 }
10761 }
10762
Spandan Das64c9e0c2023-12-20 20:13:34 +000010763 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10764 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10765 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10766 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10767 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10768 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)
10769 }
10770
10771 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10772 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10773 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10774 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10775 }
10776
Spandan Das5be63332023-12-13 00:06:32 +000010777 bp := `
10778 // Source APEX.
10779
10780 java_library {
10781 name: "framework-foo",
10782 srcs: ["foo.java"],
10783 installable: true,
10784 apex_available: [
10785 "com.android.foo",
10786 ],
10787 }
10788
10789 bootclasspath_fragment {
10790 name: "foo-bootclasspath-fragment",
10791 contents: ["framework-foo"],
10792 apex_available: [
10793 "com.android.foo",
10794 ],
10795 hidden_api: {
10796 split_packages: ["*"],
10797 },
10798 }
10799
10800 apex_key {
10801 name: "com.android.foo.key",
10802 public_key: "com.android.foo.avbpubkey",
10803 private_key: "com.android.foo.pem",
10804 }
10805
10806 apex {
10807 name: "com.android.foo",
10808 key: "com.android.foo.key",
10809 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10810 updatable: false,
10811 }
10812
10813 // Prebuilt APEX.
10814
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010815 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010816 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010817 public: {
10818 jars: ["foo.jar"],
10819 },
Spandan Das5be63332023-12-13 00:06:32 +000010820 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010821 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010822 }
10823
10824 prebuilt_bootclasspath_fragment {
10825 name: "foo-bootclasspath-fragment",
10826 contents: ["framework-foo"],
10827 hidden_api: {
10828 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10829 metadata: "my-bootclasspath-fragment/metadata.csv",
10830 index: "my-bootclasspath-fragment/index.csv",
10831 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10832 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10833 },
10834 apex_available: [
10835 "com.android.foo",
10836 ],
10837 }
10838
10839 prebuilt_apex {
10840 name: "com.android.foo",
10841 apex_name: "com.android.foo",
10842 src: "com.android.foo-arm.apex",
10843 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10844 }
10845
10846 // Another Prebuilt ART APEX
10847 prebuilt_apex {
10848 name: "com.android.foo.v2",
10849 apex_name: "com.android.foo", // Used to determine the API domain
10850 src: "com.android.foo-arm.apex",
10851 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10852 }
10853
10854 // APEX contribution modules
10855
10856 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010857 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010858 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010859 contents: ["com.android.foo"],
10860 }
10861
10862 apex_contributions {
10863 name: "foo.prebuilt.contributions",
10864 api_domain: "com.android.foo",
10865 contents: ["prebuilt_com.android.foo"],
10866 }
10867
10868 apex_contributions {
10869 name: "foo.prebuilt.v2.contributions",
10870 api_domain: "com.android.foo",
10871 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000010872 }
10873 `
10874
10875 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010876 desc string
10877 selectedApexContributions string
10878 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000010879 }{
10880 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010881 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
10882 selectedApexContributions: "foo.source.contributions",
10883 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000010884 },
10885 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010886 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
10887 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010888 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 +000010889 },
10890 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010891 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
10892 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000010893 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 +000010894 },
10895 }
10896
10897 fragment := java.ApexVariantReference{
10898 Apex: proptools.StringPtr("com.android.foo"),
10899 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
10900 }
10901
10902 for _, tc := range testCases {
10903 preparer := android.GroupFixturePreparers(
10904 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
10905 android.FixtureMergeMockFs(map[string][]byte{
10906 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
10907 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000010908 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
10909 // file creation.
10910 java.FixtureConfigureBootJars("platform:foo"),
10911 android.FixtureModifyMockFS(func(fs android.MockFS) {
10912 fs["platform/Android.bp"] = []byte(`
10913 java_library {
10914 name: "foo",
10915 srcs: ["Test.java"],
10916 compile_dex: true,
10917 }
10918 `)
10919 fs["platform/Test.java"] = nil
10920 }),
10921
Colin Crossa66b4632024-08-08 15:50:47 -070010922 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000010923 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010924 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000010925 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000010926 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
10927 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000010928 }
10929}
Spandan Das3576e762024-01-03 18:57:03 +000010930
10931// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
10932// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10933func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010934 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000010935 // for a mainline module family, check that only the flagged soong module is visible to make
10936 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
10937 variation := func(moduleName string) string {
10938 ret := "android_common_com.android.foo"
10939 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000010940 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000010941 }
10942 return ret
10943 }
10944
10945 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
10946 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
10947
10948 for _, hiddenModuleName := range hiddenModuleNames {
10949 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
10950 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
10951
10952 }
10953 }
10954
10955 bp := `
10956 apex_key {
10957 name: "com.android.foo.key",
10958 public_key: "com.android.foo.avbpubkey",
10959 private_key: "com.android.foo.pem",
10960 }
10961
10962 // AOSP source apex
10963 apex {
10964 name: "com.android.foo",
10965 key: "com.android.foo.key",
10966 updatable: false,
10967 }
10968
10969 // Google source apex
10970 override_apex {
10971 name: "com.google.android.foo",
10972 base: "com.android.foo",
10973 key: "com.android.foo.key",
10974 }
10975
10976 // Prebuilt Google APEX.
10977
10978 prebuilt_apex {
10979 name: "com.google.android.foo",
10980 apex_name: "com.android.foo",
10981 src: "com.android.foo-arm.apex",
10982 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10983 }
10984
10985 // Another Prebuilt Google APEX
10986 prebuilt_apex {
10987 name: "com.google.android.foo.v2",
10988 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000010989 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000010990 src: "com.android.foo-arm.apex",
10991 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
10992 }
10993
10994 // APEX contribution modules
10995
10996 apex_contributions {
10997 name: "foo.source.contributions",
10998 api_domain: "com.android.foo",
10999 contents: ["com.google.android.foo"],
11000 }
11001
11002 apex_contributions {
11003 name: "foo.prebuilt.contributions",
11004 api_domain: "com.android.foo",
11005 contents: ["prebuilt_com.google.android.foo"],
11006 }
11007
11008 apex_contributions {
11009 name: "foo.prebuilt.v2.contributions",
11010 api_domain: "com.android.foo",
11011 contents: ["prebuilt_com.google.android.foo.v2"],
11012 }
11013
11014 // This is an incompatible module because it selects multiple versions of the same mainline module
11015 apex_contributions {
11016 name: "foo.prebuilt.duplicate.contributions",
11017 api_domain: "com.android.foo",
11018 contents: [
11019 "prebuilt_com.google.android.foo",
11020 "prebuilt_com.google.android.foo.v2",
11021 ],
11022 }
11023 `
11024
11025 testCases := []struct {
11026 desc string
11027 selectedApexContributions string
11028 expectedVisibleModuleName string
11029 expectedHiddenModuleNames []string
11030 expectedError string
11031 }{
11032 {
11033 desc: "Source apex is selected, prebuilts should be hidden from make",
11034 selectedApexContributions: "foo.source.contributions",
11035 expectedVisibleModuleName: "com.google.android.foo",
11036 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11037 },
11038 {
11039 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11040 selectedApexContributions: "foo.prebuilt.contributions",
11041 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11042 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11043 },
11044 {
11045 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11046 selectedApexContributions: "foo.prebuilt.v2.contributions",
11047 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11048 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11049 },
11050 {
11051 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11052 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11053 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11054 },
11055 }
11056
11057 for _, tc := range testCases {
11058 preparer := android.GroupFixturePreparers(
11059 android.FixtureMergeMockFs(map[string][]byte{
11060 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11061 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011062 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011063 )
11064 if tc.expectedError != "" {
11065 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11066 testApex(t, bp, preparer)
11067 return
11068 }
11069 ctx := testApex(t, bp, preparer)
11070
Spandan Das3576e762024-01-03 18:57:03 +000011071 // Check that
11072 // 1. The contents of the selected apex_contributions are visible to make
11073 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11074 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11075 }
11076}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011077
Spandan Das85bd4622024-08-01 00:51:20 +000011078// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11079func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011080 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011081 // for a mainline module family, check that only the flagged soong module is visible to make
11082 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11083 variation := func(moduleName string) string {
11084 ret := "android_common_com.android.adservices"
11085 if moduleName == "com.google.android.foo" {
11086 ret = "android_common_com.google.android.foo_com.google.android.foo"
11087 }
11088 return ret
11089 }
11090
11091 for _, visibleModuleName := range visibleModuleNames {
11092 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11093 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11094 }
11095
11096 for _, hiddenModuleName := range hiddenModuleNames {
11097 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11098 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11099
11100 }
11101 }
11102
11103 bp := `
11104 apex_key {
11105 name: "com.android.adservices.key",
11106 public_key: "com.android.adservices.avbpubkey",
11107 private_key: "com.android.adservices.pem",
11108 }
11109
11110 // AOSP source apex
11111 apex {
11112 name: "com.android.adservices",
11113 key: "com.android.adservices.key",
11114 updatable: false,
11115 }
11116
11117 // Prebuilt Google APEX.
11118
11119 prebuilt_apex {
11120 name: "com.google.android.adservices",
11121 apex_name: "com.android.adservices",
11122 src: "com.android.foo-arm.apex",
11123 }
11124
11125 // Another Prebuilt Google APEX
11126 prebuilt_apex {
11127 name: "com.google.android.adservices.v2",
11128 apex_name: "com.android.adservices",
11129 src: "com.android.foo-arm.apex",
11130 }
11131
11132 // APEX contribution modules
11133
11134
11135 apex_contributions {
11136 name: "adservices.prebuilt.contributions",
11137 api_domain: "com.android.adservices",
11138 contents: ["prebuilt_com.google.android.adservices"],
11139 }
11140
11141 apex_contributions {
11142 name: "adservices.prebuilt.v2.contributions",
11143 api_domain: "com.android.adservices",
11144 contents: ["prebuilt_com.google.android.adservices.v2"],
11145 }
11146 `
11147
11148 testCases := []struct {
11149 desc string
11150 selectedApexContributions string
11151 expectedVisibleModuleNames []string
11152 expectedHiddenModuleNames []string
11153 }{
11154 {
11155 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11156 selectedApexContributions: "",
11157 expectedVisibleModuleNames: []string{"com.android.adservices"},
11158 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11159 },
11160 {
11161 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11162 selectedApexContributions: "adservices.prebuilt.contributions",
11163 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11164 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11165 },
11166 {
11167 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11168 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11169 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11170 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11171 },
11172 }
11173
11174 for _, tc := range testCases {
11175 preparer := android.GroupFixturePreparers(
11176 android.FixtureMergeMockFs(map[string][]byte{
11177 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11178 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011179 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011180 )
11181 ctx := testApex(t, bp, preparer)
11182
11183 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11184 }
11185}
11186
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011187func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011188 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011189 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11190 for _, moduleName := range moduleNames {
11191 ret += fmt.Sprintf(`
11192 aconfig_declarations {
11193 name: "%[1]s",
11194 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011195 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011196 srcs: [
11197 "%[1]s.aconfig",
11198 ],
11199 }
11200 java_aconfig_library {
11201 name: "%[1]s-lib",
11202 aconfig_declarations: "%[1]s",
11203 }
11204 `, moduleName)
11205 }
11206 return ret
11207 }
11208
11209 result := android.GroupFixturePreparers(
11210 prepareForApexTest,
11211 java.PrepareForTestWithJavaSdkLibraryFiles,
11212 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011213 ).RunTestWithBp(t, `
11214 java_library {
11215 name: "baz-java-lib",
11216 static_libs: [
11217 "baz-lib",
11218 ],
11219 }
11220 filegroup {
11221 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011222 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011223 ":qux-lib{.generated_srcjars}",
11224 ],
11225 }
11226 filegroup {
11227 name: "qux-another-filegroup",
11228 srcs: [
11229 ":qux-filegroup",
11230 ],
11231 }
11232 java_library {
11233 name: "quux-java-lib",
11234 srcs: [
11235 "a.java",
11236 ],
11237 libs: [
11238 "quux-lib",
11239 ],
11240 }
11241 java_sdk_library {
11242 name: "foo",
11243 srcs: [
11244 ":qux-another-filegroup",
11245 ],
11246 api_packages: ["foo"],
11247 system: {
11248 enabled: true,
11249 },
11250 module_lib: {
11251 enabled: true,
11252 },
11253 test: {
11254 enabled: true,
11255 },
11256 static_libs: [
11257 "bar-lib",
11258 ],
11259 libs: [
11260 "baz-java-lib",
11261 "quux-java-lib",
11262 ],
11263 aconfig_declarations: [
11264 "bar",
11265 ],
11266 }
11267 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11268
11269 m := result.ModuleForTests("foo.stubs.source", "android_common")
11270 outDir := "out/soong/.intermediates"
11271
11272 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11273 // textproto files
11274 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11275
11276 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11277 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11278 // to aconfig.
11279 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11280 "passed as an input",
11281 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11282
11283 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11284 // to metalava as classpath. Thus the cache file provided by the associated
11285 // aconfig_declarations module "baz" should be passed to aconfig.
11286 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11287 "java_aconfig_library passed as an input",
11288 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11289
11290 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11291 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11292 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11293 "input",
11294 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11295
11296 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11297 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11298 // aconfig_declarations module "quux" should not be passed to aconfig.
11299 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11300 "depend on java_aconfig_library not passed as an input",
11301 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11302}
Cole Faust7c991b42024-05-15 11:17:55 -070011303
11304func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011305 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011306 ctx := testApex(t, `
11307 apex {
11308 name: "myapex",
11309 key: "myapex.key",
11310 prebuilts: ["myetc", "myetc2"],
11311 min_sdk_version: "29",
11312 }
11313 apex_key {
11314 name: "myapex.key",
11315 public_key: "testkey.avbpubkey",
11316 private_key: "testkey.pem",
11317 }
11318
11319 prebuilt_etc {
11320 name: "myetc",
11321 src: "myprebuilt",
11322 filename: "myfilename",
11323 }
11324 prebuilt_etc {
11325 name: "myetc2",
11326 sub_dir: "mysubdir",
11327 src: "myprebuilt",
11328 filename: "myfilename",
11329 }
11330 `, withFiles(android.MockFS{
11331 "packages/modules/common/build/allowed_deps.txt": nil,
11332 }))
11333
11334 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11335 data := android.AndroidMkDataForTest(t, ctx, ab)
11336 var builder strings.Builder
11337 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11338 androidMk := builder.String()
11339
11340 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11341 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11342}
Spandan Das50801e22024-05-13 18:29:45 +000011343
11344func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011345 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011346 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11347 args := module.Rule("apexRule").Args
11348 optFlags := args["opt_flags"]
11349 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11350 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11351 }
11352 }
11353
11354 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11355 t.Helper()
11356 found := false
11357 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11358 if dep == wantDep {
11359 found = true
11360 }
11361 })
11362 if !found {
11363 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11364 }
11365 }
11366
11367 ctx := testApex(t, `
11368 apex {
11369 name: "com.android.apex30",
11370 min_sdk_version: "30",
11371 key: "apex30.key",
11372 java_libs: ["javalib"],
11373 }
11374
11375 java_library {
11376 name: "javalib",
11377 srcs: ["A.java"],
11378 apex_available: ["com.android.apex30"],
11379 min_sdk_version: "30",
11380 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011381 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011382 }
11383
11384 override_apex {
11385 name: "com.mycompany.android.apex30",
11386 base: "com.android.apex30",
11387 }
11388
11389 override_apex {
11390 name: "com.mycompany.android.apex31",
11391 base: "com.android.apex30",
11392 min_sdk_version: "31",
11393 }
11394
11395 apex_key {
11396 name: "apex30.key",
11397 public_key: "testkey.avbpubkey",
11398 private_key: "testkey.pem",
11399 }
11400
11401 `, android.FixtureMergeMockFs(android.MockFS{
11402 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11403 }),
11404 )
11405
11406 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11407 checkMinSdkVersion(t, baseModule, "30")
11408
11409 // Override module, but uses same min_sdk_version
11410 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11411 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11412 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11413 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11414
11415 // Override module, uses different min_sdk_version
11416 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11417 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11418 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11419 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11420}
Spandan Das0b28fa02024-05-28 23:40:17 +000011421
11422func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011423 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011424 context := android.GroupFixturePreparers(
11425 android.PrepareForIntegrationTestWithAndroid,
11426 PrepareForTestWithApexBuildComponents,
11427 android.FixtureMergeMockFs(android.MockFS{
11428 "system/sepolicy/apex/foo-file_contexts": nil,
11429 }),
11430 )
11431 res := context.RunTestWithBp(t, `
11432 apex {
11433 name: "foo",
11434 key: "myapex.key",
11435 apex_available_name: "com.android.foo",
11436 variant_version: "0",
11437 updatable: false,
11438 }
11439 apex_key {
11440 name: "myapex.key",
11441 public_key: "testkey.avbpubkey",
11442 private_key: "testkey.pem",
11443 }
11444 prebuilt_apex {
11445 name: "foo",
11446 src: "foo.apex",
11447 prefer: true,
11448 }
11449 override_apex {
11450 name: "myoverrideapex",
11451 base: "foo",
11452 }
11453 `)
11454
11455 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11456}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011457
11458func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011459 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011460 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`, `
11461 apex {
11462 name: "myapex",
11463 key: "myapex.key",
11464 updatable: true,
11465 min_sdk_version: "current",
11466 }
11467
11468 apex_key {
11469 name: "myapex.key",
11470 public_key: "testkey.avbpubkey",
11471 private_key: "testkey.pem",
11472 }
11473 `)
11474}
Spandan Das2f68f192024-07-22 19:25:50 +000011475
11476func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011477 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011478 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11479 result := android.GroupFixturePreparers(
11480 prepareForApexTest,
11481 android.PrepareForTestWithAndroidMk,
11482 android.PrepareForTestWithMakevars,
11483 android.FixtureMergeMockFs(fs),
11484 ).RunTest(t)
11485
11486 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011487 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011488
11489 installRules := result.InstallMakeRulesForTesting(t)
11490
11491 var installedlibRule *android.InstallMakeRule
11492 for i, rule := range installRules {
11493 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11494 if installedlibRule != nil {
11495 t.Errorf("Duplicate install rules for %s", rule.Target)
11496 }
11497 installedlibRule = &installRules[i]
11498 }
11499 }
11500 if installedlibRule == nil {
11501 t.Errorf("No install rule found for installedlib")
11502 return
11503 }
11504
11505 if expectLibfooOnSystemLib {
11506 android.AssertStringListContains(t,
11507 "installedlib doesn't have install dependency on libfoo impl",
11508 installedlibRule.OrderOnlyDeps,
11509 "out/target/product/test_device/system/lib/libfoo.so")
11510 } else {
11511 android.AssertStringListDoesNotContain(t,
11512 "installedlib has install dependency on libfoo stub",
11513 installedlibRule.Deps,
11514 "out/target/product/test_device/system/lib/libfoo.so")
11515 android.AssertStringListDoesNotContain(t,
11516 "installedlib has order-only install dependency on libfoo stub",
11517 installedlibRule.OrderOnlyDeps,
11518 "out/target/product/test_device/system/lib/libfoo.so")
11519 }
11520 }
11521
11522 prebuiltLibfooBp := []byte(`
11523 cc_prebuilt_library {
11524 name: "libfoo",
11525 prefer: true,
11526 srcs: ["libfoo.so"],
11527 stubs: {
11528 versions: ["1"],
11529 },
11530 apex_available: ["apexfoo"],
11531 }
11532 `)
11533
11534 apexfooBp := []byte(`
11535 apex {
11536 name: "apexfoo",
11537 key: "apexfoo.key",
11538 native_shared_libs: ["libfoo"],
11539 updatable: false,
11540 compile_multilib: "both",
11541 }
11542 apex_key {
11543 name: "apexfoo.key",
11544 public_key: "testkey.avbpubkey",
11545 private_key: "testkey.pem",
11546 }
11547 `)
11548
11549 installedlibBp := []byte(`
11550 cc_library {
11551 name: "installedlib",
11552 shared_libs: ["libfoo"],
11553 }
11554 `)
11555
11556 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011557 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011558 testFunc(
11559 t,
11560 /*expectLibfooOnSystemLib=*/ false,
11561 android.MockFS{
11562 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11563 "apexfoo/Android.bp": apexfooBp,
11564 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11565 "Android.bp": installedlibBp,
11566 },
11567 )
11568 })
11569
11570 disabledSourceLibfooBp := []byte(`
11571 cc_library {
11572 name: "libfoo",
11573 enabled: false,
11574 stubs: {
11575 versions: ["1"],
11576 },
11577 apex_available: ["apexfoo"],
11578 }
11579 `)
11580
11581 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011582 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011583 testFunc(
11584 t,
11585 /*expectLibfooOnSystemLib=*/ false,
11586 android.MockFS{
11587 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11588 "impl/Android.bp": disabledSourceLibfooBp,
11589 "apexfoo/Android.bp": apexfooBp,
11590 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11591 "Android.bp": installedlibBp,
11592 },
11593 )
11594 })
11595}
Jihoon Kange246bb72024-09-18 22:26:22 +000011596
11597func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011598 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011599 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11600 // in libs of android_app and java_library does not lead to class loader context device/host
11601 // path mismatch errors.
11602 android.GroupFixturePreparers(
11603 prepareForApexTest,
11604 android.PrepareForIntegrationTestWithAndroid,
11605 PrepareForTestWithApexBuildComponents,
11606 android.FixtureModifyEnv(func(env map[string]string) {
11607 env["DISABLE_CONTAINER_CHECK"] = "true"
11608 }),
11609 withFiles(filesForSdkLibrary),
11610 android.FixtureMergeMockFs(android.MockFS{
11611 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11612 }),
11613 ).RunTestWithBp(t, `
11614 apex {
11615 name: "com.android.foo30",
11616 key: "myapex.key",
11617 updatable: true,
11618 bootclasspath_fragments: [
11619 "foo-bootclasspath-fragment",
11620 ],
11621 java_libs: [
11622 "bar",
11623 ],
11624 apps: [
11625 "bar-app",
11626 ],
11627 min_sdk_version: "30",
11628 }
11629 apex_key {
11630 name: "myapex.key",
11631 public_key: "testkey.avbpubkey",
11632 private_key: "testkey.pem",
11633 }
11634 bootclasspath_fragment {
11635 name: "foo-bootclasspath-fragment",
11636 contents: [
11637 "framework-foo",
11638 ],
11639 apex_available: [
11640 "com.android.foo30",
11641 ],
11642 hidden_api: {
11643 split_packages: ["*"]
11644 },
11645 }
11646
11647 java_sdk_library {
11648 name: "framework-foo",
11649 srcs: [
11650 "A.java"
11651 ],
11652 unsafe_ignore_missing_latest_api: true,
11653 apex_available: [
11654 "com.android.foo30",
11655 ],
11656 compile_dex: true,
11657 sdk_version: "core_current",
11658 shared_library: false,
11659 }
11660
11661 java_library {
11662 name: "bar",
11663 srcs: [
11664 "A.java"
11665 ],
11666 libs: [
11667 "framework-foo.impl",
11668 ],
11669 apex_available: [
11670 "com.android.foo30",
11671 ],
11672 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011673 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011674 }
11675
11676 java_library {
11677 name: "baz",
11678 srcs: [
11679 "A.java"
11680 ],
11681 libs: [
11682 "bar",
11683 ],
11684 sdk_version: "core_current",
11685 }
11686
11687 android_app {
11688 name: "bar-app",
11689 srcs: [
11690 "A.java"
11691 ],
11692 libs: [
11693 "baz",
11694 "framework-foo.impl",
11695 ],
11696 apex_available: [
11697 "com.android.foo30",
11698 ],
11699 sdk_version: "core_current",
11700 min_sdk_version: "30",
11701 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011702 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011703 }
11704 `)
11705}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011706
11707// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11708func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011709 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011710 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11711 apex {
11712 name: "myapex",
11713 key: "myapex.key",
11714 systemserverclasspath_fragments: [
11715 "mysystemserverclasspathfragment",
11716 ],
11717 min_sdk_version: "29",
11718 updatable: true,
11719 system_ext_specific: true,
11720 }
11721
11722 apex_key {
11723 name: "myapex.key",
11724 public_key: "testkey.avbpubkey",
11725 private_key: "testkey.pem",
11726 }
11727
11728 java_library {
11729 name: "foo",
11730 srcs: ["b.java"],
11731 min_sdk_version: "29",
11732 installable: true,
11733 apex_available: [
11734 "myapex",
11735 ],
11736 sdk_version: "current",
11737 }
11738
11739 systemserverclasspath_fragment {
11740 name: "mysystemserverclasspathfragment",
11741 contents: [
11742 "foo",
11743 ],
11744 apex_available: [
11745 "myapex",
11746 ],
11747 }
11748 `,
11749 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11750 )
11751}
Spandan Das72d86c62024-10-15 19:27:41 +000011752
11753// partitions should not package the artifacts that are included inside the apex.
11754func TestFilesystemWithApexDeps(t *testing.T) {
11755 t.Parallel()
11756 result := testApex(t, `
11757 android_filesystem {
11758 name: "myfilesystem",
11759 deps: ["myapex"],
11760 }
11761 apex {
11762 name: "myapex",
11763 key: "myapex.key",
11764 binaries: ["binfoo"],
11765 native_shared_libs: ["libfoo"],
11766 apps: ["appfoo"],
11767 updatable: false,
11768 }
11769 apex_key {
11770 name: "myapex.key",
11771 }
11772 cc_binary {
11773 name: "binfoo",
11774 apex_available: ["myapex"],
11775 }
11776 cc_library {
11777 name: "libfoo",
11778 apex_available: ["myapex"],
11779 }
11780 android_app {
11781 name: "appfoo",
11782 sdk_version: "current",
11783 apex_available: ["myapex"],
11784 }
11785 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11786
11787 partition := result.ModuleForTests("myfilesystem", "android_common")
11788 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11789 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11790}
Colin Crossb614cd42024-10-11 12:52:21 -070011791
11792func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11793 t.Parallel()
11794
11795 extractDepenencyPathFromErrors := func(errs []error) []string {
11796 i := slices.IndexFunc(errs, func(err error) bool {
11797 return strings.Contains(err.Error(), "dependency path:")
11798 })
11799 if i < 0 {
11800 return nil
11801 }
11802 var dependencyPath []string
11803 for _, err := range errs[i+1:] {
11804 s := err.Error()
11805 lastSpace := strings.LastIndexByte(s, ' ')
11806 if lastSpace >= 0 {
11807 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11808 }
11809 }
11810 return dependencyPath
11811 }
11812
11813 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11814 return func(t *testing.T, result *android.TestResult) {
11815 t.Helper()
11816 if len(result.Errs) == 0 {
11817 t.Fatalf("expected errors")
11818 }
11819 t.Log("found errors:")
11820 for _, err := range result.Errs {
11821 t.Log(err)
11822 }
11823 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11824 t.Fatalf("expected error %q, got %q", w, g)
11825 }
11826 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11827 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11828 t.Errorf("expected dependency path %q, got %q", w, g)
11829 }
11830 }
11831 }
11832
11833 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11834 return func(bp *bpmodify.Blueprint) {
11835 m := bp.ModulesByName(module)
11836 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11837 if err != nil {
11838 panic(err)
11839 }
11840 props.AddStringToList(lib)
11841 }
11842 }
11843
11844 bpTemplate := `
11845 apex {
11846 name: "myapex",
11847 key: "myapex.key",
11848 native_shared_libs: ["mylib"],
11849 rust_dyn_libs: ["libmyrust"],
11850 binaries: ["mybin", "myrustbin"],
11851 jni_libs: ["libjni"],
11852 apps: ["myapp"],
11853 updatable: false,
11854 }
11855
11856 apex {
11857 name: "otherapex",
11858 key: "myapex.key",
11859 native_shared_libs: ["libotherapex"],
11860 updatable: false,
11861 }
11862
11863 apex_key {
11864 name: "myapex.key",
11865 public_key: "testkey.avbpubkey",
11866 private_key: "testkey.pem",
11867 }
11868
11869 cc_library {
11870 name: "mylib",
11871 srcs: ["foo.cpp"],
11872 apex_available: ["myapex"],
11873 }
11874
11875 cc_binary {
11876 name: "mybin",
11877 srcs: ["foo.cpp"],
11878 apex_available: ["myapex"],
11879 }
11880
11881 rust_library {
11882 name: "libmyrust",
11883 crate_name: "myrust",
11884 srcs: ["src/lib.rs"],
11885 rustlibs: ["libmyrust_transitive_dylib"],
11886 rlibs: ["libmyrust_transitive_rlib"],
11887 apex_available: ["myapex"],
11888 }
11889
11890 rust_library{
11891 name: "libmyrust_transitive_dylib",
11892 crate_name: "myrust_transitive_dylib",
11893 srcs: ["src/lib.rs"],
11894 apex_available: ["myapex"],
11895 }
11896
11897 rust_library {
11898 name: "libmyrust_transitive_rlib",
11899 crate_name: "myrust_transitive_rlib",
11900 srcs: ["src/lib.rs"],
11901 apex_available: ["myapex"],
11902 }
11903
11904 rust_binary {
11905 name: "myrustbin",
11906 srcs: ["src/main.rs"],
11907 apex_available: ["myapex"],
11908 }
11909
11910 cc_library {
11911 name: "libbar",
11912 sdk_version: "current",
11913 srcs: ["bar.cpp"],
11914 apex_available: ["myapex"],
11915 stl: "none",
11916 }
11917
11918 android_app {
11919 name: "myapp",
11920 jni_libs: ["libembeddedjni"],
11921 use_embedded_native_libs: true,
11922 sdk_version: "current",
11923 apex_available: ["myapex"],
11924 }
11925
11926 cc_library {
11927 name: "libembeddedjni",
11928 sdk_version: "current",
11929 srcs: ["bar.cpp"],
11930 apex_available: ["myapex"],
11931 stl: "none",
11932 }
11933
11934 cc_library {
11935 name: "libjni",
11936 sdk_version: "current",
11937 srcs: ["bar.cpp"],
11938 apex_available: ["myapex"],
11939 stl: "none",
11940 }
11941
11942 cc_library {
11943 name: "libotherapex",
11944 sdk_version: "current",
11945 srcs: ["otherapex.cpp"],
11946 apex_available: ["otherapex"],
11947 stubs: {
11948 symbol_file: "libotherapex.map.txt",
11949 versions: ["1", "2", "3"],
11950 },
11951 stl: "none",
11952 }
11953
11954 cc_library {
11955 name: "libplatform",
11956 sdk_version: "current",
11957 srcs: ["libplatform.cpp"],
11958 stubs: {
11959 symbol_file: "libplatform.map.txt",
11960 versions: ["1", "2", "3"],
11961 },
11962 stl: "none",
11963 system_shared_libs: [],
11964 }
11965 `
11966
11967 testCases := []struct {
11968 name string
11969 bpModifier func(bp *bpmodify.Blueprint)
11970 dependencyPath []string
11971 }{
11972 {
11973 name: "library dependency in other apex",
11974 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
11975 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
11976 },
11977 {
11978 name: "transitive library dependency in other apex",
11979 bpModifier: func(bp *bpmodify.Blueprint) {
11980 addToSharedLibs("mylib", "libbar")(bp)
11981 addToSharedLibs("libbar", "libotherapex#impl")(bp)
11982 },
11983 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
11984 },
11985 {
11986 name: "library dependency in platform",
11987 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
11988 dependencyPath: []string{"myapex", "mylib", "libplatform"},
11989 },
11990 {
11991 name: "jni library dependency in other apex",
11992 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
11993 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
11994 },
11995 {
11996 name: "transitive jni library dependency in other apex",
11997 bpModifier: func(bp *bpmodify.Blueprint) {
11998 addToSharedLibs("libjni", "libbar")(bp)
11999 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12000 },
12001 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12002 },
12003 {
12004 name: "jni library dependency in platform",
12005 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12006 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12007 },
12008 {
12009 name: "transitive jni library dependency in platform",
12010 bpModifier: func(bp *bpmodify.Blueprint) {
12011 addToSharedLibs("libjni", "libbar")(bp)
12012 addToSharedLibs("libbar", "libplatform#impl")(bp)
12013 },
12014 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12015 },
Spandan Das10c41362024-12-03 01:33:09 +000012016 {
12017 name: "app jni library dependency in other apex",
12018 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12019 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12020 },
12021 {
12022 name: "transitive app jni library dependency in other apex",
12023 bpModifier: func(bp *bpmodify.Blueprint) {
12024 addToSharedLibs("libembeddedjni", "libbar")(bp)
12025 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12026 },
12027 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12028 },
12029 {
12030 name: "app jni library dependency in platform",
12031 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12032 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12033 },
12034 {
12035 name: "transitive app jni library dependency in platform",
12036 bpModifier: func(bp *bpmodify.Blueprint) {
12037 addToSharedLibs("libembeddedjni", "libbar")(bp)
12038 addToSharedLibs("libbar", "libplatform#impl")(bp)
12039 },
12040 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12041 },
Colin Crossb614cd42024-10-11 12:52:21 -070012042 {
12043 name: "binary dependency in other apex",
12044 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12045 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12046 },
12047 {
12048 name: "transitive binary dependency in other apex",
12049 bpModifier: func(bp *bpmodify.Blueprint) {
12050 addToSharedLibs("mybin", "libbar")(bp)
12051 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12052 },
12053 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12054 },
12055 {
12056 name: "binary dependency in platform",
12057 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12058 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12059 },
12060 {
12061 name: "transitive binary dependency in platform",
12062 bpModifier: func(bp *bpmodify.Blueprint) {
12063 addToSharedLibs("mybin", "libbar")(bp)
12064 addToSharedLibs("libbar", "libplatform#impl")(bp)
12065 },
12066 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12067 },
12068
12069 {
12070 name: "rust library dependency in other apex",
12071 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12072 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12073 },
12074 {
12075 name: "transitive rust library dependency in other apex",
12076 bpModifier: func(bp *bpmodify.Blueprint) {
12077 addToSharedLibs("libmyrust", "libbar")(bp)
12078 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12079 },
12080 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12081 },
12082 {
12083 name: "rust library dependency in platform",
12084 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12085 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12086 },
12087 {
12088 name: "transitive rust library dependency in platform",
12089 bpModifier: func(bp *bpmodify.Blueprint) {
12090 addToSharedLibs("libmyrust", "libbar")(bp)
12091 addToSharedLibs("libbar", "libplatform#impl")(bp)
12092 },
12093 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12094 },
12095 {
12096 name: "transitive rust library dylib dependency in other apex",
12097 bpModifier: func(bp *bpmodify.Blueprint) {
12098 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12099 },
12100 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12101 },
12102 {
12103 name: "transitive rust library dylib dependency in platform",
12104 bpModifier: func(bp *bpmodify.Blueprint) {
12105 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12106 },
12107 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12108 },
12109 {
12110 name: "transitive rust library rlib dependency in other apex",
12111 bpModifier: func(bp *bpmodify.Blueprint) {
12112 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12113 },
12114 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12115 },
12116 {
12117 name: "transitive rust library rlib dependency in platform",
12118 bpModifier: func(bp *bpmodify.Blueprint) {
12119 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12120 },
12121 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12122 },
12123 {
12124 name: "rust binary dependency in other apex",
12125 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12126 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12127 },
12128 {
12129 name: "transitive rust binary dependency in other apex",
12130 bpModifier: func(bp *bpmodify.Blueprint) {
12131 addToSharedLibs("myrustbin", "libbar")(bp)
12132 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12133 },
12134 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12135 },
12136 {
12137 name: "rust binary dependency in platform",
12138 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12139 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12140 },
12141 {
12142 name: "transitive rust binary dependency in platform",
12143 bpModifier: func(bp *bpmodify.Blueprint) {
12144 addToSharedLibs("myrustbin", "libbar")(bp)
12145 addToSharedLibs("libbar", "libplatform#impl")(bp)
12146 },
12147 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12148 },
12149 }
12150
12151 for _, testCase := range testCases {
12152 t.Run(testCase.name, func(t *testing.T) {
12153 t.Parallel()
12154 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12155 if err != nil {
12156 t.Fatal(err)
12157 }
12158 if testCase.bpModifier != nil {
12159 func() {
12160 defer func() {
12161 if r := recover(); r != nil {
12162 t.Fatalf("panic in bpModifier: %v", r)
12163 }
12164 }()
12165 testCase.bpModifier(bp)
12166 }()
12167 }
12168 android.GroupFixturePreparers(
12169 android.PrepareForTestWithAndroidBuildComponents,
12170 cc.PrepareForTestWithCcBuildComponents,
12171 java.PrepareForTestWithDexpreopt,
12172 rust.PrepareForTestWithRustDefaultModules,
12173 PrepareForTestWithApexBuildComponents,
12174 prepareForTestWithMyapex,
12175 prepareForTestWithOtherapex,
12176 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12177 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12178 }),
12179 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12180 RunTestWithBp(t, bp.String())
12181 })
12182 }
12183}