blob: ffd0606e3f00dbcdf2c658b78704e033cc708710 [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",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000900 native_shared_libs: [
901 "mylib",
902 "mylib3",
903 "libmylib3_rs",
904 ],
Jiyong Park105dc322021-06-11 17:22:09 +0900905 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000906 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000918 shared_libs: [
919 "mylib2",
920 "mylib3#impl",
921 "libmylib2_rs",
922 "libmylib3_rs#impl",
923 "my_prebuilt_platform_lib",
924 "my_prebuilt_platform_stub_only_lib",
925 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926 system_shared_libs: [],
927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000928 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 }
930
931 cc_library {
932 name: "mylib2",
933 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900934 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 system_shared_libs: [],
936 stl: "none",
937 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000938 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 versions: ["1", "2", "3"],
940 },
941 }
942
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000943 rust_ffi {
944 name: "libmylib2_rs",
945 crate_name: "mylib2",
946 srcs: ["mylib.rs"],
947 stubs: {
948 symbol_file: "mylib2.map.txt",
949 versions: ["1", "2", "3"],
950 },
951 }
952
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 cc_library {
954 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900955 srcs: ["mylib.cpp"],
956 shared_libs: ["mylib4"],
957 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958 stl: "none",
959 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000960 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961 versions: ["10", "11", "12"],
962 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000963 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900965
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000966 rust_ffi {
967 name: "libmylib3_rs",
968 crate_name: "mylib3",
969 srcs: ["mylib.rs"],
970 shared_libs: ["mylib4.from_rust"],
971 stubs: {
972 symbol_file: "mylib3.map.txt",
973 versions: ["10", "11", "12"],
974 },
975 apex_available: [ "myapex" ],
976 }
977
Jiyong Park28d395a2018-12-07 22:42:47 +0900978 cc_library {
979 name: "mylib4",
980 srcs: ["mylib.cpp"],
981 system_shared_libs: [],
982 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000983 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900984 }
Jiyong Park105dc322021-06-11 17:22:09 +0900985
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000986 cc_library {
987 name: "mylib4.from_rust",
988 srcs: ["mylib.cpp"],
989 system_shared_libs: [],
990 stl: "none",
991 apex_available: [ "myapex" ],
992 }
993
Spandan Das357ffcc2024-07-24 18:07:48 +0000994 cc_prebuilt_library_shared {
995 name: "my_prebuilt_platform_lib",
996 stubs: {
997 symbol_file: "my_prebuilt_platform_lib.map.txt",
998 versions: ["1", "2", "3"],
999 },
1000 srcs: ["foo.so"],
1001 }
1002
1003 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
1004 cc_prebuilt_library_shared {
1005 name: "my_prebuilt_platform_stub_only_lib",
1006 stubs: {
1007 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
1008 versions: ["1", "2", "3"],
1009 }
1010 }
1011
Jiyong Park105dc322021-06-11 17:22:09 +09001012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001015 shared_libs: [
1016 "libfoo.shared_from_rust",
1017 "libfoo_rs.shared_from_rust",
1018 ],
Jiyong Park105dc322021-06-11 17:22:09 +09001019 prefer_rlib: true,
1020 apex_available: ["myapex"],
1021 }
1022
1023 cc_library_shared {
1024 name: "libfoo.shared_from_rust",
1025 srcs: ["mylib.cpp"],
1026 system_shared_libs: [],
1027 stl: "none",
1028 stubs: {
1029 versions: ["10", "11", "12"],
1030 },
1031 }
1032
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001033 rust_ffi {
1034 name: "libfoo_rs.shared_from_rust",
1035 crate_name: "foo_rs",
1036 srcs: ["mylib.rs"],
1037 stubs: {
1038 versions: ["10", "11", "12"],
1039 },
1040 }
1041
Jiyong Park25fc6a92018-11-18 18:02:45 +09001042 `)
1043
Jooyung Hana0503a52023-08-23 13:12:50 +09001044 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001045 copyCmds := apexRule.Args["copy_commands"]
1046
1047 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001048 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001049
1050 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001051 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001052 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001053
1054 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001055 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001056 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001057
Colin Crossaede88c2020-08-11 12:17:01 -07001058 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001059
1060 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001061 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001062 ensureContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001063 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001064 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001065 ensureNotContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001066
Colin Crossea91a172024-11-05 16:14:05 -08001067 // 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 -07001068 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001069 ensureContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_apex10000/unstripped/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001070 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001071 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001072 ensureNotContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_12/unstripped/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001073
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001074 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1075 // is replaced by sharing of "cFlags" in cc/builder.go.
1076 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1077 // module variable representing "cflags". So it was not detected by ensureNotContains.
1078 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1079 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1080 // including the original cflags's "-include mylib.h".
1081 //
Jiyong Park64379952018-12-13 18:37:29 +09001082 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001083 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1084 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001085
Jiyong Park85cc35a2022-07-17 11:30:47 +09001086 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1087 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001088 ensureContains(t, ctx.ModuleForTests("libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park85cc35a2022-07-17 11:30:47 +09001089 // Ensure that genstub for apex-provided lib is invoked with --apex
1090 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001091 ensureContains(t, ctx.ModuleForTests("libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001092
Jooyung Hana0503a52023-08-23 13:12:50 +09001093 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001094 "lib64/mylib.so",
1095 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001096 "lib64/libmylib3_rs.so",
Jooyung Han671f1ce2019-12-17 12:47:13 +09001097 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001098 "lib64/mylib4.from_rust.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001099 "bin/foo.rust",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001100
1101 "lib64/libstd.dylib.so", // implicit rust ffi dep
Jooyung Han671f1ce2019-12-17 12:47:13 +09001102 })
Jiyong Park105dc322021-06-11 17:22:09 +09001103
1104 // Ensure that stub dependency from a rust module is not included
1105 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001106 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001107 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001108 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001109 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001110 ensureContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001111 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001112 ensureNotContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001113
Jooyung Hana0503a52023-08-23 13:12:50 +09001114 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001115 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001116 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001117
1118 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1119 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1120 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1121 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1122 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1123 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1124
1125 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1126 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1127 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1128 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1129 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1130 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 +09001131}
1132
Jooyung Han20348752023-12-05 15:23:56 +09001133func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001134 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001135 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1136 apex {
1137 name: "myapex",
1138 key: "myapex.key",
1139 vendor: true,
1140 updatable: false,
1141 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1142 }
1143
1144 apex_key {
1145 name: "myapex.key",
1146 public_key: "testkey.avbpubkey",
1147 private_key: "testkey.pem",
1148 }
1149
1150 cc_library {
1151 name: "libbar",
1152 srcs: ["mylib.cpp"],
1153 llndk: {
1154 symbol_file: "libbar.map.txt",
1155 }
1156 }
1157 `)
1158}
1159
Jiyong Park1bc84122021-06-22 20:23:05 +09001160func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001161 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001162 ctx := testApex(t, `
1163 apex {
1164 name: "myapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["mylib"],
1167 binaries: ["foo.rust"],
1168 updatable: false,
1169 platform_apis: true,
1170 }
1171
1172 apex_key {
1173 name: "myapex.key",
1174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 cc_library {
1179 name: "mylib",
1180 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001181 shared_libs: [
1182 "mylib2",
1183 "libmylib2_rust"
1184 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001185 system_shared_libs: [],
1186 stl: "none",
1187 apex_available: [ "myapex" ],
1188 }
1189
1190 cc_library {
1191 name: "mylib2",
1192 srcs: ["mylib.cpp"],
1193 cflags: ["-include mylib.h"],
1194 system_shared_libs: [],
1195 stl: "none",
1196 stubs: {
1197 versions: ["1", "2", "3"],
1198 },
1199 }
1200
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001201 rust_ffi {
1202 name: "libmylib2_rust",
1203 crate_name: "mylib2_rust",
1204 srcs: ["mylib.rs"],
1205 stubs: {
1206 versions: ["1", "2", "3"],
1207 },
1208 }
1209
Jiyong Park1bc84122021-06-22 20:23:05 +09001210 rust_binary {
1211 name: "foo.rust",
1212 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001213 shared_libs: [
1214 "libfoo.shared_from_rust",
1215 "libmylib_rust.shared_from_rust"
1216 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001217 prefer_rlib: true,
1218 apex_available: ["myapex"],
1219 }
1220
1221 cc_library_shared {
1222 name: "libfoo.shared_from_rust",
1223 srcs: ["mylib.cpp"],
1224 system_shared_libs: [],
1225 stl: "none",
1226 stubs: {
1227 versions: ["10", "11", "12"],
1228 },
1229 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001230 rust_ffi {
1231 name: "libmylib_rust.shared_from_rust",
1232 crate_name: "mylib_rust",
1233 srcs: ["mylib.rs"],
1234 stubs: {
1235 versions: ["1", "2", "3"],
1236 },
1237 }
1238
Jiyong Park1bc84122021-06-22 20:23:05 +09001239 `)
1240
Jooyung Hana0503a52023-08-23 13:12:50 +09001241 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001242 copyCmds := apexRule.Args["copy_commands"]
1243
1244 // Ensure that indirect stubs dep is not included
1245 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001246 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.so")
1247 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001248 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1249
1250 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1251 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001252 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001253 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1254 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001255 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
1256 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001257 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001258 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1259 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001260 ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so")
1261 ensureContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001262}
1263
Colin Cross7812fd32020-09-25 12:35:10 -07001264func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1265 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001266 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001267 apex {
1268 name: "myapex",
1269 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001270 native_shared_libs: [
1271 "mylib",
1272 "mylib3",
1273 "libmylib3_rust",
1274 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001275 min_sdk_version: "29",
1276 }
1277
1278 apex_key {
1279 name: "myapex.key",
1280 public_key: "testkey.avbpubkey",
1281 private_key: "testkey.pem",
1282 }
1283
1284 cc_library {
1285 name: "mylib",
1286 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001287 shared_libs: [
1288 "mylib2",
1289 "mylib3#impl",
1290 "libmylib2_rust",
1291 "libmylib3_rust#impl",
1292 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001293 system_shared_libs: [],
1294 stl: "none",
1295 apex_available: [ "myapex" ],
1296 min_sdk_version: "28",
1297 }
1298
1299 cc_library {
1300 name: "mylib2",
1301 srcs: ["mylib.cpp"],
1302 cflags: ["-include mylib.h"],
1303 system_shared_libs: [],
1304 stl: "none",
1305 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001306 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001307 versions: ["28", "29", "30", "current"],
1308 },
1309 min_sdk_version: "28",
1310 }
1311
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001312 rust_ffi {
1313 name: "libmylib2_rust",
1314 crate_name: "mylib2_rust",
1315 srcs: ["mylib.rs"],
1316 stubs: {
1317 symbol_file: "mylib2.map.txt",
1318 versions: ["28", "29", "30", "current"],
1319 },
1320 min_sdk_version: "28",
1321 }
1322
Colin Cross7812fd32020-09-25 12:35:10 -07001323 cc_library {
1324 name: "mylib3",
1325 srcs: ["mylib.cpp"],
1326 shared_libs: ["mylib4"],
1327 system_shared_libs: [],
1328 stl: "none",
1329 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001330 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001331 versions: ["28", "29", "30", "current"],
1332 },
1333 apex_available: [ "myapex" ],
1334 min_sdk_version: "28",
1335 }
1336
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001337 rust_ffi {
1338 name: "libmylib3_rust",
1339 crate_name: "mylib3_rust",
1340 srcs: ["mylib.rs"],
1341 shared_libs: ["libmylib4.from_rust"],
1342 stubs: {
1343 symbol_file: "mylib3.map.txt",
1344 versions: ["28", "29", "30", "current"],
1345 },
1346 apex_available: [ "myapex" ],
1347 min_sdk_version: "28",
1348 }
1349
Colin Cross7812fd32020-09-25 12:35:10 -07001350 cc_library {
1351 name: "mylib4",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
1355 apex_available: [ "myapex" ],
1356 min_sdk_version: "28",
1357 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001358
1359 rust_ffi {
1360 name: "libmylib4.from_rust",
1361 crate_name: "mylib4",
1362 srcs: ["mylib.rs"],
1363 apex_available: [ "myapex" ],
1364 min_sdk_version: "28",
1365 }
Colin Cross7812fd32020-09-25 12:35:10 -07001366 `)
1367
Jooyung Hana0503a52023-08-23 13:12:50 +09001368 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001369 copyCmds := apexRule.Args["copy_commands"]
1370
1371 // Ensure that direct non-stubs dep is always included
1372 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001373 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1374 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001375
1376 // Ensure that indirect stubs dep is not included
1377 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001378 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001379
1380 // Ensure that direct stubs dep is included
1381 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1382
1383 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1384
Jiyong Park55549df2021-02-26 23:57:23 +09001385 // Ensure that mylib is linking with the latest version of stub for mylib2
1386 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001387 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001388 // ... and not linking to the non-stub (impl) variant of mylib2
1389 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001390 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001391
Colin Crossea91a172024-11-05 16:14:05 -08001392 // 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 -07001393 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001394 ensureContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_apex29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001395 // .. and not linking to the stubs variant of mylib3
1396 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001397 ensureNotContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001398
1399 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001400 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001401 ensureNotContains(t, mylib2Cflags, "-include ")
1402
Jiyong Park85cc35a2022-07-17 11:30:47 +09001403 // Ensure that genstub is invoked with --systemapi
1404 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001405 ensureContains(t, ctx.ModuleForTests("libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001406
Jooyung Hana0503a52023-08-23 13:12:50 +09001407 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001408 "lib64/mylib.so",
1409 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001410 "lib64/libmylib3_rust.so",
Colin Cross7812fd32020-09-25 12:35:10 -07001411 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001412 "lib64/libmylib4.from_rust.so",
1413
1414 "lib64/libstd.dylib.so", // by the implicit dependency from foo.rust
Colin Cross7812fd32020-09-25 12:35:10 -07001415 })
1416}
1417
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001418func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1419 t.Parallel()
1420 // myapex (Z)
1421 // mylib -----------------.
1422 // |
1423 // otherapex (29) |
1424 // libstub's versions: 29 Z current
1425 // |
1426 // <platform> |
1427 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001428 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001429 apex {
1430 name: "myapex",
1431 key: "myapex.key",
1432 native_shared_libs: ["mylib"],
1433 min_sdk_version: "Z", // non-final
1434 }
1435
1436 cc_library {
1437 name: "mylib",
1438 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001439 shared_libs: [
1440 "libstub",
1441 "libstub_rust",
1442 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001443 apex_available: ["myapex"],
1444 min_sdk_version: "Z",
1445 }
1446
1447 apex_key {
1448 name: "myapex.key",
1449 public_key: "testkey.avbpubkey",
1450 private_key: "testkey.pem",
1451 }
1452
1453 apex {
1454 name: "otherapex",
1455 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001456 native_shared_libs: [
1457 "libstub",
1458 "libstub_rust",
1459 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001460 min_sdk_version: "29",
1461 }
1462
1463 cc_library {
1464 name: "libstub",
1465 srcs: ["mylib.cpp"],
1466 stubs: {
1467 versions: ["29", "Z", "current"],
1468 },
1469 apex_available: ["otherapex"],
1470 min_sdk_version: "29",
1471 }
1472
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001473 rust_ffi {
1474 name: "libstub_rust",
1475 crate_name: "stub_rust",
1476 srcs: ["mylib.rs"],
1477 stubs: {
1478 versions: ["29", "Z", "current"],
1479 },
1480 apex_available: ["otherapex"],
1481 min_sdk_version: "29",
1482 }
1483
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001484 // platform module depending on libstub from otherapex should use the latest stub("current")
1485 cc_library {
1486 name: "libplatform",
1487 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001488 shared_libs: [
1489 "libstub",
1490 "libstub_rust",
1491 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001492 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001493 `,
1494 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1495 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1496 variables.Platform_sdk_final = proptools.BoolPtr(false)
1497 variables.Platform_version_active_codenames = []string{"Z"}
1498 }),
1499 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001500
Jiyong Park55549df2021-02-26 23:57:23 +09001501 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001502 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001503 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001504 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1505
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001506 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001507 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001508 ensureContains(t, mylibLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001509
1510 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1511 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1512 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001513 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1514
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001515 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1516 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001517 ensureContains(t, libplatformLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001518}
1519
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001520func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001521 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001522 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001523 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001524 name: "myapex2",
1525 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001526 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001527 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001528 }
1529
1530 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001531 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001532 public_key: "testkey.avbpubkey",
1533 private_key: "testkey.pem",
1534 }
1535
1536 cc_library {
1537 name: "mylib",
1538 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001539 shared_libs: [
1540 "libfoo#10",
1541 "libfoo_rust#10"
1542 ],
Jiyong Park678c8812020-02-07 17:25:49 +09001543 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001544 system_shared_libs: [],
1545 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001546 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001547 }
1548
1549 cc_library {
1550 name: "libfoo",
1551 srcs: ["mylib.cpp"],
1552 shared_libs: ["libbar"],
1553 system_shared_libs: [],
1554 stl: "none",
1555 stubs: {
1556 versions: ["10", "20", "30"],
1557 },
1558 }
1559
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001560 rust_ffi {
1561 name: "libfoo_rust",
1562 crate_name: "foo_rust",
1563 srcs: ["mylib.cpp"],
1564 shared_libs: ["libbar.from_rust"],
1565 stubs: {
1566 versions: ["10", "20", "30"],
1567 },
1568 }
1569
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001570 cc_library {
1571 name: "libbar",
1572 srcs: ["mylib.cpp"],
1573 system_shared_libs: [],
1574 stl: "none",
1575 }
1576
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001577 cc_library {
1578 name: "libbar.from_rust",
1579 srcs: ["mylib.cpp"],
1580 system_shared_libs: [],
1581 stl: "none",
1582 }
1583
Jiyong Park678c8812020-02-07 17:25:49 +09001584 cc_library_static {
1585 name: "libbaz",
1586 srcs: ["mylib.cpp"],
1587 system_shared_libs: [],
1588 stl: "none",
1589 apex_available: [ "myapex2" ],
1590 }
1591
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001592 `)
1593
Jooyung Hana0503a52023-08-23 13:12:50 +09001594 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001595 copyCmds := apexRule.Args["copy_commands"]
1596
1597 // Ensure that direct non-stubs dep is always included
1598 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1599
1600 // Ensure that indirect stubs dep is not included
1601 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001602 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001603
1604 // Ensure that dependency of stubs is not included
1605 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001606 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.from_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001607
Colin Crossaede88c2020-08-11 12:17:01 -07001608 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001609
1610 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001611 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001612 ensureContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared_10/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001613 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001614 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001615 ensureNotContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001616
Jiyong Park3ff16992019-12-27 14:11:47 +09001617 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001618 libFooRustStubsLdFlags := ctx.ModuleForTests("libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001619
1620 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1621 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001622 ensureNotContains(t, libFooRustStubsLdFlags, "libbar.from_rust.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001623
Colin Crossf61d03d2023-11-02 16:56:39 -07001624 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1625 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001626 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001627
Colin Crossf61d03d2023-11-02 16:56:39 -07001628 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1629 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001630 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001631}
1632
Jooyung Hand3639552019-08-09 12:57:43 +09001633func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001634 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001635 /*
1636 myapex
1637 |
1638 v (runtime_libs)
1639 mylib ------+------> libfoo [provides stub]
1640 |
1641 `------> libbar
1642 */
Colin Cross1c460562021-02-16 17:55:47 -08001643 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001644 apex {
1645 name: "myapex",
1646 key: "myapex.key",
1647 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001648 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001649 }
1650
1651 apex_key {
1652 name: "myapex.key",
1653 public_key: "testkey.avbpubkey",
1654 private_key: "testkey.pem",
1655 }
1656
1657 cc_library {
1658 name: "mylib",
1659 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001660 static_libs: ["libstatic"],
1661 shared_libs: ["libshared"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001662 runtime_libs: [
1663 "libfoo",
1664 "libbar",
1665 "libfoo_rs",
1666 ],
Jooyung Hand3639552019-08-09 12:57:43 +09001667 system_shared_libs: [],
1668 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001669 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001670 }
1671
1672 cc_library {
1673 name: "libfoo",
1674 srcs: ["mylib.cpp"],
1675 system_shared_libs: [],
1676 stl: "none",
1677 stubs: {
1678 versions: ["10", "20", "30"],
1679 },
1680 }
1681
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001682 rust_ffi {
1683 name: "libfoo_rs",
1684 crate_name: "foo_rs",
1685 srcs: ["mylib.rs"],
1686 stubs: {
1687 versions: ["10", "20", "30"],
1688 },
1689 }
1690
Jooyung Hand3639552019-08-09 12:57:43 +09001691 cc_library {
1692 name: "libbar",
1693 srcs: ["mylib.cpp"],
1694 system_shared_libs: [],
1695 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001696 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001697 }
1698
Liz Kammer5f108fa2023-05-11 14:33:17 -04001699 cc_library {
1700 name: "libstatic",
1701 srcs: ["mylib.cpp"],
1702 system_shared_libs: [],
1703 stl: "none",
1704 apex_available: [ "myapex" ],
1705 runtime_libs: ["libstatic_to_runtime"],
1706 }
1707
1708 cc_library {
1709 name: "libshared",
1710 srcs: ["mylib.cpp"],
1711 system_shared_libs: [],
1712 stl: "none",
1713 apex_available: [ "myapex" ],
1714 runtime_libs: ["libshared_to_runtime"],
1715 }
1716
1717 cc_library {
1718 name: "libstatic_to_runtime",
1719 srcs: ["mylib.cpp"],
1720 system_shared_libs: [],
1721 stl: "none",
1722 apex_available: [ "myapex" ],
1723 }
1724
1725 cc_library {
1726 name: "libshared_to_runtime",
1727 srcs: ["mylib.cpp"],
1728 system_shared_libs: [],
1729 stl: "none",
1730 apex_available: [ "myapex" ],
1731 }
Jooyung Hand3639552019-08-09 12:57:43 +09001732 `)
1733
Jooyung Hana0503a52023-08-23 13:12:50 +09001734 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001735 copyCmds := apexRule.Args["copy_commands"]
1736
1737 // Ensure that direct non-stubs dep is always included
1738 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1739
1740 // Ensure that indirect stubs dep is not included
1741 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001742 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001743
1744 // Ensure that runtime_libs dep in included
1745 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001746 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1747 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1748
1749 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001750
Jooyung Hana0503a52023-08-23 13:12:50 +09001751 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001752 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1753 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001754 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001755}
1756
Paul Duffina02cae32021-03-09 01:44:06 +00001757var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1758 cc.PrepareForTestWithCcBuildComponents,
1759 PrepareForTestWithApexBuildComponents,
1760 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001761 apex {
1762 name: "com.android.runtime",
1763 key: "com.android.runtime.key",
1764 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001765 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001766 }
1767
1768 apex_key {
1769 name: "com.android.runtime.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
Paul Duffina02cae32021-03-09 01:44:06 +00001773 `),
1774 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1775)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001776
Paul Duffina02cae32021-03-09 01:44:06 +00001777func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001778 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001779 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001780 cc_library {
1781 name: "libc",
1782 no_libcrt: true,
1783 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001784 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001785 stl: "none",
1786 system_shared_libs: [],
1787 stubs: { versions: ["1"] },
1788 apex_available: ["com.android.runtime"],
1789
1790 sanitize: {
1791 hwaddress: true,
1792 }
1793 }
1794
1795 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001796 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001797 no_libcrt: true,
1798 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001799 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001800 stl: "none",
1801 system_shared_libs: [],
1802 srcs: [""],
1803 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001804 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001805
1806 sanitize: {
1807 never: true,
1808 },
Spandan Das4de7b492023-05-05 21:13:01 +00001809 apex_available: [
1810 "//apex_available:anyapex",
1811 "//apex_available:platform",
1812 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001813 } `)
1814 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001815
Jooyung Hana0503a52023-08-23 13:12:50 +09001816 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001817 "lib64/bionic/libc.so",
1818 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1819 })
1820
Colin Cross4c4c1be2022-02-10 11:41:18 -08001821 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001822
1823 installed := hwasan.Description("install libclang_rt.hwasan")
1824 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1825
1826 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1827 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1828 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1829}
1830
1831func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001832 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001833 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001834 prepareForTestOfRuntimeApexWithHwasan,
1835 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1836 variables.SanitizeDevice = []string{"hwaddress"}
1837 }),
1838 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001839 cc_library {
1840 name: "libc",
1841 no_libcrt: true,
1842 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001843 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001844 stl: "none",
1845 system_shared_libs: [],
1846 stubs: { versions: ["1"] },
1847 apex_available: ["com.android.runtime"],
1848 }
1849
1850 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001851 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001852 no_libcrt: true,
1853 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001854 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001855 stl: "none",
1856 system_shared_libs: [],
1857 srcs: [""],
1858 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001859 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001860
1861 sanitize: {
1862 never: true,
1863 },
Spandan Das4de7b492023-05-05 21:13:01 +00001864 apex_available: [
1865 "//apex_available:anyapex",
1866 "//apex_available:platform",
1867 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001868 }
Paul Duffina02cae32021-03-09 01:44:06 +00001869 `)
1870 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001871
Jooyung Hana0503a52023-08-23 13:12:50 +09001872 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001873 "lib64/bionic/libc.so",
1874 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1875 })
1876
Colin Cross4c4c1be2022-02-10 11:41:18 -08001877 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001878
1879 installed := hwasan.Description("install libclang_rt.hwasan")
1880 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1881
1882 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1883 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1884 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1885}
1886
Jooyung Han61b66e92020-03-21 14:21:46 +00001887func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001888 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001889 testcases := []struct {
1890 name string
1891 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001892 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001893 shouldLink string
1894 shouldNotLink []string
1895 }{
1896 {
Jiyong Park55549df2021-02-26 23:57:23 +09001897 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001898 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001899 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001900 shouldLink: "current",
1901 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001902 },
1903 {
Jiyong Park55549df2021-02-26 23:57:23 +09001904 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001905 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001906 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001907 shouldLink: "current",
1908 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001909 },
1910 }
1911 for _, tc := range testcases {
1912 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001914 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001915 apex {
1916 name: "myapex",
1917 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001918 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001919 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001920 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001921 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001922
Jooyung Han61b66e92020-03-21 14:21:46 +00001923 apex_key {
1924 name: "myapex.key",
1925 public_key: "testkey.avbpubkey",
1926 private_key: "testkey.pem",
1927 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001928
Jooyung Han61b66e92020-03-21 14:21:46 +00001929 cc_library {
1930 name: "mylib",
1931 srcs: ["mylib.cpp"],
1932 vendor_available: true,
1933 shared_libs: ["libbar"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001937 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001938 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001939
Jooyung Han61b66e92020-03-21 14:21:46 +00001940 cc_library {
1941 name: "libbar",
1942 srcs: ["mylib.cpp"],
1943 system_shared_libs: [],
1944 stl: "none",
1945 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001946 llndk: {
1947 symbol_file: "libbar.map.txt",
1948 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001949 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001950 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001951 withUnbundledBuild,
1952 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001953
Jooyung Han61b66e92020-03-21 14:21:46 +00001954 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001955 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001956 "lib64/mylib.so",
1957 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001958
Jooyung Han61b66e92020-03-21 14:21:46 +00001959 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001960 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001961 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1962 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001963
Steven Moreland2c4000c2021-04-27 02:08:49 +00001964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001966 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001967 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001968 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001969
Steven Moreland2c4000c2021-04-27 02:08:49 +00001970 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001971 ver := tc.shouldLink
1972 if tc.shouldLink == "current" {
1973 ver = strconv.Itoa(android.FutureApiLevelInt)
1974 }
1975 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001976 })
1977 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001978}
1979
Jiyong Park25fc6a92018-11-18 18:02:45 +09001980func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001981 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001982 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001983 apex {
1984 name: "myapex",
1985 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001986 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm", "libmylib_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001987 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001988 }
1989
1990 apex_key {
1991 name: "myapex.key",
1992 public_key: "testkey.avbpubkey",
1993 private_key: "testkey.pem",
1994 }
1995
1996 cc_library {
1997 name: "mylib",
1998 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001999 system_shared_libs: ["libc"],
2000 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002001 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002002 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002003 }
2004
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002005 rust_ffi {
2006 name: "libmylib_rs",
2007 crate_name: "mylib_rs",
2008 shared_libs: ["libvers#27", "libm#impl"],
2009 srcs: ["mylib.rs"],
2010 apex_available: [ "myapex" ],
2011 }
2012
Jiyong Park25fc6a92018-11-18 18:02:45 +09002013 cc_library_shared {
2014 name: "mylib_shared",
2015 srcs: ["mylib.cpp"],
2016 shared_libs: ["libdl#27"],
2017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002018 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002019 }
2020
2021 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09002022 name: "libBootstrap",
2023 srcs: ["mylib.cpp"],
2024 stl: "none",
2025 bootstrap: true,
2026 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002027
2028 rust_ffi {
2029 name: "libbootstrap_rs",
2030 srcs: ["mylib.cpp"],
2031 crate_name: "bootstrap_rs",
2032 bootstrap: true,
2033 }
2034
2035 cc_library {
2036 name: "libvers",
2037 srcs: ["mylib.cpp"],
2038 stl: "none",
2039 stubs: { versions: ["27","30"] },
2040 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09002041 `)
2042
Jooyung Hana0503a52023-08-23 13:12:50 +09002043 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002044 copyCmds := apexRule.Args["copy_commands"]
2045
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002046 // Ensure that mylib, libmylib_rs, libm, libdl, libstd.dylib.so (from Rust) are included.
Alex Light5098a612018-11-29 17:12:15 -08002047 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002048 ensureContains(t, copyCmds, "image.apex/lib64/libmylib_rs.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09002049 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
2050 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002051 ensureContains(t, copyCmds, "image.apex/lib64/libstd.dylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002052
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002053 // Ensure that libc and liblog (from Rust) is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09002054 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002055 ensureNotContains(t, copyCmds, "image.apex/lib64/liblog.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002056
Colin Crossaede88c2020-08-11 12:17:01 -07002057 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002058 mylibRsFlags := ctx.ModuleForTests("libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"]
Colin Crossaede88c2020-08-11 12:17:01 -07002059 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
2060 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09002061
2062 // For dependency to libc
2063 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002064 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002065 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002066 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002067 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002068 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
2069 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002070
2071 // For dependency to libm
2072 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002073 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002074 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002075 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002076 // ... and is not compiling with the stub
2077 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
2078 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
2079
2080 // For dependency to libdl
2081 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002082 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002083 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002084 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
2085 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002086 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002087 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002088 // ... Cflags from stub is correctly exported to mylib
2089 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
2090 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09002091
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002092 // Rust checks
2093 // For dependency to libc, liblog
2094 // Ensure that libmylib_rs is linking with the latest versions of stubs
2095 ensureContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
2096 ensureContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared_current/liblog.so")
2097 // ... and not linking to the non-stub (impl) variants
2098 ensureNotContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2099 ensureNotContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared/liblog.so")
2100
2101 // For libm dependency (explicit)
2102 // Ensure that mylib is linking with the non-stub (impl) variant
2103 ensureContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
2104 // ... and not linking to the stub variant
2105 ensureNotContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
2106
2107 // For dependency to libvers
2108 // (We do not use libdl#27 as Rust links the system libs implicitly and does
2109 // not currently have a system_shared_libs equivalent to prevent this)
2110 // Ensure that mylib is linking with the specified version of stubs
2111 ensureContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_27/libvers.so")
2112 // ... and not linking to the other versions of stubs
2113 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_30/libvers.so")
2114 // ... and not linking to the non-stub (impl) variant
2115 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_apex10000/libvers.so")
2116
Jiyong Parkb0788572018-12-20 22:10:17 +09002117 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08002118 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
2119 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2120 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2121 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002122
2123 // Ensure that libbootstrap_rs is depending on the platform variant of bionic libs
2124 libRsFlags := ctx.ModuleForTests("libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"]
2125 ensureContains(t, libRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2126 ensureContains(t, libRsFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2127 ensureContains(t, libRsFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002128}
Jiyong Park7c2ee712018-12-07 00:42:25 +09002129
Jooyung Han749dc692020-04-15 11:03:39 +09002130func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002131 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09002132 // there are three links between liba --> libz.
2133 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09002134 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09002135 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08002136 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09002141 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002142 }
2143
2144 apex {
2145 name: "otherapex",
2146 key: "myapex.key",
2147 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09002148 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09002149 }
2150
2151 apex_key {
2152 name: "myapex.key",
2153 public_key: "testkey.avbpubkey",
2154 private_key: "testkey.pem",
2155 }
2156
2157 cc_library {
2158 name: "libx",
2159 shared_libs: ["liba"],
2160 system_shared_libs: [],
2161 stl: "none",
2162 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002163 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002164 }
2165
2166 cc_library {
2167 name: "liby",
2168 shared_libs: ["liba"],
2169 system_shared_libs: [],
2170 stl: "none",
2171 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002173 }
2174
2175 cc_library {
2176 name: "liba",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002177 shared_libs: ["libz", "libz_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002178 system_shared_libs: [],
2179 stl: "none",
2180 apex_available: [
2181 "//apex_available:anyapex",
2182 "//apex_available:platform",
2183 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002184 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002185 }
2186
2187 cc_library {
2188 name: "libz",
2189 system_shared_libs: [],
2190 stl: "none",
2191 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09002192 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09002193 },
2194 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002195
2196 rust_ffi {
2197 name: "libz_rs",
2198 crate_name: "z_rs",
2199 srcs: ["foo.rs"],
2200 stubs: {
2201 versions: ["28", "30"],
2202 },
2203 }
Jooyung Han749dc692020-04-15 11:03:39 +09002204 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002205
2206 expectLink := func(from, from_variant, to, to_variant string) {
2207 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2208 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2209 }
2210 expectNoLink := func(from, from_variant, to, to_variant string) {
2211 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2212 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2213 }
2214 // platform liba is linked to non-stub version
2215 expectLink("liba", "shared", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002216 expectLink("liba", "shared", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002217 // liba in myapex is linked to current
2218 expectLink("liba", "shared_apex29", "libz", "shared_current")
2219 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09002220 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07002221 expectNoLink("liba", "shared_apex29", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002222 expectLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_current")
2223 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_30")
2224 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_28")
2225 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002226 // liba in otherapex is linked to current
2227 expectLink("liba", "shared_apex30", "libz", "shared_current")
2228 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002229 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
2230 expectNoLink("liba", "shared_apex30", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002231 expectLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_current")
2232 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_30")
2233 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_28")
2234 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002235}
2236
Jooyung Hanaed150d2020-04-02 01:41:41 +09002237func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002238 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002239 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09002240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
2243 native_shared_libs: ["libx"],
2244 min_sdk_version: "R",
2245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252
2253 cc_library {
2254 name: "libx",
2255 shared_libs: ["libz"],
2256 system_shared_libs: [],
2257 stl: "none",
2258 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002259 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09002260 }
2261
2262 cc_library {
2263 name: "libz",
2264 system_shared_libs: [],
2265 stl: "none",
2266 stubs: {
2267 versions: ["29", "R"],
2268 },
2269 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002270 `,
2271 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2272 variables.Platform_version_active_codenames = []string{"R"}
2273 }),
2274 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002275
2276 expectLink := func(from, from_variant, to, to_variant string) {
2277 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2278 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2279 }
2280 expectNoLink := func(from, from_variant, to, to_variant string) {
2281 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2282 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2283 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002284 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2285 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002286 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2287 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002288}
2289
Jooyung Han4c4da062021-06-23 10:23:16 +09002290func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002291 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002292 testApex(t, `
2293 apex {
2294 name: "myapex",
2295 key: "myapex.key",
2296 java_libs: ["libx"],
2297 min_sdk_version: "S",
2298 }
2299
2300 apex_key {
2301 name: "myapex.key",
2302 public_key: "testkey.avbpubkey",
2303 private_key: "testkey.pem",
2304 }
2305
2306 java_library {
2307 name: "libx",
2308 srcs: ["a.java"],
2309 apex_available: [ "myapex" ],
2310 sdk_version: "current",
2311 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002312 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002313 }
2314 `,
2315 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2316 variables.Platform_version_active_codenames = []string{"S"}
2317 variables.Platform_sdk_codename = proptools.StringPtr("S")
2318 }),
2319 )
2320}
2321
Jooyung Han749dc692020-04-15 11:03:39 +09002322func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002323 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002324 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002325 apex {
2326 name: "myapex",
2327 key: "myapex.key",
2328 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002329 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002330 }
2331
2332 apex_key {
2333 name: "myapex.key",
2334 public_key: "testkey.avbpubkey",
2335 private_key: "testkey.pem",
2336 }
2337
2338 cc_library {
2339 name: "libx",
2340 shared_libs: ["libz"],
2341 system_shared_libs: [],
2342 stl: "none",
2343 apex_available: [ "myapex" ],
2344 }
2345
2346 cc_library {
2347 name: "libz",
2348 system_shared_libs: [],
2349 stl: "none",
2350 stubs: {
2351 versions: ["1", "2"],
2352 },
2353 }
2354 `)
2355
2356 expectLink := func(from, from_variant, to, to_variant string) {
2357 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2358 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2359 }
2360 expectNoLink := func(from, from_variant, to, to_variant string) {
2361 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2362 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2363 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002364 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002365 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002366 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002367 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002368}
2369
Jooyung Handfc864c2023-03-20 18:19:07 +09002370func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002371 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002372 ctx := testApex(t, `
2373 apex {
2374 name: "myapex",
2375 key: "myapex.key",
2376 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002377 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002378 vendor: true,
2379 min_sdk_version: "29",
2380 }
2381
2382 apex_key {
2383 name: "myapex.key",
2384 public_key: "testkey.avbpubkey",
2385 private_key: "testkey.pem",
2386 }
2387
2388 cc_library {
2389 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002390 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002391 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002392 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002393 shared_libs: ["libbar"],
2394 }
2395
2396 cc_library {
2397 name: "libbar",
2398 stubs: { versions: ["29", "30"] },
2399 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002400 }
2401 `)
2402
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002403 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002404
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002405 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002406
2407 // Ensure that mylib links with "current" LLNDK
2408 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002409 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002410
2411 // Ensure that mylib is targeting 29
2412 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2413 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2414
2415 // Ensure that the correct variant of crtbegin_so is used.
2416 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2417 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002418
2419 // Ensure that the crtbegin_so used by the APEX is targeting 29
2420 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2421 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2422}
2423
Chan Wang54956a62025-01-14 18:04:39 +00002424func TestTrackAllowedDepsForAndroidApex(t *testing.T) {
2425 t.Parallel()
2426 ctx := testApex(t, `
2427 apex {
2428 name: "com.android.myapex",
2429 key: "myapex.key",
2430 updatable: true,
2431 native_shared_libs: [
2432 "mylib",
2433 "yourlib",
2434 ],
2435 min_sdk_version: "29",
2436 }
2437
2438 apex {
2439 name: "myapex2",
2440 key: "myapex.key",
2441 updatable: false,
2442 native_shared_libs: ["yourlib"],
2443 }
2444
2445 apex_key {
2446 name: "myapex.key",
2447 public_key: "testkey.avbpubkey",
2448 private_key: "testkey.pem",
2449 }
2450
2451 cc_library {
2452 name: "mylib",
2453 srcs: ["mylib.cpp"],
2454 shared_libs: ["libbar", "libbar_rs"],
2455 min_sdk_version: "29",
2456 apex_available: ["com.android.myapex"],
2457 }
2458
2459 cc_library {
2460 name: "libbar",
2461 stubs: { versions: ["29", "30"] },
2462 }
2463
2464 rust_ffi {
2465 name: "libbar_rs",
2466 crate_name: "bar_rs",
2467 srcs: ["bar.rs"],
2468 stubs: { versions: ["29", "30"] },
2469 }
2470
2471 cc_library {
2472 name: "yourlib",
2473 srcs: ["mylib.cpp"],
2474 min_sdk_version: "29",
2475 apex_available: ["com.android.myapex", "myapex2", "//apex_available:platform"],
2476 }
2477 `, withFiles(android.MockFS{
2478 "packages/modules/common/build/allowed_deps.txt": nil,
2479 }),
2480 android.FixtureMergeMockFs(android.MockFS{
2481 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2482 }))
2483
2484 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2485 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2486 android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs,
2487 "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt")
2488 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2489 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2490
2491 myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex")
2492 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2493 myapex.Output("depsinfo/flatlist.txt")), "\n")
2494 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2495 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2496 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2497 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
2498 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2499 flatlist, "mylib:(minSdkVersion:29)")
2500 android.AssertStringListContains(t, "track platform-available lib",
2501 flatlist, "yourlib(minSdkVersion:29)")
2502}
2503
2504func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002505 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002506 ctx := testApex(t, `
2507 apex {
2508 name: "myapex",
2509 key: "myapex.key",
2510 updatable: true,
2511 native_shared_libs: [
2512 "mylib",
2513 "yourlib",
2514 ],
2515 min_sdk_version: "29",
2516 }
2517
2518 apex {
2519 name: "myapex2",
2520 key: "myapex.key",
2521 updatable: false,
2522 native_shared_libs: ["yourlib"],
2523 }
2524
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530
2531 cc_library {
2532 name: "mylib",
2533 srcs: ["mylib.cpp"],
Chan Wang54956a62025-01-14 18:04:39 +00002534 shared_libs: ["libbar"],
Jooyung Han4495f842023-04-25 16:39:59 +09002535 min_sdk_version: "29",
2536 apex_available: ["myapex"],
2537 }
2538
2539 cc_library {
2540 name: "libbar",
2541 stubs: { versions: ["29", "30"] },
2542 }
2543
2544 cc_library {
2545 name: "yourlib",
2546 srcs: ["mylib.cpp"],
2547 min_sdk_version: "29",
2548 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2549 }
2550 `, withFiles(android.MockFS{
2551 "packages/modules/common/build/allowed_deps.txt": nil,
2552 }))
2553
2554 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2555 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Chan Wang54956a62025-01-14 18:04:39 +00002556 android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002557 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002558 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002559 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002560}
2561
2562func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002563 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002564 ctx := testApex(t, `
2565 apex {
Chan Wang54956a62025-01-14 18:04:39 +00002566 name: "com.android.myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002567 key: "myapex.key",
2568 updatable: true,
2569 min_sdk_version: "29",
2570 }
2571
2572 apex_key {
2573 name: "myapex.key",
2574 public_key: "testkey.avbpubkey",
2575 private_key: "testkey.pem",
2576 }
Chan Wang54956a62025-01-14 18:04:39 +00002577 `,
2578 android.FixtureMergeMockFs(android.MockFS{
2579 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2580 }))
Jooyung Han4495f842023-04-25 16:39:59 +09002581 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2582 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2583 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2584 }
2585}
2586
Jooyung Han03b51852020-02-26 22:45:42 +09002587func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002588 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002589 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002590 apex {
2591 name: "myapex",
2592 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002593 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002594 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002595 }
2596
2597 apex_key {
2598 name: "myapex.key",
2599 public_key: "testkey.avbpubkey",
2600 private_key: "testkey.pem",
2601 }
2602
2603 cc_library {
2604 name: "libx",
2605 system_shared_libs: [],
2606 stl: "none",
2607 apex_available: [ "myapex" ],
2608 stubs: {
2609 versions: ["1", "2"],
2610 },
2611 }
2612
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002613 rust_ffi {
2614 name: "libx_rs",
2615 crate_name: "x_rs",
2616 srcs: ["x.rs"],
2617 apex_available: [ "myapex" ],
2618 stubs: {
2619 versions: ["1", "2"],
2620 },
2621 }
2622
Jooyung Han03b51852020-02-26 22:45:42 +09002623 cc_library {
2624 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002625 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002626 system_shared_libs: [],
2627 stl: "none",
2628 }
2629 `)
2630
2631 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002632 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002633 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2634 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2635 }
2636 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002637 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002638 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2639 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2640 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002641 expectLink("libz", "shared", "libx", "shared_current")
2642 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002643 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2644 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002645 expectNoLink("libz", "shared", "libz", "shared_1")
2646 expectNoLink("libz", "shared", "libz", "shared")
2647}
2648
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002649var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2650 func(variables android.FixtureProductVariables) {
2651 variables.SanitizeDevice = []string{"hwaddress"}
2652 },
2653)
2654
Jooyung Han75568392020-03-20 04:29:24 +09002655func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002656 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002657 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002658 apex {
2659 name: "myapex",
2660 key: "myapex.key",
2661 native_shared_libs: ["libx"],
2662 min_sdk_version: "29",
2663 }
2664
2665 apex_key {
2666 name: "myapex.key",
2667 public_key: "testkey.avbpubkey",
2668 private_key: "testkey.pem",
2669 }
2670
2671 cc_library {
2672 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002673 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002674 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002675 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002676 }
2677
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002678 rust_ffi {
2679 name: "libbar_rs",
2680 crate_name: "bar_rs",
2681 srcs: ["bar.rs"],
2682 stubs: { versions: ["29", "30"] },
2683 }
2684
Jooyung Han03b51852020-02-26 22:45:42 +09002685 cc_library {
2686 name: "libbar",
2687 stubs: {
2688 versions: ["29", "30"],
2689 },
2690 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002691 `,
2692 prepareForTestWithSantitizeHwaddress,
2693 )
Jooyung Han03b51852020-02-26 22:45:42 +09002694 expectLink := func(from, from_variant, to, to_variant string) {
2695 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2696 libFlags := ld.Args["libFlags"]
2697 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2698 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002699 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002700 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002701}
2702
Jooyung Han75568392020-03-20 04:29:24 +09002703func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002704 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002705 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 native_shared_libs: ["libx"],
2710 min_sdk_version: "29",
2711 }
2712
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718
2719 cc_library {
2720 name: "libx",
2721 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002722 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002723 }
Jooyung Han75568392020-03-20 04:29:24 +09002724 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002725
2726 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002727 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002728 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002729 // note that platform variant is not.
2730 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002731 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002732}
2733
Jooyung Han749dc692020-04-15 11:03:39 +09002734func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002735 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002736 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002737 apex {
2738 name: "myapex",
2739 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002740 native_shared_libs: ["mylib"],
2741 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002742 }
2743
2744 apex_key {
2745 name: "myapex.key",
2746 public_key: "testkey.avbpubkey",
2747 private_key: "testkey.pem",
2748 }
Jooyung Han749dc692020-04-15 11:03:39 +09002749
2750 cc_library {
2751 name: "mylib",
2752 srcs: ["mylib.cpp"],
2753 system_shared_libs: [],
2754 stl: "none",
2755 apex_available: [
2756 "myapex",
2757 ],
2758 min_sdk_version: "30",
2759 }
2760 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002761
2762 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2763 apex {
2764 name: "myapex",
2765 key: "myapex.key",
2766 native_shared_libs: ["libfoo.ffi"],
2767 min_sdk_version: "29",
2768 }
2769
2770 apex_key {
2771 name: "myapex.key",
2772 public_key: "testkey.avbpubkey",
2773 private_key: "testkey.pem",
2774 }
2775
2776 rust_ffi_shared {
2777 name: "libfoo.ffi",
2778 srcs: ["foo.rs"],
2779 crate_name: "foo",
2780 apex_available: [
2781 "myapex",
2782 ],
2783 min_sdk_version: "30",
2784 }
2785 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002786
2787 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2788 apex {
2789 name: "myapex",
2790 key: "myapex.key",
2791 java_libs: ["libfoo"],
2792 min_sdk_version: "29",
2793 }
2794
2795 apex_key {
2796 name: "myapex.key",
2797 public_key: "testkey.avbpubkey",
2798 private_key: "testkey.pem",
2799 }
2800
2801 java_import {
2802 name: "libfoo",
2803 jars: ["libfoo.jar"],
2804 apex_available: [
2805 "myapex",
2806 ],
2807 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002808 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002809 }
2810 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002811
2812 // Skip check for modules compiling against core API surface
2813 testApex(t, `
2814 apex {
2815 name: "myapex",
2816 key: "myapex.key",
2817 java_libs: ["libfoo"],
2818 min_sdk_version: "29",
2819 }
2820
2821 apex_key {
2822 name: "myapex.key",
2823 public_key: "testkey.avbpubkey",
2824 private_key: "testkey.pem",
2825 }
2826
2827 java_library {
2828 name: "libfoo",
2829 srcs: ["Foo.java"],
2830 apex_available: [
2831 "myapex",
2832 ],
2833 // Compile against core API surface
2834 sdk_version: "core_current",
2835 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002836 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002837 }
2838 `)
2839
Jooyung Han749dc692020-04-15 11:03:39 +09002840}
2841
2842func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002843 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002844 testApex(t, `
2845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 native_shared_libs: ["libfoo"],
2849 java_libs: ["libbar"],
2850 min_sdk_version: "29",
2851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 cc_library {
2860 name: "libfoo",
2861 srcs: ["mylib.cpp"],
2862 shared_libs: ["libfoo_dep"],
2863 apex_available: ["myapex"],
2864 min_sdk_version: "29",
2865 }
2866
2867 cc_library {
2868 name: "libfoo_dep",
2869 srcs: ["mylib.cpp"],
2870 apex_available: ["myapex"],
2871 min_sdk_version: "29",
2872 }
2873
2874 java_library {
2875 name: "libbar",
2876 sdk_version: "current",
2877 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002878 static_libs: [
2879 "libbar_dep",
2880 "libbar_import_dep",
2881 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002882 apex_available: ["myapex"],
2883 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002884 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002885 }
2886
2887 java_library {
2888 name: "libbar_dep",
2889 sdk_version: "current",
2890 srcs: ["a.java"],
2891 apex_available: ["myapex"],
2892 min_sdk_version: "29",
2893 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002894
2895 java_import {
2896 name: "libbar_import_dep",
2897 jars: ["libbar.jar"],
2898 apex_available: ["myapex"],
2899 min_sdk_version: "29",
2900 }
Jooyung Han03b51852020-02-26 22:45:42 +09002901 `)
2902}
2903
Colin Cross8ca61c12022-10-06 21:00:14 -07002904func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002905 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002906 // Tests that an apex dependency with min_sdk_version higher than the
2907 // min_sdk_version of the apex is allowed as long as the dependency's
2908 // min_sdk_version is less than or equal to the api level that the
2909 // architecture was introduced in. In this case, arm64 didn't exist
2910 // until api level 21, so the arm64 code will never need to run on
2911 // an api level 20 device, even if other architectures of the apex
2912 // will.
2913 testApex(t, `
2914 apex {
2915 name: "myapex",
2916 key: "myapex.key",
2917 native_shared_libs: ["libfoo"],
2918 min_sdk_version: "20",
2919 }
2920
2921 apex_key {
2922 name: "myapex.key",
2923 public_key: "testkey.avbpubkey",
2924 private_key: "testkey.pem",
2925 }
2926
2927 cc_library {
2928 name: "libfoo",
2929 srcs: ["mylib.cpp"],
2930 apex_available: ["myapex"],
2931 min_sdk_version: "21",
2932 stl: "none",
2933 }
2934 `)
2935}
2936
Artur Satayev8cf899a2020-04-15 17:29:42 +01002937func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002938 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002939 testCases := []struct {
2940 name string
2941 expectedError string
2942 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002943 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002944 }{
2945 {
2946 name: "Non-updatable apex with non-stable dep",
2947 bp: `
2948 apex {
2949 name: "myapex",
2950 java_libs: ["myjar"],
2951 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002952 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002953 }
2954 apex_key {
2955 name: "myapex.key",
2956 public_key: "testkey.avbpubkey",
2957 private_key: "testkey.pem",
2958 }
2959 java_library {
2960 name: "myjar",
2961 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002962 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002963 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002964 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002965 }
2966 `,
2967 },
2968 {
2969 name: "Updatable apex with stable dep",
2970 bp: `
2971 apex {
2972 name: "myapex",
2973 java_libs: ["myjar"],
2974 key: "myapex.key",
2975 updatable: true,
2976 min_sdk_version: "29",
2977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983 java_library {
2984 name: "myjar",
2985 srcs: ["foo/bar/MyClass.java"],
2986 sdk_version: "current",
2987 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002988 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002989 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002990 }
2991 `,
2992 },
2993 {
2994 name: "Updatable apex with non-stable dep",
2995 expectedError: "cannot depend on \"myjar\"",
2996 bp: `
2997 apex {
2998 name: "myapex",
2999 java_libs: ["myjar"],
3000 key: "myapex.key",
3001 updatable: true,
3002 }
3003 apex_key {
3004 name: "myapex.key",
3005 public_key: "testkey.avbpubkey",
3006 private_key: "testkey.pem",
3007 }
3008 java_library {
3009 name: "myjar",
3010 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003011 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003012 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003013 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003014 }
3015 `,
3016 },
3017 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003018 name: "Updatable apex with non-stable legacy core platform dep",
3019 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
3020 bp: `
3021 apex {
3022 name: "myapex",
3023 java_libs: ["myjar-uses-legacy"],
3024 key: "myapex.key",
3025 updatable: true,
3026 }
3027 apex_key {
3028 name: "myapex.key",
3029 public_key: "testkey.avbpubkey",
3030 private_key: "testkey.pem",
3031 }
3032 java_library {
3033 name: "myjar-uses-legacy",
3034 srcs: ["foo/bar/MyClass.java"],
3035 sdk_version: "core_platform",
3036 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003037 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003038 }
3039 `,
3040 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
3041 },
3042 {
Paul Duffin043f5e72021-03-05 00:00:01 +00003043 name: "Updatable apex with non-stable transitive dep",
3044 // This is not actually detecting that the transitive dependency is unstable, rather it is
3045 // detecting that the transitive dependency is building against a wider API surface than the
3046 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09003047 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003048 bp: `
3049 apex {
3050 name: "myapex",
3051 java_libs: ["myjar"],
3052 key: "myapex.key",
3053 updatable: true,
3054 }
3055 apex_key {
3056 name: "myapex.key",
3057 public_key: "testkey.avbpubkey",
3058 private_key: "testkey.pem",
3059 }
3060 java_library {
3061 name: "myjar",
3062 srcs: ["foo/bar/MyClass.java"],
3063 sdk_version: "current",
3064 apex_available: ["myapex"],
3065 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003066 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003067 }
3068 java_library {
3069 name: "transitive-jar",
3070 srcs: ["foo/bar/MyClass.java"],
3071 sdk_version: "core_platform",
3072 apex_available: ["myapex"],
3073 }
3074 `,
3075 },
3076 }
3077
3078 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003079 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3080 continue
3081 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003082 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003083 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003084 errorHandler := android.FixtureExpectsNoErrors
3085 if test.expectedError != "" {
3086 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003087 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003088 android.GroupFixturePreparers(
3089 java.PrepareForTestWithJavaDefaultModules,
3090 PrepareForTestWithApexBuildComponents,
3091 prepareForTestWithMyapex,
3092 android.OptionalFixturePreparer(test.preparer),
3093 ).
3094 ExtendWithErrorHandler(errorHandler).
3095 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003096 })
3097 }
3098}
3099
Jooyung Han749dc692020-04-15 11:03:39 +09003100func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3101 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3102 apex {
3103 name: "myapex",
3104 key: "myapex.key",
3105 native_shared_libs: ["mylib"],
3106 min_sdk_version: "29",
3107 }
3108
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }
3114
3115 cc_library {
3116 name: "mylib",
3117 srcs: ["mylib.cpp"],
3118 shared_libs: ["mylib2"],
3119 system_shared_libs: [],
3120 stl: "none",
3121 apex_available: [
3122 "myapex",
3123 ],
3124 min_sdk_version: "29",
3125 }
3126
3127 // indirect part of the apex
3128 cc_library {
3129 name: "mylib2",
3130 srcs: ["mylib.cpp"],
3131 system_shared_libs: [],
3132 stl: "none",
3133 apex_available: [
3134 "myapex",
3135 ],
3136 min_sdk_version: "30",
3137 }
3138 `)
3139}
3140
3141func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003142 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003143 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3144 apex {
3145 name: "myapex",
3146 key: "myapex.key",
3147 apps: ["AppFoo"],
3148 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003149 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 android_app {
3159 name: "AppFoo",
3160 srcs: ["foo/bar/MyClass.java"],
3161 sdk_version: "current",
3162 min_sdk_version: "29",
3163 system_modules: "none",
3164 stl: "none",
3165 static_libs: ["bar"],
3166 apex_available: [ "myapex" ],
3167 }
3168
3169 java_library {
3170 name: "bar",
3171 sdk_version: "current",
3172 srcs: ["a.java"],
3173 apex_available: [ "myapex" ],
3174 }
3175 `)
3176}
3177
3178func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003179 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003180 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003181 apex {
3182 name: "myapex",
3183 key: "myapex.key",
3184 native_shared_libs: ["mylib"],
3185 min_sdk_version: "29",
3186 }
3187
3188 apex_key {
3189 name: "myapex.key",
3190 public_key: "testkey.avbpubkey",
3191 private_key: "testkey.pem",
3192 }
3193
Colin Crossea91a172024-11-05 16:14:05 -08003194 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003195 cc_library {
3196 name: "mylib",
3197 srcs: ["mylib.cpp"],
3198 shared_libs: ["mylib2"],
3199 system_shared_libs: [],
3200 stl: "none",
3201 apex_available: ["myapex", "otherapex"],
3202 min_sdk_version: "29",
3203 }
3204
3205 cc_library {
3206 name: "mylib2",
3207 srcs: ["mylib.cpp"],
3208 system_shared_libs: [],
3209 stl: "none",
3210 apex_available: ["otherapex"],
3211 stubs: { versions: ["29", "30"] },
3212 min_sdk_version: "30",
3213 }
3214
3215 apex {
3216 name: "otherapex",
3217 key: "myapex.key",
3218 native_shared_libs: ["mylib", "mylib2"],
3219 min_sdk_version: "30",
3220 }
3221 `)
3222 expectLink := func(from, from_variant, to, to_variant string) {
3223 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3224 libFlags := ld.Args["libFlags"]
3225 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3226 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003227 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003228 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003229}
3230
Jooyung Haned124c32021-01-26 11:43:46 +09003231func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003232 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003233 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3234 func(variables android.FixtureProductVariables) {
3235 variables.Platform_sdk_codename = proptools.StringPtr("S")
3236 variables.Platform_version_active_codenames = []string{"S"}
3237 },
3238 )
Jooyung Haned124c32021-01-26 11:43:46 +09003239 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3240 apex {
3241 name: "myapex",
3242 key: "myapex.key",
3243 native_shared_libs: ["libfoo"],
3244 min_sdk_version: "S",
3245 }
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251 cc_library {
3252 name: "libfoo",
3253 shared_libs: ["libbar"],
3254 apex_available: ["myapex"],
3255 min_sdk_version: "29",
3256 }
3257 cc_library {
3258 name: "libbar",
3259 apex_available: ["myapex"],
3260 }
3261 `, withSAsActiveCodeNames)
3262}
3263
3264func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003265 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003266 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3267 variables.Platform_sdk_codename = proptools.StringPtr("S")
3268 variables.Platform_version_active_codenames = []string{"S", "T"}
3269 })
Colin Cross1c460562021-02-16 17:55:47 -08003270 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
3274 native_shared_libs: ["libfoo"],
3275 min_sdk_version: "S",
3276 }
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282 cc_library {
3283 name: "libfoo",
3284 shared_libs: ["libbar"],
3285 apex_available: ["myapex"],
3286 min_sdk_version: "S",
3287 }
3288 cc_library {
3289 name: "libbar",
3290 stubs: {
3291 symbol_file: "libbar.map.txt",
3292 versions: ["30", "S", "T"],
3293 },
3294 }
3295 `, withSAsActiveCodeNames)
3296
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003297 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003298 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3299 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003300 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003301}
3302
Jiyong Park7c2ee712018-12-07 00:42:25 +09003303func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003304 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003305 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003306 apex {
3307 name: "myapex",
3308 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003309 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003310 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003311 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003312 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003313 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003314 }
3315
3316 apex_key {
3317 name: "myapex.key",
3318 public_key: "testkey.avbpubkey",
3319 private_key: "testkey.pem",
3320 }
3321
3322 prebuilt_etc {
3323 name: "myetc",
3324 src: "myprebuilt",
3325 sub_dir: "foo/bar",
3326 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003327
3328 cc_library {
3329 name: "mylib",
3330 srcs: ["mylib.cpp"],
3331 relative_install_path: "foo/bar",
3332 system_shared_libs: [],
3333 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003334 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003335 }
3336
3337 cc_binary {
3338 name: "mybin",
3339 srcs: ["mylib.cpp"],
3340 relative_install_path: "foo/bar",
3341 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003342 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003343 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003344 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003345
3346 rust_binary {
3347 name: "mybin.rust",
3348 srcs: ["foo.rs"],
3349 relative_install_path: "rust_subdir",
3350 apex_available: [ "myapex" ],
3351 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003352 `)
3353
Jooyung Hana0503a52023-08-23 13:12:50 +09003354 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003355 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003356
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003357 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003358 ensureContains(t, cmd, "/etc ")
3359 ensureContains(t, cmd, "/etc/foo ")
3360 ensureContains(t, cmd, "/etc/foo/bar ")
3361 ensureContains(t, cmd, "/lib64 ")
3362 ensureContains(t, cmd, "/lib64/foo ")
3363 ensureContains(t, cmd, "/lib64/foo/bar ")
3364 ensureContains(t, cmd, "/lib ")
3365 ensureContains(t, cmd, "/lib/foo ")
3366 ensureContains(t, cmd, "/lib/foo/bar ")
3367 ensureContains(t, cmd, "/bin ")
3368 ensureContains(t, cmd, "/bin/foo ")
3369 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003370 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003371}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003372
Jooyung Han35155c42020-02-06 17:33:20 +09003373func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003375 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003376 apex {
3377 name: "myapex",
3378 key: "myapex.key",
3379 multilib: {
3380 both: {
3381 native_shared_libs: ["mylib"],
3382 binaries: ["mybin"],
3383 },
3384 },
3385 compile_multilib: "both",
3386 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 relative_install_path: "foo/bar",
3399 system_shared_libs: [],
3400 stl: "none",
3401 apex_available: [ "myapex" ],
3402 native_bridge_supported: true,
3403 }
3404
3405 cc_binary {
3406 name: "mybin",
3407 relative_install_path: "foo/bar",
3408 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003409 stl: "none",
3410 apex_available: [ "myapex" ],
3411 native_bridge_supported: true,
3412 compile_multilib: "both", // default is "first" for binary
3413 multilib: {
3414 lib64: {
3415 suffix: "64",
3416 },
3417 },
3418 }
Spandan Das45e40012024-12-02 22:45:48 +00003419 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003420 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003421 "bin/foo/bar/mybin",
3422 "bin/foo/bar/mybin64",
3423 "bin/arm/foo/bar/mybin",
3424 "bin/arm64/foo/bar/mybin64",
3425 "lib/foo/bar/mylib.so",
3426 "lib/arm/foo/bar/mylib.so",
3427 "lib64/foo/bar/mylib.so",
3428 "lib64/arm64/foo/bar/mylib.so",
3429 })
3430}
3431
Jooyung Han85d61762020-06-24 23:50:26 +09003432func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003433 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003434 result := android.GroupFixturePreparers(
3435 prepareForApexTest,
3436 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3437 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003438 apex {
3439 name: "myapex",
3440 key: "myapex.key",
3441 binaries: ["mybin"],
3442 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003443 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003444 }
3445 apex_key {
3446 name: "myapex.key",
3447 public_key: "testkey.avbpubkey",
3448 private_key: "testkey.pem",
3449 }
3450 cc_binary {
3451 name: "mybin",
3452 vendor: true,
3453 shared_libs: ["libfoo"],
3454 }
3455 cc_library {
3456 name: "libfoo",
3457 proprietary: true,
3458 }
3459 `)
3460
Jooyung Hana0503a52023-08-23 13:12:50 +09003461 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003462 "bin/mybin",
3463 "lib64/libfoo.so",
3464 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3465 "lib64/libc++.so",
3466 })
3467
Jooyung Hana0503a52023-08-23 13:12:50 +09003468 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003469 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003470 name := apexBundle.BaseModuleName()
3471 prefix := "TARGET_"
3472 var builder strings.Builder
3473 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003474 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003475 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003476 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003477
Jooyung Hana0503a52023-08-23 13:12:50 +09003478 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003479 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3480 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003481}
3482
Justin Yun13decfb2021-03-08 19:25:55 +09003483func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003485 ctx := testApex(t, `
3486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
3489 updatable: false,
3490 product_specific: true,
3491 binaries: ["foo"],
3492 }
3493
3494 apex_key {
3495 name: "myapex.key",
3496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_binary {
3501 name: "foo",
3502 product_available: true,
3503 apex_available: ["myapex"],
3504 srcs: ["foo.cpp"],
3505 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003506 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003507
3508 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003509 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003510 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3511 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3512 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3513 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3514}
3515
Jooyung Han8e5685d2020-09-21 11:02:57 +09003516func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003517 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003518 testCases := []struct {
3519 name string
3520 additionalProp string
3521 }{
3522 {"system apex with prebuilt_firmware", ""},
3523 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3524 }
3525 for _, tc := range testCases {
3526 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003534 `+tc.additionalProp+`
3535 }
3536 apex_key {
3537 name: "myapex.key",
3538 public_key: "testkey.avbpubkey",
3539 private_key: "testkey.pem",
3540 }
3541 prebuilt_firmware {
3542 name: "myfirmware",
3543 src: "myfirmware.bin",
3544 filename_from_src: true,
3545 `+tc.additionalProp+`
3546 }
3547 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003548 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003549 "etc/firmware/myfirmware.bin",
3550 })
3551 })
3552 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003553}
3554
Jooyung Hanefb184e2020-06-25 17:14:25 +09003555func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003556 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003557 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003558 apex {
3559 name: "myapex",
3560 key: "myapex.key",
3561 vendor: true,
3562 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003563 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003564 }
3565
3566 apex_key {
3567 name: "myapex.key",
3568 public_key: "testkey.avbpubkey",
3569 private_key: "testkey.pem",
3570 }
3571
3572 cc_library {
3573 name: "mylib",
3574 vendor_available: true,
3575 }
3576 `)
3577
Jooyung Hana0503a52023-08-23 13:12:50 +09003578 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003579 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003580 name := apexBundle.BaseModuleName()
3581 prefix := "TARGET_"
3582 var builder strings.Builder
3583 data.Custom(&builder, name, prefix, "", data)
3584 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003585 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 +09003586}
3587
Jooyung Han2ed99d02020-06-24 23:26:26 +09003588func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003589 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003590 apex {
3591 name: "myapex",
3592 key: "myapex.key",
3593 vintf_fragments: ["fragment.xml"],
3594 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003595 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003596 }
3597 apex_key {
3598 name: "myapex.key",
3599 public_key: "testkey.avbpubkey",
3600 private_key: "testkey.pem",
3601 }
3602 cc_binary {
3603 name: "mybin",
3604 }
3605 `)
3606
Jooyung Hana0503a52023-08-23 13:12:50 +09003607 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003608 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003609 name := apexBundle.BaseModuleName()
3610 prefix := "TARGET_"
3611 var builder strings.Builder
3612 data.Custom(&builder, name, prefix, "", data)
3613 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003614 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003615 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003616}
3617
Jiyong Park16e91a02018-12-20 18:18:08 +09003618func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003619 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003620 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003621 apex {
3622 name: "myapex",
3623 key: "myapex.key",
3624 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003625 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003626 }
3627
3628 apex_key {
3629 name: "myapex.key",
3630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
3634 cc_library {
3635 name: "mylib",
3636 srcs: ["mylib.cpp"],
3637 system_shared_libs: [],
3638 stl: "none",
3639 stubs: {
3640 versions: ["1", "2", "3"],
3641 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003642 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003643 }
3644
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003645 rust_ffi {
3646 name: "libmylib_rs",
3647 crate_name: "mylib_rs",
3648 srcs: ["mylib.rs"],
3649 stubs: {
3650 versions: ["1", "2", "3"],
3651 },
3652 apex_available: ["myapex"],
3653 }
3654
Jiyong Park16e91a02018-12-20 18:18:08 +09003655 cc_binary {
3656 name: "not_in_apex",
3657 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003658 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003659 static_executable: true,
3660 system_shared_libs: [],
3661 stl: "none",
3662 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003663 `)
3664
Colin Cross7113d202019-11-20 16:39:12 -08003665 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003666
3667 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003668 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003669 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003670}
Jiyong Park9335a262018-12-24 11:31:58 +09003671
3672func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003673 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003674 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003675 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003676 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003677 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003678 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003679 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003680 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003681 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003682 }
3683
3684 cc_library {
3685 name: "mylib",
3686 srcs: ["mylib.cpp"],
3687 system_shared_libs: [],
3688 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003689 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003690 }
3691
3692 apex_key {
3693 name: "myapex.key",
3694 public_key: "testkey.avbpubkey",
3695 private_key: "testkey.pem",
3696 }
3697
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003698 android_app_certificate {
3699 name: "myapex.certificate",
3700 certificate: "testkey",
3701 }
3702
3703 android_app_certificate {
3704 name: "myapex.certificate.override",
3705 certificate: "testkey.override",
3706 }
3707
Jiyong Park9335a262018-12-24 11:31:58 +09003708 `)
3709
3710 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003711 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003712
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003713 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3714 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003715 "vendor/foo/devkeys/testkey.avbpubkey")
3716 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003717 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3718 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003719 "vendor/foo/devkeys/testkey.pem")
3720 }
3721
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003722 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003723 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003724 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003725 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003726 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003727 }
3728}
Jiyong Park58e364a2019-01-19 19:24:06 +09003729
Jooyung Hanf121a652019-12-17 14:30:11 +09003730func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003731 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003732 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003733 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003734 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003735 apex {
3736 name: "myapex",
3737 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003738 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003739 }
3740 apex_key {
3741 name: "myapex.key",
3742 public_key: "testkey.avbpubkey",
3743 private_key: "testkey.pem",
3744 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003745 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003746 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3747 if actual := rule.Args["certificates"]; actual != expected {
3748 t.Errorf("certificates should be %q, not %q", expected, actual)
3749 }
3750 })
3751 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003752 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003753 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003754 apex {
3755 name: "myapex_keytest",
3756 key: "myapex.key",
3757 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003758 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003759 }
3760 apex_key {
3761 name: "myapex.key",
3762 public_key: "testkey.avbpubkey",
3763 private_key: "testkey.pem",
3764 }
3765 android_app_certificate {
3766 name: "myapex.certificate.override",
3767 certificate: "testkey.override",
3768 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003769 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003770 expected := "testkey.override.x509.pem testkey.override.pk8"
3771 if actual := rule.Args["certificates"]; actual != expected {
3772 t.Errorf("certificates should be %q, not %q", expected, actual)
3773 }
3774 })
3775 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003776 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003777 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003778 apex {
3779 name: "myapex",
3780 key: "myapex.key",
3781 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
3788 }
3789 android_app_certificate {
3790 name: "myapex.certificate",
3791 certificate: "testkey",
3792 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003793 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003794 expected := "testkey.x509.pem testkey.pk8"
3795 if actual := rule.Args["certificates"]; actual != expected {
3796 t.Errorf("certificates should be %q, not %q", expected, actual)
3797 }
3798 })
3799 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003800 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003801 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003802 apex {
3803 name: "myapex_keytest",
3804 key: "myapex.key",
3805 file_contexts: ":myapex-file_contexts",
3806 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003807 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003808 }
3809 apex_key {
3810 name: "myapex.key",
3811 public_key: "testkey.avbpubkey",
3812 private_key: "testkey.pem",
3813 }
3814 android_app_certificate {
3815 name: "myapex.certificate.override",
3816 certificate: "testkey.override",
3817 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003818 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003819 expected := "testkey.override.x509.pem testkey.override.pk8"
3820 if actual := rule.Args["certificates"]; actual != expected {
3821 t.Errorf("certificates should be %q, not %q", expected, actual)
3822 }
3823 })
3824 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003825 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003826 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003827 apex {
3828 name: "myapex",
3829 key: "myapex.key",
3830 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003831 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003832 }
3833 apex_key {
3834 name: "myapex.key",
3835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003837 }`,
3838 android.MockFS{
3839 "vendor/foo/devkeys/testkey.x509.pem": nil,
3840 }.AddToFixture(),
3841 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003842 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003843 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3844 if actual := rule.Args["certificates"]; actual != expected {
3845 t.Errorf("certificates should be %q, not %q", expected, actual)
3846 }
3847 })
3848 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003849 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003850 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003851 apex {
3852 name: "myapex_keytest",
3853 key: "myapex.key",
3854 file_contexts: ":myapex-file_contexts",
3855 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003856 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003857 }
3858 apex_key {
3859 name: "myapex.key",
3860 public_key: "testkey.avbpubkey",
3861 private_key: "testkey.pem",
3862 }
3863 android_app_certificate {
3864 name: "myapex.certificate.override",
3865 certificate: "testkey.override",
3866 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003867 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003868 expected := "testkey.override.x509.pem testkey.override.pk8"
3869 if actual := rule.Args["certificates"]; actual != expected {
3870 t.Errorf("certificates should be %q, not %q", expected, actual)
3871 }
3872 })
3873}
3874
Jiyong Park58e364a2019-01-19 19:24:06 +09003875func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003876 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003877 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003878 apex {
3879 name: "myapex",
3880 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003881 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003882 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003883 }
3884
3885 apex {
3886 name: "otherapex",
3887 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003888 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003889 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003890 }
3891
3892 apex_key {
3893 name: "myapex.key",
3894 public_key: "testkey.avbpubkey",
3895 private_key: "testkey.pem",
3896 }
3897
3898 cc_library {
3899 name: "mylib",
3900 srcs: ["mylib.cpp"],
3901 system_shared_libs: [],
3902 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003903 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003904 "myapex",
3905 "otherapex",
3906 ],
Jooyung Han24282772020-03-21 23:20:55 +09003907 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003908 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003909 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003910 cc_library {
3911 name: "mylib2",
3912 srcs: ["mylib.cpp"],
3913 system_shared_libs: [],
3914 stl: "none",
3915 apex_available: [
3916 "myapex",
3917 "otherapex",
3918 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003919 static_libs: ["mylib3"],
3920 recovery_available: true,
3921 min_sdk_version: "29",
3922 }
3923 cc_library {
3924 name: "mylib3",
3925 srcs: ["mylib.cpp"],
3926 system_shared_libs: [],
3927 stl: "none",
3928 apex_available: [
3929 "myapex",
3930 "otherapex",
3931 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003932 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003933 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003934 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003935 `)
3936
Jooyung Hanc87a0592020-03-02 17:44:33 +09003937 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003938 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003939 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003940
Vinh Tranf9754732023-01-19 22:41:46 -05003941 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003942 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003943 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003944
Vinh Tranf9754732023-01-19 22:41:46 -05003945 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003946 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003947 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003948
Colin Crossaede88c2020-08-11 12:17:01 -07003949 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3950 // each variant defines additional macros to distinguish which apex variant it is built for
3951
3952 // non-APEX variant does not have __ANDROID_APEX__ defined
3953 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3954 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3955
Vinh Tranf9754732023-01-19 22:41:46 -05003956 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003957 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3958 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003959
Jooyung Hanc87a0592020-03-02 17:44:33 +09003960 // non-APEX variant does not have __ANDROID_APEX__ defined
3961 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3962 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3963
Vinh Tranf9754732023-01-19 22:41:46 -05003964 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003965 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003966 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003967}
Jiyong Park7e636d02019-01-28 16:16:54 +09003968
3969func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003970 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003971 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003972 apex {
3973 name: "myapex",
3974 key: "myapex.key",
3975 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003976 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003977 }
3978
3979 apex_key {
3980 name: "myapex.key",
3981 public_key: "testkey.avbpubkey",
3982 private_key: "testkey.pem",
3983 }
3984
3985 cc_library_headers {
3986 name: "mylib_headers",
3987 export_include_dirs: ["my_include"],
3988 system_shared_libs: [],
3989 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003990 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003991 }
3992
3993 cc_library {
3994 name: "mylib",
3995 srcs: ["mylib.cpp"],
3996 system_shared_libs: [],
3997 stl: "none",
3998 header_libs: ["mylib_headers"],
3999 export_header_lib_headers: ["mylib_headers"],
4000 stubs: {
4001 versions: ["1", "2", "3"],
4002 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004003 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004004 }
4005
4006 cc_library {
4007 name: "otherlib",
4008 srcs: ["mylib.cpp"],
4009 system_shared_libs: [],
4010 stl: "none",
4011 shared_libs: ["mylib"],
4012 }
4013 `)
4014
Colin Cross7113d202019-11-20 16:39:12 -08004015 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09004016
4017 // Ensure that the include path of the header lib is exported to 'otherlib'
4018 ensureContains(t, cFlags, "-Imy_include")
4019}
Alex Light9670d332019-01-29 18:07:33 -08004020
Jiyong Park7cd10e32020-01-14 09:22:18 +09004021type fileInApex struct {
4022 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00004023 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09004024 isLink bool
4025}
4026
Jooyung Han1724d582022-12-21 10:17:44 +09004027func (f fileInApex) String() string {
4028 return f.src + ":" + f.path
4029}
4030
4031func (f fileInApex) match(expectation string) bool {
4032 parts := strings.Split(expectation, ":")
4033 if len(parts) == 1 {
4034 match, _ := path.Match(parts[0], f.path)
4035 return match
4036 }
4037 if len(parts) == 2 {
4038 matchSrc, _ := path.Match(parts[0], f.src)
4039 matchDst, _ := path.Match(parts[1], f.path)
4040 return matchSrc && matchDst
4041 }
4042 panic("invalid expected file specification: " + expectation)
4043}
4044
Jooyung Hana57af4a2020-01-23 05:36:59 +00004045func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09004046 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09004047 module := ctx.ModuleForTests(moduleName, variant)
4048 apexRule := module.MaybeRule("apexRule")
4049 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004051 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 for _, cmd := range strings.Split(copyCmds, "&&") {
4053 cmd = strings.TrimSpace(cmd)
4054 if cmd == "" {
4055 continue
4056 }
4057 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00004058 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09004059 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09004060 switch terms[0] {
4061 case "mkdir":
4062 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09004063 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004064 t.Fatal("copyCmds contains invalid cp command", cmd)
4065 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004066 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004067 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004068 isLink = false
4069 case "ln":
4070 if len(terms) != 3 && len(terms) != 4 {
4071 // ln LINK TARGET or ln -s LINK TARGET
4072 t.Fatal("copyCmds contains invalid ln command", cmd)
4073 }
4074 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004075 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004076 isLink = true
4077 default:
4078 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4079 }
4080 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004081 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004083 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 }
Jooyung Han1724d582022-12-21 10:17:44 +09004085 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004086 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 }
4088 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004089 return ret
4090}
4091
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004092func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004093 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004094 var failed bool
4095 var surplus []string
4096 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004097 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004098 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004099 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004100 if file.match(expected) {
4101 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004102 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004103 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004104 }
4105 }
Jooyung Han1724d582022-12-21 10:17:44 +09004106 if !matchFound {
4107 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004108 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004109 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004110
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004112 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004113 t.Log("surplus files", surplus)
4114 failed = true
4115 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004116
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004117 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004118 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004119 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004120 if !filesMatched[expected] {
4121 missing = append(missing, expected)
4122 }
4123 }
4124 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 t.Log("missing files", missing)
4126 failed = true
4127 }
4128 if failed {
4129 t.Fail()
4130 }
4131}
4132
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004133func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4134 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4135}
4136
4137func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004138 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004139 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4140 if deapexer.Output != nil {
4141 outputs = append(outputs, deapexer.Output.String())
4142 }
4143 for _, output := range deapexer.ImplicitOutputs {
4144 outputs = append(outputs, output.String())
4145 }
4146 actualFiles := make([]fileInApex, 0, len(outputs))
4147 for _, output := range outputs {
4148 dir := "/deapexer/"
4149 pos := strings.LastIndex(output, dir)
4150 if pos == -1 {
4151 t.Fatal("Unknown deapexer output ", output)
4152 }
4153 path := output[pos+len(dir):]
4154 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4155 }
4156 assertFileListEquals(t, files, actualFiles)
4157}
4158
Jooyung Han39edb6c2019-11-06 16:53:07 +09004159func vndkLibrariesTxtFiles(vers ...string) (result string) {
4160 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004161 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004162 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004163 prebuilt_etc {
4164 name: "` + txt + `.libraries.` + v + `.txt",
4165 src: "dummy.txt",
4166 }
4167 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004168 }
4169 }
4170 return
4171}
4172
Jooyung Han344d5432019-08-23 11:17:39 +09004173func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004174 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004175 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004176 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004177 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004178 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004179 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004180 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004181 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004182 }
4183
4184 apex_key {
4185 name: "myapex.key",
4186 public_key: "testkey.avbpubkey",
4187 private_key: "testkey.pem",
4188 }
4189
Jooyung Han31c470b2019-10-18 16:26:59 +09004190 vndk_prebuilt_shared {
4191 name: "libvndk27",
4192 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004193 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004194 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004195 vndk: {
4196 enabled: true,
4197 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004198 target_arch: "arm64",
4199 arch: {
4200 arm: {
4201 srcs: ["libvndk27_arm.so"],
4202 },
4203 arm64: {
4204 srcs: ["libvndk27_arm64.so"],
4205 },
4206 },
Colin Cross2807f002021-03-02 10:15:29 -08004207 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004208 }
4209
4210 vndk_prebuilt_shared {
4211 name: "libvndk27",
4212 version: "27",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004215 vndk: {
4216 enabled: true,
4217 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004218 target_arch: "x86_64",
4219 arch: {
4220 x86: {
4221 srcs: ["libvndk27_x86.so"],
4222 },
4223 x86_64: {
4224 srcs: ["libvndk27_x86_64.so"],
4225 },
4226 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004227 }
4228 `+vndkLibrariesTxtFiles("27"),
4229 withFiles(map[string][]byte{
4230 "libvndk27_arm.so": nil,
4231 "libvndk27_arm64.so": nil,
4232 "libvndk27_x86.so": nil,
4233 "libvndk27_x86_64.so": nil,
4234 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004235
Jooyung Hana0503a52023-08-23 13:12:50 +09004236 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004237 "lib/libvndk27_arm.so",
4238 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004239 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004240 })
Jooyung Han344d5432019-08-23 11:17:39 +09004241}
4242
Jooyung Han90eee022019-10-01 20:02:42 +09004243func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004244 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004245 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004246 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004247 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004248 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004249 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004250 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004251 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004252 }
4253 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004254 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004255 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004256 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004257 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004258 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004259 }
4260 apex_key {
4261 name: "myapex.key",
4262 public_key: "testkey.avbpubkey",
4263 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004264 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004265
4266 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004267 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004268 apexManifestRule := module.Rule("apexManifestRule")
4269 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004270 }
4271
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004272 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004273 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004274}
4275
Jooyung Han344d5432019-08-23 11:17:39 +09004276func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004277 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004278 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004279 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004280 name: "com.android.vndk.v30",
4281 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004282 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004283 native_bridge_supported: true,
4284 }
4285
4286 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004287 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004288 public_key: "testkey.avbpubkey",
4289 private_key: "testkey.pem",
4290 }
4291
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004292 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004293 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004294 version: "30",
4295 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004296 srcs: ["mylib.cpp"],
4297 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004298 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004299 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004300 vndk: {
4301 enabled: true,
4302 },
Jooyung Han344d5432019-08-23 11:17:39 +09004303 }
4304 `)
4305}
4306
Jooyung Han31c470b2019-10-18 16:26:59 +09004307func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004308 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004309 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004310 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004311 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004312 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004313 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004314 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004315 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004316 }
4317
4318 apex_key {
4319 name: "myapex.key",
4320 public_key: "testkey.avbpubkey",
4321 private_key: "testkey.pem",
4322 }
4323
4324 vndk_prebuilt_shared {
4325 name: "libvndk27",
4326 version: "27",
4327 target_arch: "arm",
4328 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004329 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004330 vndk: {
4331 enabled: true,
4332 },
4333 arch: {
4334 arm: {
4335 srcs: ["libvndk27.so"],
4336 }
4337 },
4338 }
4339
4340 vndk_prebuilt_shared {
4341 name: "libvndk27",
4342 version: "27",
4343 target_arch: "arm",
4344 binder32bit: true,
4345 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004346 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004347 vndk: {
4348 enabled: true,
4349 },
4350 arch: {
4351 arm: {
4352 srcs: ["libvndk27binder32.so"],
4353 }
4354 },
Colin Cross2807f002021-03-02 10:15:29 -08004355 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004356 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004357 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004358 withFiles(map[string][]byte{
4359 "libvndk27.so": nil,
4360 "libvndk27binder32.so": nil,
4361 }),
4362 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004363 android.FixtureModifyConfig(func(config android.Config) {
4364 target := android.Target{
4365 Os: android.Android,
4366 Arch: android.Arch{
4367 ArchType: android.Arm,
4368 ArchVariant: "armv7-a-neon",
4369 Abi: []string{"armeabi-v7a"},
4370 },
4371 NativeBridge: android.NativeBridgeDisabled,
4372 NativeBridgeHostArchName: "",
4373 NativeBridgeRelativePath: "",
4374 }
4375 config.Targets[android.Android] = []android.Target{target}
4376 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004377 }),
4378 )
4379
Jooyung Hana0503a52023-08-23 13:12:50 +09004380 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004381 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004382 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004383 })
4384}
4385
Jooyung Hane1633032019-08-01 17:41:43 +09004386func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004387 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004388 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004389 apex {
4390 name: "myapex_nodep",
4391 key: "myapex.key",
4392 native_shared_libs: ["lib_nodep"],
4393 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004394 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004395 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004396 }
4397
4398 apex {
4399 name: "myapex_dep",
4400 key: "myapex.key",
4401 native_shared_libs: ["lib_dep"],
4402 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004404 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004405 }
4406
4407 apex {
4408 name: "myapex_provider",
4409 key: "myapex.key",
4410 native_shared_libs: ["libfoo"],
4411 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004412 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004413 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004414 }
4415
4416 apex {
4417 name: "myapex_selfcontained",
4418 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004419 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex_key {
4426 name: "myapex.key",
4427 public_key: "testkey.avbpubkey",
4428 private_key: "testkey.pem",
4429 }
4430
4431 cc_library {
4432 name: "lib_nodep",
4433 srcs: ["mylib.cpp"],
4434 system_shared_libs: [],
4435 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004436 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 cc_library {
4440 name: "lib_dep",
4441 srcs: ["mylib.cpp"],
4442 shared_libs: ["libfoo"],
4443 system_shared_libs: [],
4444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004445 apex_available: [
4446 "myapex_dep",
4447 "myapex_provider",
4448 "myapex_selfcontained",
4449 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004450 }
4451
4452 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004453 name: "lib_dep_on_bar",
4454 srcs: ["mylib.cpp"],
4455 shared_libs: ["libbar"],
4456 system_shared_libs: [],
4457 stl: "none",
4458 apex_available: [
4459 "myapex_selfcontained",
4460 ],
4461 }
4462
4463
4464 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004465 name: "libfoo",
4466 srcs: ["mytest.cpp"],
4467 stubs: {
4468 versions: ["1"],
4469 },
4470 system_shared_libs: [],
4471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004472 apex_available: [
4473 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004474 ],
4475 }
4476
4477 cc_library {
4478 name: "libbar",
4479 srcs: ["mytest.cpp"],
4480 stubs: {
4481 versions: ["1"],
4482 },
4483 system_shared_libs: [],
4484 stl: "none",
4485 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004486 "myapex_selfcontained",
4487 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004488 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004489
Jooyung Hane1633032019-08-01 17:41:43 +09004490 `)
4491
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004492 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004493 var provideNativeLibs, requireNativeLibs []string
4494
Jooyung Hana0503a52023-08-23 13:12:50 +09004495 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004496 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4497 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004498 ensureListEmpty(t, provideNativeLibs)
4499 ensureListEmpty(t, requireNativeLibs)
4500
Jooyung Hana0503a52023-08-23 13:12:50 +09004501 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004502 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4503 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004504 ensureListEmpty(t, provideNativeLibs)
4505 ensureListContains(t, requireNativeLibs, "libfoo.so")
4506
Jooyung Hana0503a52023-08-23 13:12:50 +09004507 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004508 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4509 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004510 ensureListContains(t, provideNativeLibs, "libfoo.so")
4511 ensureListEmpty(t, requireNativeLibs)
4512
Jooyung Hana0503a52023-08-23 13:12:50 +09004513 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004514 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4515 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004516 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004517 ensureListEmpty(t, requireNativeLibs)
4518}
4519
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004520func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004521 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004522 ctx := testApex(t, `
4523 apex {
4524 name: "myapex",
4525 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004526 native_shared_libs: ["mylib"],
4527 updatable: false,
4528 }
4529
4530 apex_key {
4531 name: "myapex.key",
4532 public_key: "testkey.avbpubkey",
4533 private_key: "testkey.pem",
4534 }
4535
4536 cc_library {
4537 name: "mylib",
4538 srcs: ["mylib.cpp"],
4539 system_shared_libs: [],
4540 stl: "none",
4541 apex_available: [
4542 "//apex_available:platform",
4543 "myapex",
4544 ],
4545 }
4546 `, android.FixtureMergeEnv(map[string]string{
4547 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4548 }))
4549
Jooyung Hana0503a52023-08-23 13:12:50 +09004550 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004551 apexManifestRule := module.Rule("apexManifestRule")
4552 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4553}
4554
Vinh Tran8f5310f2022-10-07 18:16:47 -04004555func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004556 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004557 testCases := []struct {
4558 compileMultiLibProp string
4559 containedLibs []string
4560 notContainedLibs []string
4561 }{
4562 {
4563 containedLibs: []string{
4564 "image.apex/lib64/mylib.so",
4565 "image.apex/lib/mylib.so",
4566 },
4567 compileMultiLibProp: `compile_multilib: "both",`,
4568 },
4569 {
4570 containedLibs: []string{"image.apex/lib64/mylib.so"},
4571 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4572 compileMultiLibProp: `compile_multilib: "first",`,
4573 },
4574 {
4575 containedLibs: []string{"image.apex/lib64/mylib.so"},
4576 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4577 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4578 },
4579 {
4580 containedLibs: []string{"image.apex/lib64/mylib.so"},
4581 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4582 compileMultiLibProp: `compile_multilib: "64",`,
4583 },
4584 {
4585 containedLibs: []string{"image.apex/lib/mylib.so"},
4586 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4587 compileMultiLibProp: `compile_multilib: "32",`,
4588 },
4589 }
4590 for _, testCase := range testCases {
4591 ctx := testApex(t, fmt.Sprintf(`
4592 apex {
4593 name: "myapex",
4594 key: "myapex.key",
4595 %s
4596 native_shared_libs: ["mylib"],
4597 updatable: false,
4598 }
4599 apex_key {
4600 name: "myapex.key",
4601 public_key: "testkey.avbpubkey",
4602 private_key: "testkey.pem",
4603 }
4604 cc_library {
4605 name: "mylib",
4606 srcs: ["mylib.cpp"],
4607 apex_available: [
4608 "//apex_available:platform",
4609 "myapex",
4610 ],
4611 }
4612 `, testCase.compileMultiLibProp),
4613 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004615 apexRule := module.Rule("apexRule")
4616 copyCmds := apexRule.Args["copy_commands"]
4617 for _, containedLib := range testCase.containedLibs {
4618 ensureContains(t, copyCmds, containedLib)
4619 }
4620 for _, notContainedLib := range testCase.notContainedLibs {
4621 ensureNotContains(t, copyCmds, notContainedLib)
4622 }
4623 }
4624}
4625
Alex Light0851b882019-02-07 13:20:53 -08004626func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004627 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004628 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004629 apex {
4630 name: "myapex",
4631 key: "myapex.key",
4632 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004633 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004634 }
4635
4636 apex_key {
4637 name: "myapex.key",
4638 public_key: "testkey.avbpubkey",
4639 private_key: "testkey.pem",
4640 }
4641
4642 cc_library {
4643 name: "mylib_common",
4644 srcs: ["mylib.cpp"],
4645 system_shared_libs: [],
4646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004647 apex_available: [
4648 "//apex_available:platform",
4649 "myapex",
4650 ],
Alex Light0851b882019-02-07 13:20:53 -08004651 }
4652 `)
4653
Jooyung Hana0503a52023-08-23 13:12:50 +09004654 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004655 apexRule := module.Rule("apexRule")
4656 copyCmds := apexRule.Args["copy_commands"]
4657
4658 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4659 t.Log("Apex was a test apex!")
4660 t.Fail()
4661 }
4662 // Ensure that main rule creates an output
4663 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4664
4665 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004666 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004667
4668 // Ensure that both direct and indirect deps are copied into apex
4669 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4670
Colin Cross7113d202019-11-20 16:39:12 -08004671 // Ensure that the platform variant ends with _shared
4672 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004673
Colin Cross56a83212020-09-15 18:30:11 -07004674 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004675 t.Log("Found mylib_common not in any apex!")
4676 t.Fail()
4677 }
4678}
4679
4680func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004681 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004682 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004683 apex_test {
4684 name: "myapex",
4685 key: "myapex.key",
4686 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004687 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004688 }
4689
4690 apex_key {
4691 name: "myapex.key",
4692 public_key: "testkey.avbpubkey",
4693 private_key: "testkey.pem",
4694 }
4695
4696 cc_library {
4697 name: "mylib_common_test",
4698 srcs: ["mylib.cpp"],
4699 system_shared_libs: [],
4700 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004701 // TODO: remove //apex_available:platform
4702 apex_available: [
4703 "//apex_available:platform",
4704 "myapex",
4705 ],
Alex Light0851b882019-02-07 13:20:53 -08004706 }
4707 `)
4708
Jooyung Hana0503a52023-08-23 13:12:50 +09004709 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004710 apexRule := module.Rule("apexRule")
4711 copyCmds := apexRule.Args["copy_commands"]
4712
4713 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4714 t.Log("Apex was not a test apex!")
4715 t.Fail()
4716 }
4717 // Ensure that main rule creates an output
4718 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4719
4720 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004721 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004722
4723 // Ensure that both direct and indirect deps are copied into apex
4724 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4725
Colin Cross7113d202019-11-20 16:39:12 -08004726 // Ensure that the platform variant ends with _shared
4727 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004728}
4729
Jooyung Han85707de2023-12-01 14:21:13 +09004730func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004731 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004732 ctx := testApex(t, `
4733 apex {
4734 name: "myapex",
4735 key: "myapex.key",
4736 updatable: false,
4737 binaries: ["mybin"],
4738 }
4739 apex {
4740 name: "myvendorapex",
4741 key: "myapex.key",
4742 file_contexts: "myvendorapex_file_contexts",
4743 vendor: true,
4744 updatable: false,
4745 binaries: ["mybin"],
4746 }
4747 apex_key {
4748 name: "myapex.key",
4749 public_key: "testkey.avbpubkey",
4750 private_key: "testkey.pem",
4751 }
4752 cc_binary {
4753 name: "mybin",
4754 vendor_available: true,
4755 system_shared_libs: [],
4756 stl: "none",
4757 shared_libs: ["libz"],
4758 apex_available: ["//apex_available:anyapex"],
4759 }
4760 cc_library {
4761 name: "libz",
4762 vendor_available: true,
4763 system_shared_libs: [],
4764 stl: "none",
4765 stubs: {
4766 versions: ["28", "30"],
4767 },
4768 target: {
4769 vendor: {
4770 no_stubs: true,
4771 },
4772 },
4773 }
4774 `, withFiles(map[string][]byte{
4775 "myvendorapex_file_contexts": nil,
4776 }))
4777
4778 // libz provides stubs for core variant.
4779 {
4780 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4781 "bin/mybin",
4782 })
4783 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4784 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4785 }
4786 // libz doesn't provide stubs for vendor variant.
4787 {
4788 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4789 "bin/mybin",
4790 "lib64/libz.so",
4791 })
4792 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4793 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4794 }
4795}
4796
Alex Light9670d332019-01-29 18:07:33 -08004797func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004799 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004800 apex {
4801 name: "myapex",
4802 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004803 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004804 multilib: {
4805 first: {
4806 native_shared_libs: ["mylib_common"],
4807 }
4808 },
4809 target: {
4810 android: {
4811 multilib: {
4812 first: {
4813 native_shared_libs: ["mylib"],
4814 }
4815 }
4816 },
4817 host: {
4818 multilib: {
4819 first: {
4820 native_shared_libs: ["mylib2"],
4821 }
4822 }
4823 }
4824 }
4825 }
4826
4827 apex_key {
4828 name: "myapex.key",
4829 public_key: "testkey.avbpubkey",
4830 private_key: "testkey.pem",
4831 }
4832
4833 cc_library {
4834 name: "mylib",
4835 srcs: ["mylib.cpp"],
4836 system_shared_libs: [],
4837 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004838 // TODO: remove //apex_available:platform
4839 apex_available: [
4840 "//apex_available:platform",
4841 "myapex",
4842 ],
Alex Light9670d332019-01-29 18:07:33 -08004843 }
4844
4845 cc_library {
4846 name: "mylib_common",
4847 srcs: ["mylib.cpp"],
4848 system_shared_libs: [],
4849 stl: "none",
4850 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004851 // TODO: remove //apex_available:platform
4852 apex_available: [
4853 "//apex_available:platform",
4854 "myapex",
4855 ],
Alex Light9670d332019-01-29 18:07:33 -08004856 }
4857
4858 cc_library {
4859 name: "mylib2",
4860 srcs: ["mylib.cpp"],
4861 system_shared_libs: [],
4862 stl: "none",
4863 compile_multilib: "first",
4864 }
4865 `)
4866
Jooyung Hana0503a52023-08-23 13:12:50 +09004867 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004868 copyCmds := apexRule.Args["copy_commands"]
4869
4870 // Ensure that main rule creates an output
4871 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4872
4873 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004874 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4875 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4876 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004877
4878 // Ensure that both direct and indirect deps are copied into apex
4879 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4880 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4881 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4882
Colin Cross7113d202019-11-20 16:39:12 -08004883 // Ensure that the platform variant ends with _shared
4884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4885 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4886 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004887}
Jiyong Park04480cf2019-02-06 00:16:29 +09004888
Jiyong Park59140302020-12-14 18:44:04 +09004889func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004890 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004891 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004892 apex {
4893 name: "myapex",
4894 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004895 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004896 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004897 arch: {
4898 arm64: {
4899 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004900 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004901 },
4902 x86_64: {
4903 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004904 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004905 },
4906 }
4907 }
4908
4909 apex_key {
4910 name: "myapex.key",
4911 public_key: "testkey.avbpubkey",
4912 private_key: "testkey.pem",
4913 }
4914
4915 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004916 name: "mylib.generic",
4917 srcs: ["mylib.cpp"],
4918 system_shared_libs: [],
4919 stl: "none",
4920 // TODO: remove //apex_available:platform
4921 apex_available: [
4922 "//apex_available:platform",
4923 "myapex",
4924 ],
4925 }
4926
4927 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004928 name: "mylib.arm64",
4929 srcs: ["mylib.cpp"],
4930 system_shared_libs: [],
4931 stl: "none",
4932 // TODO: remove //apex_available:platform
4933 apex_available: [
4934 "//apex_available:platform",
4935 "myapex",
4936 ],
4937 }
4938
4939 cc_library {
4940 name: "mylib.x64",
4941 srcs: ["mylib.cpp"],
4942 system_shared_libs: [],
4943 stl: "none",
4944 // TODO: remove //apex_available:platform
4945 apex_available: [
4946 "//apex_available:platform",
4947 "myapex",
4948 ],
4949 }
4950 `)
4951
Jooyung Hana0503a52023-08-23 13:12:50 +09004952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004953 copyCmds := apexRule.Args["copy_commands"]
4954
4955 // Ensure that apex variant is created for the direct dep
4956 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004957 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004958 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4959
4960 // Ensure that both direct and indirect deps are copied into apex
4961 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4962 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4963}
4964
Jiyong Park04480cf2019-02-06 00:16:29 +09004965func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004967 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004968 apex {
4969 name: "myapex",
4970 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004971 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004972 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004973 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004974 }
4975
4976 apex_key {
4977 name: "myapex.key",
4978 public_key: "testkey.avbpubkey",
4979 private_key: "testkey.pem",
4980 }
4981
4982 sh_binary {
4983 name: "myscript",
4984 src: "mylib.cpp",
4985 filename: "myscript.sh",
4986 sub_dir: "script",
4987 }
4988 `)
4989
Jooyung Hana0503a52023-08-23 13:12:50 +09004990 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004991 copyCmds := apexRule.Args["copy_commands"]
4992
4993 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4994}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004995
Jooyung Han91df2082019-11-20 01:49:42 +09004996func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004997 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004998 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004999 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005000 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005001 {"", "system"},
5002 {"product_specific: true", "product"},
5003 {"soc_specific: true", "vendor"},
5004 {"proprietary: true", "vendor"},
5005 {"vendor: true", "vendor"},
5006 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005007 }
5008 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005009 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005010 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005011 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005012 apex {
5013 name: "myapex",
5014 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005016 `+tc.propName+`
5017 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005018
Jooyung Han91df2082019-11-20 01:49:42 +09005019 apex_key {
5020 name: "myapex.key",
5021 public_key: "testkey.avbpubkey",
5022 private_key: "testkey.pem",
5023 }
5024 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005025
Jooyung Hana0503a52023-08-23 13:12:50 +09005026 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08005027 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005028 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005029 if actual != expected {
5030 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5031 }
Jooyung Han91df2082019-11-20 01:49:42 +09005032 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005033 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005034}
Jiyong Park67882562019-03-21 01:11:21 +09005035
Jooyung Han580eb4f2020-06-24 19:33:06 +09005036func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005037 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005038 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005042 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 apex_key {
5046 name: "myapex.key",
5047 public_key: "testkey.avbpubkey",
5048 private_key: "testkey.pem",
5049 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005050 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005051 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052 rule := module.Output("file_contexts")
5053 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5054}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005055
Jooyung Han580eb4f2020-06-24 19:33:06 +09005056func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005057 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005058 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005059 apex {
5060 name: "myapex",
5061 key: "myapex.key",
5062 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005063 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005065
Jooyung Han580eb4f2020-06-24 19:33:06 +09005066 apex_key {
5067 name: "myapex.key",
5068 public_key: "testkey.avbpubkey",
5069 private_key: "testkey.pem",
5070 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005071 `, withFiles(map[string][]byte{
5072 "my_own_file_contexts": nil,
5073 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005077 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079 apex {
5080 name: "myapex",
5081 key: "myapex.key",
5082 product_specific: true,
5083 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005084 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086
Jooyung Han580eb4f2020-06-24 19:33:06 +09005087 apex_key {
5088 name: "myapex.key",
5089 public_key: "testkey.avbpubkey",
5090 private_key: "testkey.pem",
5091 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005092 `)
5093
Colin Cross1c460562021-02-16 17:55:47 -08005094 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005095 apex {
5096 name: "myapex",
5097 key: "myapex.key",
5098 product_specific: true,
5099 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005100 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005102
Jooyung Han580eb4f2020-06-24 19:33:06 +09005103 apex_key {
5104 name: "myapex.key",
5105 public_key: "testkey.avbpubkey",
5106 private_key: "testkey.pem",
5107 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005108 `, withFiles(map[string][]byte{
5109 "product_specific_file_contexts": nil,
5110 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 rule := module.Output("file_contexts")
5113 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5114}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005115
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005117 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005118 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005119 apex {
5120 name: "myapex",
5121 key: "myapex.key",
5122 product_specific: true,
5123 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005124 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005126
Jooyung Han580eb4f2020-06-24 19:33:06 +09005127 apex_key {
5128 name: "myapex.key",
5129 public_key: "testkey.avbpubkey",
5130 private_key: "testkey.pem",
5131 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005132
Jooyung Han580eb4f2020-06-24 19:33:06 +09005133 filegroup {
5134 name: "my-file-contexts",
5135 srcs: ["product_specific_file_contexts"],
5136 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005137 `, withFiles(map[string][]byte{
5138 "product_specific_file_contexts": nil,
5139 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005140 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005141 rule := module.Output("file_contexts")
5142 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005143}
5144
Jiyong Park67882562019-03-21 01:11:21 +09005145func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005146 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005147 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005148 apex_key {
5149 name: "myapex.key",
5150 public_key: ":my.avbpubkey",
5151 private_key: ":my.pem",
5152 product_specific: true,
5153 }
5154
5155 filegroup {
5156 name: "my.avbpubkey",
5157 srcs: ["testkey2.avbpubkey"],
5158 }
5159
5160 filegroup {
5161 name: "my.pem",
5162 srcs: ["testkey2.pem"],
5163 }
5164 `)
5165
5166 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5167 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005168 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005169 if actual_pubkey != expected_pubkey {
5170 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5171 }
5172 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005173 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005174 if actual_privkey != expected_privkey {
5175 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5176 }
5177}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005178
5179func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005181 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005182 prebuilt_apex {
5183 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005184 arch: {
5185 arm64: {
5186 src: "myapex-arm64.apex",
5187 },
5188 arm: {
5189 src: "myapex-arm.apex",
5190 },
5191 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005192 }
5193 `)
5194
Wei Li340ee8e2022-03-18 17:33:24 -07005195 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5196 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005197
Jiyong Parkc95714e2019-03-29 14:23:10 +09005198 expectedInput := "myapex-arm64.apex"
5199 if prebuilt.inputApex.String() != expectedInput {
5200 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5201 }
Wei Li340ee8e2022-03-18 17:33:24 -07005202 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5203 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5204 rule := testingModule.Rule("genProvenanceMetaData")
5205 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5206 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5207 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5208 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005209
5210 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5211 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005212}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005213
Paul Duffinc0609c62021-03-01 17:27:16 +00005214func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005215 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005216 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005217 prebuilt_apex {
5218 name: "myapex",
5219 }
5220 `)
5221}
5222
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005223func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005224 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005225 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005226 prebuilt_apex {
5227 name: "myapex",
5228 src: "myapex-arm.apex",
5229 filename: "notmyapex.apex",
5230 }
5231 `)
5232
Wei Li340ee8e2022-03-18 17:33:24 -07005233 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5234 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005235
5236 expected := "notmyapex.apex"
5237 if p.installFilename != expected {
5238 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5239 }
Wei Li340ee8e2022-03-18 17:33:24 -07005240 rule := testingModule.Rule("genProvenanceMetaData")
5241 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5242 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5243 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5244 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005245}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005246
Samiul Islam7c02e262021-09-08 17:48:28 +01005247func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005248 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005249 testApex(t, `
5250 apex_set {
5251 name: "com.company.android.myapex",
5252 apex_name: "com.android.myapex",
5253 set: "company-myapex.apks",
5254 filename: "com.company.android.myapex.apex"
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257
5258 testApex(t, `
5259 apex_set {
5260 name: "com.company.android.myapex",
5261 apex_name: "com.android.myapex",
5262 set: "company-myapex.apks",
5263 filename: "com.company.android.myapex.capex"
5264 }
5265 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5266
5267 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5268 apex_set {
5269 name: "com.company.android.myapex",
5270 apex_name: "com.android.myapex",
5271 set: "company-myapex.apks",
5272 filename: "some-random-suffix"
5273 }
5274 `)
5275}
5276
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005277func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005278 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005279 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005280 prebuilt_apex {
5281 name: "myapex.prebuilt",
5282 src: "myapex-arm.apex",
5283 overrides: [
5284 "myapex",
5285 ],
5286 }
5287 `)
5288
Wei Li340ee8e2022-03-18 17:33:24 -07005289 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5290 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005291
5292 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005293 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005294 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005295 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005296 }
Wei Li340ee8e2022-03-18 17:33:24 -07005297 rule := testingModule.Rule("genProvenanceMetaData")
5298 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5299 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5300 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5301 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005302}
5303
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005304func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005305 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005306 testApex(t, `
5307 prebuilt_apex {
5308 name: "com.company.android.myapex",
5309 apex_name: "com.android.myapex",
5310 src: "company-myapex-arm.apex",
5311 }
5312 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5313
5314 testApex(t, `
5315 apex_set {
5316 name: "com.company.android.myapex",
5317 apex_name: "com.android.myapex",
5318 set: "company-myapex.apks",
5319 }
5320 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5321}
5322
5323func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005324 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005325 _ = android.GroupFixturePreparers(
5326 java.PrepareForTestWithJavaDefaultModules,
5327 PrepareForTestWithApexBuildComponents,
5328 android.FixtureWithRootAndroidBp(`
5329 platform_bootclasspath {
5330 name: "platform-bootclasspath",
5331 fragments: [
5332 {
5333 apex: "com.android.art",
5334 module: "art-bootclasspath-fragment",
5335 },
5336 ],
5337 }
5338
5339 prebuilt_apex {
5340 name: "com.company.android.art",
5341 apex_name: "com.android.art",
5342 src: "com.company.android.art-arm.apex",
5343 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5344 }
5345
5346 prebuilt_bootclasspath_fragment {
5347 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005348 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005349 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005350 hidden_api: {
5351 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5352 metadata: "my-bootclasspath-fragment/metadata.csv",
5353 index: "my-bootclasspath-fragment/index.csv",
5354 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5355 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5356 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005357 }
5358
5359 java_import {
5360 name: "core-oj",
5361 jars: ["prebuilt.jar"],
5362 }
5363 `),
5364 ).RunTest(t)
5365}
5366
Spandan Das59a4a2b2024-01-09 21:35:56 +00005367// A minimal context object for use with DexJarBuildPath
5368type moduleErrorfTestCtx struct {
5369}
5370
5371func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5372}
5373
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005375 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005376 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005377 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005378 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5379 // is disabled.
5380 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005381
5382 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5383 // file creation.
5384 java.FixtureConfigureBootJars("platform:foo"),
5385 android.FixtureModifyMockFS(func(fs android.MockFS) {
5386 fs["platform/Android.bp"] = []byte(`
5387 java_library {
5388 name: "foo",
5389 srcs: ["Test.java"],
5390 compile_dex: true,
5391 }
5392 `)
5393 fs["platform/Test.java"] = nil
5394 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005395 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396
Paul Duffin40a3f652021-07-19 13:11:24 +01005397 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005398 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005399 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005400 var rule android.TestingBuildParams
5401
5402 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5403 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005404 }
5405
Paul Duffin40a3f652021-07-19 13:11:24 +01005406 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5407 t.Helper()
5408 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5409 var rule android.TestingBuildParams
5410
5411 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5412 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5413 }
5414
Paul Duffin89f570a2021-06-16 01:42:33 +01005415 fragment := java.ApexVariantReference{
5416 Apex: proptools.StringPtr("myapex"),
5417 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5418 }
5419
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005421 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005422 bp := `
5423 prebuilt_apex {
5424 name: "myapex",
5425 arch: {
5426 arm64: {
5427 src: "myapex-arm64.apex",
5428 },
5429 arm: {
5430 src: "myapex-arm.apex",
5431 },
5432 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005433 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5434 }
5435
5436 prebuilt_bootclasspath_fragment {
5437 name: "my-bootclasspath-fragment",
5438 contents: ["libfoo", "libbar"],
5439 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005440 hidden_api: {
5441 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5442 metadata: "my-bootclasspath-fragment/metadata.csv",
5443 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005444 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5445 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5446 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005447 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 }
5449
Spandan Das52c01a12024-09-20 01:09:48 +00005450 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005452 public: {
5453 jars: ["libfoo.jar"],
5454 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005456 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005457 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005458 }
Paul Duffin37856732021-02-26 14:24:15 +00005459
5460 java_sdk_library_import {
5461 name: "libbar",
5462 public: {
5463 jars: ["libbar.jar"],
5464 },
5465 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005466 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005467 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005468 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 `
5470
Paul Duffin89f570a2021-06-16 01:42:33 +01005471 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005472
Paul Duffin537ea3d2021-05-14 10:38:00 +01005473 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005474 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005476 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005478 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 +01005479 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005480 })
5481
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005482 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005483 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005484 bp := `
5485 apex_set {
5486 name: "myapex",
5487 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005488 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005489 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5490 }
5491
Paul Duffin89f570a2021-06-16 01:42:33 +01005492 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 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005504 }
5505
Liz Kammer2dc72442023-04-20 10:10:48 -04005506 prebuilt_systemserverclasspath_fragment {
5507 name: "my-systemserverclasspath-fragment",
5508 contents: ["libbaz"],
5509 apex_available: ["myapex"],
5510 }
5511
Spandan Das52c01a12024-09-20 01:09:48 +00005512 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005513 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005514 public: {
5515 jars: ["libfoo.jar"],
5516 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005517 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005518 shared_library: false,
5519 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005520 }
5521
Spandan Das52c01a12024-09-20 01:09:48 +00005522
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005523 java_sdk_library_import {
5524 name: "libbar",
5525 public: {
5526 jars: ["libbar.jar"],
5527 },
5528 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005529 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005530 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005531 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005532
5533 java_sdk_library_import {
5534 name: "libbaz",
5535 public: {
5536 jars: ["libbaz.jar"],
5537 },
5538 apex_available: ["myapex"],
5539 shared_library: false,
5540 permitted_packages: ["baz"],
5541 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005542 `
5543
Paul Duffin89f570a2021-06-16 01:42:33 +01005544 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005545
Paul Duffin537ea3d2021-05-14 10:38:00 +01005546 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005547 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005548 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005549 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005550 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005551 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 +01005552 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005553
5554 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5555
5556 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005557 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005558 "myjavalib.myapex",
5559 "libfoo.myapex",
5560 "libbar.myapex",
5561 "libbaz.myapex",
5562 }
5563 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5564 for i, e := range mkEntries {
5565 g := e.OverrideName
5566 if w := overrideNames[i]; w != g {
5567 t.Errorf("Expected override name %q, got %q", w, g)
5568 }
5569 }
5570
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005571 })
5572
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005574 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005575 bp := `
5576 prebuilt_apex {
5577 name: "myapex",
5578 arch: {
5579 arm64: {
5580 src: "myapex-arm64.apex",
5581 },
5582 arm: {
5583 src: "myapex-arm.apex",
5584 },
5585 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005586 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5587 }
5588
5589 prebuilt_bootclasspath_fragment {
5590 name: "my-bootclasspath-fragment",
5591 contents: ["libfoo", "libbar"],
5592 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005593 hidden_api: {
5594 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5595 metadata: "my-bootclasspath-fragment/metadata.csv",
5596 index: "my-bootclasspath-fragment/index.csv",
5597 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5598 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5599 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005600 }
5601
5602 java_import {
5603 name: "libfoo",
5604 jars: ["libfoo.jar"],
5605 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005606 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 }
5608
5609 java_library {
5610 name: "libfoo",
5611 srcs: ["foo/bar/MyClass.java"],
5612 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005613 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 }
Paul Duffin37856732021-02-26 14:24:15 +00005615
5616 java_sdk_library_import {
5617 name: "libbar",
5618 public: {
5619 jars: ["libbar.jar"],
5620 },
5621 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005622 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005623 }
5624
5625 java_sdk_library {
5626 name: "libbar",
5627 srcs: ["foo/bar/MyClass.java"],
5628 unsafe_ignore_missing_latest_api: true,
5629 apex_available: ["myapex"],
5630 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631 `
5632
5633 // In this test the source (java_library) libfoo is active since the
5634 // prebuilt (java_import) defaults to prefer:false. However the
5635 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5636 // find the dex boot jar in it. We either need to disable the source libfoo
5637 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005638 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005639 // dexbootjar check is skipped if AllowMissingDependencies is true
5640 preparerAllowMissingDeps := android.GroupFixturePreparers(
5641 preparer,
5642 android.PrepareForTestWithAllowMissingDependencies,
5643 )
5644 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 })
5646
5647 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005648 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005649 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005650 apex {
5651 name: "myapex",
5652 key: "myapex.key",
5653 updatable: false,
5654 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5655 }
5656
5657 apex_key {
5658 name: "myapex.key",
5659 public_key: "testkey.avbpubkey",
5660 private_key: "testkey.pem",
5661 }
5662
5663 bootclasspath_fragment {
5664 name: "my-bootclasspath-fragment",
5665 contents: ["libfoo", "libbar"],
5666 apex_available: ["myapex"],
5667 hidden_api: {
5668 split_packages: ["*"],
5669 },
5670 }
5671
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005672 prebuilt_apex {
5673 name: "myapex",
5674 arch: {
5675 arm64: {
5676 src: "myapex-arm64.apex",
5677 },
5678 arm: {
5679 src: "myapex-arm.apex",
5680 },
5681 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005682 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5683 }
5684
5685 prebuilt_bootclasspath_fragment {
5686 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005687 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005688 contents: ["libfoo", "libbar"],
5689 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005690 hidden_api: {
5691 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5692 metadata: "my-bootclasspath-fragment/metadata.csv",
5693 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005694 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5695 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5696 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005697 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005698 }
5699
Spandan Das52c01a12024-09-20 01:09:48 +00005700 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005701 name: "libfoo",
5702 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005703 public: {
5704 jars: ["libfoo.jar"],
5705 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005707 shared_library: false,
5708 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005709 }
5710
5711 java_library {
5712 name: "libfoo",
5713 srcs: ["foo/bar/MyClass.java"],
5714 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005715 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005716 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005717 }
Paul Duffin37856732021-02-26 14:24:15 +00005718
5719 java_sdk_library_import {
5720 name: "libbar",
5721 prefer: true,
5722 public: {
5723 jars: ["libbar.jar"],
5724 },
5725 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005726 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005727 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005728 }
5729
5730 java_sdk_library {
5731 name: "libbar",
5732 srcs: ["foo/bar/MyClass.java"],
5733 unsafe_ignore_missing_latest_api: true,
5734 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005735 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005736 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005737 `
5738
Paul Duffin89f570a2021-06-16 01:42:33 +01005739 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005740
Paul Duffin537ea3d2021-05-14 10:38:00 +01005741 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005742 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005743 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005744 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005745 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005746 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 +01005747 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005748 })
5749
5750 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005751 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005752 bp := `
5753 apex {
5754 name: "myapex",
5755 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005757 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005758 }
5759
5760 apex_key {
5761 name: "myapex.key",
5762 public_key: "testkey.avbpubkey",
5763 private_key: "testkey.pem",
5764 }
5765
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005766 bootclasspath_fragment {
5767 name: "my-bootclasspath-fragment",
5768 contents: ["libfoo", "libbar"],
5769 apex_available: ["myapex"],
5770 hidden_api: {
5771 split_packages: ["*"],
5772 },
5773 }
5774
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005775 prebuilt_apex {
5776 name: "myapex",
5777 arch: {
5778 arm64: {
5779 src: "myapex-arm64.apex",
5780 },
5781 arm: {
5782 src: "myapex-arm.apex",
5783 },
5784 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005785 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5786 }
5787
5788 prebuilt_bootclasspath_fragment {
5789 name: "my-bootclasspath-fragment",
5790 contents: ["libfoo", "libbar"],
5791 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005792 hidden_api: {
5793 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5794 metadata: "my-bootclasspath-fragment/metadata.csv",
5795 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005796 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5797 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5798 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005799 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005800 }
5801
5802 java_import {
5803 name: "libfoo",
5804 jars: ["libfoo.jar"],
5805 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005806 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005807 }
5808
5809 java_library {
5810 name: "libfoo",
5811 srcs: ["foo/bar/MyClass.java"],
5812 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005813 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005814 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005815 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005816 }
Paul Duffin37856732021-02-26 14:24:15 +00005817
5818 java_sdk_library_import {
5819 name: "libbar",
5820 public: {
5821 jars: ["libbar.jar"],
5822 },
5823 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005824 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005825 }
5826
5827 java_sdk_library {
5828 name: "libbar",
5829 srcs: ["foo/bar/MyClass.java"],
5830 unsafe_ignore_missing_latest_api: true,
5831 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005832 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005833 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005834 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005835 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005836 `
5837
Paul Duffin89f570a2021-06-16 01:42:33 +01005838 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005839
Paul Duffin537ea3d2021-05-14 10:38:00 +01005840 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005841 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005842 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5843 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005844 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5845 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 +01005846 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005847 })
5848
5849 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005850 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 bp := `
5852 apex {
5853 name: "myapex",
5854 enabled: false,
5855 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005856 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005857 }
5858
5859 apex_key {
5860 name: "myapex.key",
5861 public_key: "testkey.avbpubkey",
5862 private_key: "testkey.pem",
5863 }
5864
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005865 bootclasspath_fragment {
5866 name: "my-bootclasspath-fragment",
5867 enabled: false,
5868 contents: ["libfoo", "libbar"],
5869 apex_available: ["myapex"],
5870 hidden_api: {
5871 split_packages: ["*"],
5872 },
5873 }
5874
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005875 prebuilt_apex {
5876 name: "myapex",
5877 arch: {
5878 arm64: {
5879 src: "myapex-arm64.apex",
5880 },
5881 arm: {
5882 src: "myapex-arm.apex",
5883 },
5884 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005885 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5886 }
5887
5888 prebuilt_bootclasspath_fragment {
5889 name: "my-bootclasspath-fragment",
5890 contents: ["libfoo", "libbar"],
5891 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005892 hidden_api: {
5893 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5894 metadata: "my-bootclasspath-fragment/metadata.csv",
5895 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005896 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5897 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5898 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005899 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005900 }
5901
5902 java_import {
5903 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005904 jars: ["libfoo.jar"],
5905 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005906 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005907 }
5908
5909 java_library {
5910 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005911 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005912 srcs: ["foo/bar/MyClass.java"],
5913 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005914 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005915 }
Paul Duffin37856732021-02-26 14:24:15 +00005916
5917 java_sdk_library_import {
5918 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005919 public: {
5920 jars: ["libbar.jar"],
5921 },
5922 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005923 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005924 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005925 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005926 }
5927
5928 java_sdk_library {
5929 name: "libbar",
5930 srcs: ["foo/bar/MyClass.java"],
5931 unsafe_ignore_missing_latest_api: true,
5932 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005933 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005934 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005935 `
Cole Fausta963b942024-04-11 17:43:00 -07005936 // This test disables libbar, which causes the ComponentDepsMutator to add
5937 // deps on libbar.stubs and other sub-modules that don't exist. We can
5938 // enable AllowMissingDependencies to work around that, but enabling that
5939 // causes extra checks for missing source files to dex_bootjars, so add those
5940 // to the mock fs as well.
5941 preparer2 := android.GroupFixturePreparers(
5942 preparer,
5943 android.PrepareForTestWithAllowMissingDependencies,
5944 android.FixtureMergeMockFs(map[string][]byte{
5945 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005946 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005947 }),
5948 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005949
Cole Fausta963b942024-04-11 17:43:00 -07005950 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005951
Paul Duffin537ea3d2021-05-14 10:38:00 +01005952 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005953 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005954 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005955 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005956 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005957 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 +01005958 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005959 })
Spandan Das3a392012024-01-17 18:26:27 +00005960
Spandan Dasf2c10572024-02-27 04:49:52 +00005961 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005962 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005963 bp := `
5964 // Source
5965 apex {
5966 name: "myapex",
5967 enabled: false,
5968 key: "myapex.key",
5969 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5970 }
5971
5972 apex_key {
5973 name: "myapex.key",
5974 public_key: "testkey.avbpubkey",
5975 private_key: "testkey.pem",
5976 }
5977
5978 // Prebuilt
5979 prebuilt_apex {
5980 name: "myapex.v1",
5981 source_apex_name: "myapex",
5982 arch: {
5983 arm64: {
5984 src: "myapex-arm64.apex",
5985 },
5986 arm: {
5987 src: "myapex-arm.apex",
5988 },
5989 },
5990 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5991 prefer: true,
5992 }
5993 prebuilt_apex {
5994 name: "myapex.v2",
5995 source_apex_name: "myapex",
5996 arch: {
5997 arm64: {
5998 src: "myapex-arm64.apex",
5999 },
6000 arm: {
6001 src: "myapex-arm.apex",
6002 },
6003 },
6004 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6005 prefer: true,
6006 }
6007
6008 prebuilt_bootclasspath_fragment {
6009 name: "my-bootclasspath-fragment",
6010 contents: ["libfoo", "libbar"],
6011 apex_available: ["myapex"],
6012 hidden_api: {
6013 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6014 metadata: "my-bootclasspath-fragment/metadata.csv",
6015 index: "my-bootclasspath-fragment/index.csv",
6016 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6017 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6018 },
6019 prefer: true,
6020 }
6021
6022 java_import {
6023 name: "libfoo",
6024 jars: ["libfoo.jar"],
6025 apex_available: ["myapex"],
6026 prefer: true,
6027 }
6028 java_import {
6029 name: "libbar",
6030 jars: ["libbar.jar"],
6031 apex_available: ["myapex"],
6032 prefer: true,
6033 }
6034 `
6035
Spandan Dasf2c10572024-02-27 04:49:52 +00006036 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 +00006037 })
6038
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006039}
6040
Roland Levillain630846d2019-06-26 12:48:34 +01006041func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006042 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006043 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006044 apex_test {
6045 name: "myapex",
6046 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006047 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006048 tests: [
6049 "mytest",
6050 ],
6051 }
6052
6053 apex_key {
6054 name: "myapex.key",
6055 public_key: "testkey.avbpubkey",
6056 private_key: "testkey.pem",
6057 }
6058
Liz Kammer1c14a212020-05-12 15:26:55 -07006059 filegroup {
6060 name: "fg",
6061 srcs: [
6062 "baz",
6063 "bar/baz"
6064 ],
6065 }
6066
Roland Levillain630846d2019-06-26 12:48:34 +01006067 cc_test {
6068 name: "mytest",
6069 gtest: false,
6070 srcs: ["mytest.cpp"],
6071 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006072 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006073 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006074 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006075 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006076 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006077
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006078 cc_library {
6079 name: "mylib",
6080 srcs: ["mylib.cpp"],
6081 system_shared_libs: [],
6082 stl: "none",
6083 }
6084
Liz Kammer5bd365f2020-05-27 15:15:11 -07006085 filegroup {
6086 name: "fg2",
6087 srcs: [
6088 "testdata/baz"
6089 ],
6090 }
Roland Levillain630846d2019-06-26 12:48:34 +01006091 `)
6092
Jooyung Hana0503a52023-08-23 13:12:50 +09006093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006094 copyCmds := apexRule.Args["copy_commands"]
6095
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006096 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006097 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006098 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099
Liz Kammer1c14a212020-05-12 15:26:55 -07006100 //Ensure that test data are copied into apex.
6101 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6103
Roland Levillainf89cd092019-07-29 16:22:59 +01006104 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006105 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006106 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006107 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 prefix := "TARGET_"
6109 var builder strings.Builder
6110 data.Custom(&builder, name, prefix, "", data)
6111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006113 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006114}
6115
Jooyung Hand48f3c32019-08-23 11:18:57 +09006116func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006117 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006118 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["libfoo"],
6123 }
6124
6125 apex_key {
6126 name: "myapex.key",
6127 public_key: "testkey.avbpubkey",
6128 private_key: "testkey.pem",
6129 }
6130
6131 cc_library {
6132 name: "libfoo",
6133 stl: "none",
6134 system_shared_libs: [],
6135 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006136 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006137 }
6138 `)
6139 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 java_libs: ["myjar"],
6144 }
6145
6146 apex_key {
6147 name: "myapex.key",
6148 public_key: "testkey.avbpubkey",
6149 private_key: "testkey.pem",
6150 }
6151
6152 java_library {
6153 name: "myjar",
6154 srcs: ["foo/bar/MyClass.java"],
6155 sdk_version: "none",
6156 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006157 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006158 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006159 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006160 }
6161 `)
6162}
6163
Bill Peckhama41a6962021-01-11 10:58:54 -08006164func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006165 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006170 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006171 }
6172
6173 apex_key {
6174 name: "myapex.key",
6175 public_key: "testkey.avbpubkey",
6176 private_key: "testkey.pem",
6177 }
6178
6179 java_import {
6180 name: "myjavaimport",
6181 apex_available: ["myapex"],
6182 jars: ["my.jar"],
6183 compile_dex: true,
6184 }
6185 `)
6186
Jooyung Hana0503a52023-08-23 13:12:50 +09006187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006188 apexRule := module.Rule("apexRule")
6189 copyCmds := apexRule.Args["copy_commands"]
6190 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6191}
6192
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006193func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006194 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006195 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006196 apex {
6197 name: "myapex",
6198 key: "myapex.key",
6199 apps: [
6200 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006201 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006202 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006203 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006204 }
6205
6206 apex_key {
6207 name: "myapex.key",
6208 public_key: "testkey.avbpubkey",
6209 private_key: "testkey.pem",
6210 }
6211
6212 android_app {
6213 name: "AppFoo",
6214 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006215 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006216 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006217 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006218 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006220 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006221 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006222
6223 android_app {
6224 name: "AppFooPriv",
6225 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006226 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006227 system_modules: "none",
6228 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006229 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006231 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006232 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006233
6234 cc_library_shared {
6235 name: "libjni",
6236 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006237 shared_libs: ["libfoo"],
6238 stl: "none",
6239 system_shared_libs: [],
6240 apex_available: [ "myapex" ],
6241 sdk_version: "current",
6242 }
6243
6244 cc_library_shared {
6245 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006246 stl: "none",
6247 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006248 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006249 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006250 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 `)
6252
Jooyung Hana0503a52023-08-23 13:12:50 +09006253 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006254 apexRule := module.Rule("apexRule")
6255 copyCmds := apexRule.Args["copy_commands"]
6256
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006257 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6258 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006259 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006260
Colin Crossaede88c2020-08-11 12:17:01 -07006261 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006262 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006263 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006265 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // JNI libraries including transitive deps are
6267 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006268 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006269 // ... embedded inside APK (jnilibs.zip)
6270 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6271 // ... and not directly inside the APEX
6272 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6273 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006274
6275 apexBundle := module.Module().(*apexBundle)
6276 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6277 var builder strings.Builder
6278 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6279 androidMk := builder.String()
6280 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6281 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6282 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6283 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6284 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6285 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 +01006286}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006287
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006288func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006289 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006290 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6291 for _, id := range invalidBuildIds {
6292 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6293 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6294 variables.BuildId = proptools.StringPtr(id)
6295 })
6296 testApexError(t, message, `apex {
6297 name: "myapex",
6298 key: "myapex.key",
6299 apps: ["AppFooPrebuilt"],
6300 updatable: false,
6301 }
6302
6303 apex_key {
6304 name: "myapex.key",
6305 public_key: "testkey.avbpubkey",
6306 private_key: "testkey.pem",
6307 }
6308
6309 android_app_import {
6310 name: "AppFooPrebuilt",
6311 apk: "PrebuiltAppFoo.apk",
6312 presigned: true,
6313 apex_available: ["myapex"],
6314 }
6315 `, fixture)
6316 }
6317}
6318
Dario Frenicde2a032019-10-27 00:29:22 +01006319func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006320 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006321 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006322 apex {
6323 name: "myapex",
6324 key: "myapex.key",
6325 apps: [
6326 "AppFooPrebuilt",
6327 "AppFooPrivPrebuilt",
6328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006329 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006330 }
6331
6332 apex_key {
6333 name: "myapex.key",
6334 public_key: "testkey.avbpubkey",
6335 private_key: "testkey.pem",
6336 }
6337
6338 android_app_import {
6339 name: "AppFooPrebuilt",
6340 apk: "PrebuiltAppFoo.apk",
6341 presigned: true,
6342 dex_preopt: {
6343 enabled: false,
6344 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006345 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006346 }
6347
6348 android_app_import {
6349 name: "AppFooPrivPrebuilt",
6350 apk: "PrebuiltAppFooPriv.apk",
6351 privileged: true,
6352 presigned: true,
6353 dex_preopt: {
6354 enabled: false,
6355 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006356 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006357 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006358 }
6359 `)
6360
Jooyung Hana0503a52023-08-23 13:12:50 +09006361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006362 apexRule := module.Rule("apexRule")
6363 copyCmds := apexRule.Args["copy_commands"]
6364
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006365 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6366 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006367}
6368
6369func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006371 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006372 apex {
6373 name: "myapex",
6374 key: "myapex.key",
6375 apps: [
6376 "AppFoo",
6377 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006378 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006379 }
6380
6381 apex_key {
6382 name: "myapex.key",
6383 public_key: "testkey.avbpubkey",
6384 private_key: "testkey.pem",
6385 }
6386
6387 android_app {
6388 name: "AppFoo",
6389 srcs: ["foo/bar/MyClass.java"],
6390 sdk_version: "none",
6391 system_modules: "none",
6392 apex_available: [ "myapex" ],
6393 }
6394
6395 android_app_import {
6396 name: "AppFoo",
6397 apk: "AppFooPrebuilt.apk",
6398 filename: "AppFooPrebuilt.apk",
6399 presigned: true,
6400 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006401 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006402 }
6403 `, withFiles(map[string][]byte{
6404 "AppFooPrebuilt.apk": nil,
6405 }))
6406
Jooyung Hana0503a52023-08-23 13:12:50 +09006407 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006408 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006409 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006410}
6411
Dario Freni6f3937c2019-12-20 22:58:03 +00006412func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006413 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006414 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006415 apex {
6416 name: "myapex",
6417 key: "myapex.key",
6418 apps: [
6419 "TesterHelpAppFoo",
6420 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006421 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006422 }
6423
6424 apex_key {
6425 name: "myapex.key",
6426 public_key: "testkey.avbpubkey",
6427 private_key: "testkey.pem",
6428 }
6429
6430 android_test_helper_app {
6431 name: "TesterHelpAppFoo",
6432 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006433 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006434 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006435 }
6436
6437 `)
6438
Jooyung Hana0503a52023-08-23 13:12:50 +09006439 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006440 apexRule := module.Rule("apexRule")
6441 copyCmds := apexRule.Args["copy_commands"]
6442
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006443 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006444}
6445
Jooyung Han18020ea2019-11-13 10:50:48 +09006446func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006447 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006448 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006449 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006450 apex {
6451 name: "myapex",
6452 key: "myapex.key",
6453 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006454 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006455 }
6456
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462
6463 apex {
6464 name: "otherapex",
6465 key: "myapex.key",
6466 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006467 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006468 }
6469
6470 cc_defaults {
6471 name: "libfoo-defaults",
6472 apex_available: ["otherapex"],
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 defaults: ["libfoo-defaults"],
6478 stl: "none",
6479 system_shared_libs: [],
6480 }`)
6481}
6482
Paul Duffine52e66f2020-03-30 17:54:29 +01006483func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006484 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006486 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006487 apex {
6488 name: "myapex",
6489 key: "myapex.key",
6490 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006491 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006492 }
6493
6494 apex_key {
6495 name: "myapex.key",
6496 public_key: "testkey.avbpubkey",
6497 private_key: "testkey.pem",
6498 }
6499
6500 apex {
6501 name: "otherapex",
6502 key: "otherapex.key",
6503 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006504 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006505 }
6506
6507 apex_key {
6508 name: "otherapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512
6513 cc_library {
6514 name: "libfoo",
6515 stl: "none",
6516 system_shared_libs: [],
6517 apex_available: ["otherapex"],
6518 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006519
6520 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6521 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6522 testApex(t, `
6523 apex {
6524 name: "com.sdv.myapex",
6525 key: "myapex.key",
6526 native_shared_libs: ["libfoo"],
6527 updatable: false,
6528 product_specific: true,
6529 }
6530
6531 apex_key {
6532 name: "myapex.key",
6533 public_key: "testkey.avbpubkey",
6534 private_key: "testkey.pem",
6535 }
6536
6537 apex {
6538 name: "com.any.otherapex",
6539 key: "otherapex.key",
6540 native_shared_libs: ["libfoo"],
6541 updatable: false,
6542 }
6543
6544 apex_key {
6545 name: "otherapex.key",
6546 public_key: "testkey.avbpubkey",
6547 private_key: "testkey.pem",
6548 }
6549
6550 cc_library {
6551 name: "libfoo",
6552 stl: "none",
6553 system_shared_libs: [],
6554 apex_available: ["com.any.otherapex"],
6555 product_specific: true,
6556 }`,
6557 android.FixtureMergeMockFs(android.MockFS{
6558 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6559 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6560 }))
6561
6562 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6563 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6564 apex {
6565 name: "com.sdv.myapex",
6566 key: "myapex.key",
6567 native_shared_libs: ["libfoo"],
6568 updatable: false,
6569 }
6570
6571 apex_key {
6572 name: "myapex.key",
6573 public_key: "testkey.avbpubkey",
6574 private_key: "testkey.pem",
6575 }
6576
6577 apex {
6578 name: "com.any.otherapex",
6579 key: "otherapex.key",
6580 native_shared_libs: ["libfoo"],
6581 updatable: false,
6582 }
6583
6584 apex_key {
6585 name: "otherapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
6590 cc_library {
6591 name: "libfoo",
6592 stl: "none",
6593 system_shared_libs: [],
6594 apex_available: ["com.any.otherapex"],
6595 }`,
6596 android.FixtureMergeMockFs(android.MockFS{
6597 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6598 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6599 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006600}
Jiyong Park127b40b2019-09-30 16:04:35 +09006601
Paul Duffine52e66f2020-03-30 17:54:29 +01006602func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006603 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006604 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006605 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006606.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006607.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006608.*via tag cc\.dependencyTag.*
6609.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006610.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006611.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006612.*via tag cc\.dependencyTag.*
6613.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006614.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006615.*-> libbaz.*link:shared.*
6616.*via tag cc\.dependencyTag.*
6617.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006618 apex {
6619 name: "myapex",
6620 key: "myapex.key",
6621 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006622 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006623 }
6624
6625 apex_key {
6626 name: "myapex.key",
6627 public_key: "testkey.avbpubkey",
6628 private_key: "testkey.pem",
6629 }
6630
Jiyong Park127b40b2019-09-30 16:04:35 +09006631 cc_library {
6632 name: "libfoo",
6633 stl: "none",
6634 shared_libs: ["libbar"],
6635 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006636 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006637 }
6638
6639 cc_library {
6640 name: "libbar",
6641 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006642 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006643 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006644 apex_available: ["myapex"],
6645 }
6646
6647 cc_library {
6648 name: "libbaz",
6649 stl: "none",
6650 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006651 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006652
6653 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6654 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6655 testApex(t, `
6656 apex {
6657 name: "com.sdv.myapex",
6658 key: "myapex.key",
6659 native_shared_libs: ["libfoo"],
6660 updatable: false,
6661 product_specific: true,
6662 }
6663
6664 apex_key {
6665 name: "myapex.key",
6666 public_key: "testkey.avbpubkey",
6667 private_key: "testkey.pem",
6668 }
6669
6670 cc_library {
6671 name: "libfoo",
6672 stl: "none",
6673 shared_libs: ["libbar"],
6674 system_shared_libs: [],
6675 apex_available: ["com.sdv.myapex"],
6676 product_specific: true,
6677 }
6678
6679 cc_library {
6680 name: "libbar",
6681 stl: "none",
6682 shared_libs: ["libbaz"],
6683 system_shared_libs: [],
6684 apex_available: ["com.sdv.myapex"],
6685 product_specific: true,
6686 }
6687
6688 cc_library {
6689 name: "libbaz",
6690 stl: "none",
6691 system_shared_libs: [],
6692 product_specific: true,
6693 }`,
6694 android.FixtureMergeMockFs(android.MockFS{
6695 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6696 }))
6697
6698 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6699 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6700 apex {
6701 name: "com.sdv.myapex",
6702 key: "myapex.key",
6703 native_shared_libs: ["libfoo"],
6704 updatable: false,
6705 }
6706
6707 apex_key {
6708 name: "myapex.key",
6709 public_key: "testkey.avbpubkey",
6710 private_key: "testkey.pem",
6711 }
6712
6713 cc_library {
6714 name: "libfoo",
6715 stl: "none",
6716 shared_libs: ["libbar"],
6717 system_shared_libs: [],
6718 apex_available: ["com.sdv.myapex"],
6719 }
6720
6721 cc_library {
6722 name: "libbar",
6723 stl: "none",
6724 shared_libs: ["libbaz"],
6725 system_shared_libs: [],
6726 apex_available: ["com.sdv.myapex"],
6727 }
6728
6729 cc_library {
6730 name: "libbaz",
6731 stl: "none",
6732 system_shared_libs: [],
6733 }`,
6734 android.FixtureMergeMockFs(android.MockFS{
6735 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6736 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006737}
Jiyong Park127b40b2019-09-30 16:04:35 +09006738
Liz Kammer5f108fa2023-05-11 14:33:17 -04006739func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006740 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006741 testApex(t, `
6742 apex {
6743 name: "myapex",
6744 key: "myapex.key",
6745 native_shared_libs: ["libfoo"],
6746 updatable: false,
6747 }
6748
6749 apex_key {
6750 name: "myapex.key",
6751 public_key: "testkey.avbpubkey",
6752 private_key: "testkey.pem",
6753 }
6754
6755 cc_library {
6756 name: "libfoo",
6757 stl: "none",
6758 static_libs: ["libbar"],
6759 system_shared_libs: [],
6760 apex_available: ["myapex"],
6761 }
6762
6763 cc_library {
6764 name: "libbar",
6765 stl: "none",
6766 shared_libs: ["libbaz"],
6767 system_shared_libs: [],
6768 apex_available: ["myapex"],
6769 }
6770
6771 cc_library {
6772 name: "libbaz",
6773 stl: "none",
6774 system_shared_libs: [],
6775 }`)
6776
6777 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6778 apex {
6779 name: "myapex",
6780 key: "myapex.key",
6781 native_shared_libs: ["libfoo"],
6782 updatable: false,
6783 }
6784
6785 apex_key {
6786 name: "myapex.key",
6787 public_key: "testkey.avbpubkey",
6788 private_key: "testkey.pem",
6789 }
6790
6791 cc_library {
6792 name: "libfoo",
6793 stl: "none",
6794 static_libs: ["libbar"],
6795 system_shared_libs: [],
6796 apex_available: ["myapex"],
6797 }
6798
6799 cc_library {
6800 name: "libbar",
6801 stl: "none",
6802 system_shared_libs: [],
6803 }`)
6804}
6805
Paul Duffine52e66f2020-03-30 17:54:29 +01006806func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006807 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006808 testApexError(t, "\"otherapex\" is not a valid module name", `
6809 apex {
6810 name: "myapex",
6811 key: "myapex.key",
6812 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006813 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006814 }
6815
6816 apex_key {
6817 name: "myapex.key",
6818 public_key: "testkey.avbpubkey",
6819 private_key: "testkey.pem",
6820 }
6821
6822 cc_library {
6823 name: "libfoo",
6824 stl: "none",
6825 system_shared_libs: [],
6826 apex_available: ["otherapex"],
6827 }`)
6828
Paul Duffine52e66f2020-03-30 17:54:29 +01006829 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006834 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006835 }
6836
6837 apex_key {
6838 name: "myapex.key",
6839 public_key: "testkey.avbpubkey",
6840 private_key: "testkey.pem",
6841 }
6842
6843 cc_library {
6844 name: "libfoo",
6845 stl: "none",
6846 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006847 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006848 apex_available: ["myapex"],
6849 }
6850
6851 cc_library {
6852 name: "libbar",
6853 stl: "none",
6854 system_shared_libs: [],
6855 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006856 }
6857
6858 cc_library {
6859 name: "libbaz",
6860 stl: "none",
6861 system_shared_libs: [],
6862 stubs: {
6863 versions: ["10", "20", "30"],
6864 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006865 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006866}
Jiyong Park127b40b2019-09-30 16:04:35 +09006867
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006868func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006869 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006870 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006871 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006872 testApexError(t, "expected an integer between 0-9; got -1", `
6873 apex {
6874 name: "myapex",
6875 key: "myapex.key",
6876 apex_available_name: "com.android.foo",
6877 variant_version: "-1",
6878 updatable: false,
6879 }
6880 apex_key {
6881 name: "myapex.key",
6882 public_key: "testkey.avbpubkey",
6883 private_key: "testkey.pem",
6884 }
6885 `)
6886 })
6887
6888 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006889 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006890 testApexError(t, "expected an integer between 0-9; got 10", `
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 apex_available_name: "com.android.foo",
6895 variant_version: "10",
6896 updatable: false,
6897 }
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903 `)
6904 })
6905}
6906
6907func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006908 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006909 context := android.GroupFixturePreparers(
6910 android.PrepareForIntegrationTestWithAndroid,
6911 PrepareForTestWithApexBuildComponents,
6912 android.FixtureMergeMockFs(android.MockFS{
6913 "system/sepolicy/apex/foo-file_contexts": nil,
6914 "system/sepolicy/apex/bar-file_contexts": nil,
6915 }),
6916 )
6917 result := context.RunTestWithBp(t, `
6918 apex {
6919 name: "foo",
6920 key: "myapex.key",
6921 apex_available_name: "com.android.foo",
6922 variant_version: "0",
6923 updatable: false,
6924 }
6925 apex {
6926 name: "bar",
6927 key: "myapex.key",
6928 apex_available_name: "com.android.foo",
6929 variant_version: "3",
6930 updatable: false,
6931 }
6932 apex_key {
6933 name: "myapex.key",
6934 public_key: "testkey.avbpubkey",
6935 private_key: "testkey.pem",
6936 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006937 override_apex {
6938 name: "myoverrideapex",
6939 base: "bar",
6940 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006941 `)
6942
Jooyung Hana0503a52023-08-23 13:12:50 +09006943 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006944 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006945 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6946 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6947 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6948 }
6949
Jooyung Hana0503a52023-08-23 13:12:50 +09006950 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006951 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006952 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6953 barActualDefaultVersion := barManifestRule.Args["default_version"]
6954 if barActualDefaultVersion != barExpectedDefaultVersion {
6955 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6956 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006957
Spandan Das50801e22024-05-13 18:29:45 +00006958 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006959 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6960 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6961 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6962 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006963}
6964
Sam Delmericoca816532023-06-02 14:09:50 -04006965func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006966 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006967 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 -07006968 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006969 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6970 apex {
6971 name: "myapex_sminus",
6972 key: "myapex.key",
6973 apps: ["AppFoo"],
6974 apex_available_name: "myapex",
6975 updatable: false,
6976 }
6977 apex {
6978 name: "myapex",
6979 key: "myapex.key",
6980 apps: ["AppFoo"],
6981 updatable: false,
6982 }
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988 android_app {
6989 name: "AppFoo",
6990 srcs: ["foo/bar/MyClass.java"],
6991 sdk_version: "none",
6992 system_modules: "none",
6993 apex_available: [ "myapex_sminus" ],
6994 }`,
6995 android.FixtureMergeMockFs(android.MockFS{
6996 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6997 }),
6998 )
6999 })
7000
7001 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 -07007002 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007003 testApex(t, `
7004 apex {
7005 name: "myapex_sminus",
7006 key: "myapex.key",
7007 apps: ["AppFoo"],
7008 apex_available_name: "myapex",
7009 updatable: false,
7010 }
7011 apex {
7012 name: "myapex",
7013 key: "myapex.key",
7014 apps: ["AppFoo"],
7015 updatable: false,
7016 }
7017 apex_key {
7018 name: "myapex.key",
7019 public_key: "testkey.avbpubkey",
7020 private_key: "testkey.pem",
7021 }
7022 android_app {
7023 name: "AppFoo",
7024 srcs: ["foo/bar/MyClass.java"],
7025 sdk_version: "none",
7026 system_modules: "none",
7027 apex_available: [ "myapex" ],
7028 }`,
7029 android.FixtureMergeMockFs(android.MockFS{
7030 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7031 }),
7032 )
7033 })
7034
7035 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007036 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007037 testApex(t, `
7038 override_apex {
7039 name: "myoverrideapex_sminus",
7040 base: "myapex_sminus",
7041 key: "myapex.key",
7042 apps: ["AppFooOverride"],
7043 }
7044 override_apex {
7045 name: "myoverrideapex",
7046 base: "myapex",
7047 key: "myapex.key",
7048 apps: ["AppFooOverride"],
7049 }
7050 apex {
7051 name: "myapex_sminus",
7052 key: "myapex.key",
7053 apps: ["AppFoo"],
7054 apex_available_name: "myapex",
7055 updatable: false,
7056 }
7057 apex {
7058 name: "myapex",
7059 key: "myapex.key",
7060 apps: ["AppFoo"],
7061 updatable: false,
7062 }
7063 apex_key {
7064 name: "myapex.key",
7065 public_key: "testkey.avbpubkey",
7066 private_key: "testkey.pem",
7067 }
7068 android_app {
7069 name: "AppFooOverride",
7070 srcs: ["foo/bar/MyClass.java"],
7071 sdk_version: "none",
7072 system_modules: "none",
7073 apex_available: [ "myapex" ],
7074 }
7075 android_app {
7076 name: "AppFoo",
7077 srcs: ["foo/bar/MyClass.java"],
7078 sdk_version: "none",
7079 system_modules: "none",
7080 apex_available: [ "myapex" ],
7081 }`,
7082 android.FixtureMergeMockFs(android.MockFS{
7083 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7084 }),
7085 )
7086 })
7087}
7088
7089func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007090 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007091 context := android.GroupFixturePreparers(
7092 android.PrepareForIntegrationTestWithAndroid,
7093 PrepareForTestWithApexBuildComponents,
7094 java.PrepareForTestWithDexpreopt,
7095 android.FixtureMergeMockFs(android.MockFS{
7096 "system/sepolicy/apex/myapex-file_contexts": nil,
7097 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7098 }),
7099 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7100 variables.BuildId = proptools.StringPtr("buildid")
7101 }),
7102 )
7103 context.RunTestWithBp(t, `
7104 override_apex {
7105 name: "myoverrideapex_sminus",
7106 base: "myapex_sminus",
7107 }
7108 override_apex {
7109 name: "myoverrideapex",
7110 base: "myapex",
7111 }
7112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 apps: ["AppFoo"],
7116 updatable: false,
7117 }
7118 apex {
7119 name: "myapex_sminus",
7120 apex_available_name: "myapex",
7121 key: "myapex.key",
7122 apps: ["AppFoo_sminus"],
7123 updatable: false,
7124 }
7125 apex_key {
7126 name: "myapex.key",
7127 public_key: "testkey.avbpubkey",
7128 private_key: "testkey.pem",
7129 }
7130 android_app {
7131 name: "AppFoo",
7132 srcs: ["foo/bar/MyClass.java"],
7133 sdk_version: "none",
7134 system_modules: "none",
7135 apex_available: [ "myapex" ],
7136 }
7137 android_app {
7138 name: "AppFoo_sminus",
7139 srcs: ["foo/bar/MyClass.java"],
7140 sdk_version: "none",
7141 min_sdk_version: "29",
7142 system_modules: "none",
7143 apex_available: [ "myapex" ],
7144 }`)
7145}
7146
Jiyong Park89e850a2020-04-07 16:37:39 +09007147func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007148 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007149 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007153 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 cc_library {
7164 name: "libfoo",
7165 stl: "none",
7166 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007167 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007168 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007169 }
7170
7171 cc_library {
7172 name: "libfoo2",
7173 stl: "none",
7174 system_shared_libs: [],
7175 shared_libs: ["libbaz"],
7176 apex_available: ["//apex_available:platform"],
7177 }
7178
7179 cc_library {
7180 name: "libbar",
7181 stl: "none",
7182 system_shared_libs: [],
7183 apex_available: ["myapex"],
7184 }
7185
7186 cc_library {
7187 name: "libbaz",
7188 stl: "none",
7189 system_shared_libs: [],
7190 apex_available: ["myapex"],
7191 stubs: {
7192 versions: ["1"],
7193 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007194 }`)
7195
Jiyong Park89e850a2020-04-07 16:37:39 +09007196 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7197 // because it depends on libbar which isn't available to platform
7198 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7199 if libfoo.NotAvailableForPlatform() != true {
7200 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7201 }
7202
7203 // libfoo2 however can be available to platform because it depends on libbaz which provides
7204 // stubs
7205 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7206 if libfoo2.NotAvailableForPlatform() == true {
7207 t.Errorf("%q should be available to platform", libfoo2.String())
7208 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007209}
Jiyong Parka90ca002019-10-07 15:47:24 +09007210
Paul Duffine52e66f2020-03-30 17:54:29 +01007211func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007212 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007213 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007214 apex {
7215 name: "myapex",
7216 key: "myapex.key",
7217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007218 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007219 }
7220
7221 apex_key {
7222 name: "myapex.key",
7223 public_key: "testkey.avbpubkey",
7224 private_key: "testkey.pem",
7225 }
7226
7227 cc_library {
7228 name: "libfoo",
7229 stl: "none",
7230 system_shared_libs: [],
7231 apex_available: ["myapex"],
7232 static: {
7233 apex_available: ["//apex_available:platform"],
7234 },
7235 }`)
7236
Jiyong Park89e850a2020-04-07 16:37:39 +09007237 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7238 if libfooShared.NotAvailableForPlatform() != true {
7239 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7240 }
7241 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7242 if libfooStatic.NotAvailableForPlatform() != false {
7243 t.Errorf("%q should be available to platform", libfooStatic.String())
7244 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007245}
7246
Jooyung Han9a419e22024-08-16 17:14:21 +09007247func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007248 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007249
7250 for _, tc := range []struct {
7251 name string
7252 apexAvailable string
7253 expectedError string
7254 }{
7255 {
7256 name: "prefix matches correctly",
7257 apexAvailable: "com.foo.*",
7258 },
7259 {
7260 name: "prefix doesn't match",
7261 apexAvailable: "com.bar.*",
7262 expectedError: `Consider .* "com.foo\.\*"`,
7263 },
7264 {
7265 name: "short prefix",
7266 apexAvailable: "com.*",
7267 expectedError: "requires two or more components",
7268 },
7269 {
7270 name: "wildcard not in the end",
7271 apexAvailable: "com.*.foo",
7272 expectedError: "should end with .*",
7273 },
7274 {
7275 name: "wildcard in the middle",
7276 apexAvailable: "com.foo*.*",
7277 expectedError: "not allowed in the middle",
7278 },
7279 {
7280 name: "hint with prefix pattern",
7281 apexAvailable: "//apex_available:platform",
7282 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7283 },
7284 } {
7285 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007286 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007287 errorHandler := android.FixtureExpectsNoErrors
7288 if tc.expectedError != "" {
7289 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7290 }
7291 context := android.GroupFixturePreparers(
7292 prepareForApexTest,
7293 android.FixtureMergeMockFs(android.MockFS{
7294 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7295 }),
7296 ).ExtendWithErrorHandler(errorHandler)
7297
7298 context.RunTestWithBp(t, `
7299 apex {
7300 name: "com.foo.bar",
7301 key: "myapex.key",
7302 native_shared_libs: ["libfoo"],
7303 updatable: false,
7304 }
7305
7306 apex_key {
7307 name: "myapex.key",
7308 public_key: "testkey.avbpubkey",
7309 private_key: "testkey.pem",
7310 }
7311
7312 cc_library {
7313 name: "libfoo",
7314 stl: "none",
7315 system_shared_libs: [],
7316 apex_available: ["`+tc.apexAvailable+`"],
7317 }`)
7318 })
7319 }
7320 testApexError(t, `Consider adding "com.foo" to`, `
7321 apex {
7322 name: "com.foo", // too short for a partner apex
7323 key: "myapex.key",
7324 native_shared_libs: ["libfoo"],
7325 updatable: false,
7326 }
7327
7328 apex_key {
7329 name: "myapex.key",
7330 public_key: "testkey.avbpubkey",
7331 private_key: "testkey.pem",
7332 }
7333
7334 cc_library {
7335 name: "libfoo",
7336 stl: "none",
7337 system_shared_libs: [],
7338 }
7339 `)
7340}
7341
Jooyung Han5f7fa502025-01-14 16:52:14 +09007342func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7343 t.Parallel()
7344 ctx := testApex(t, `
7345 apex {
7346 name: "myapex",
7347 key: "myapex.key",
7348 updatable: false,
7349 vendor: true,
7350 }
7351 apex_key {
7352 name: "myapex.key",
7353 public_key: "testkey.avbpubkey",
7354 private_key: "testkey.pem",
7355 }
7356 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7357 // vendor path should not affect "partition tag"
7358 variables.VendorPath = proptools.StringPtr("system/vendor")
7359 }))
7360
7361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7362 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7363 "vendor",
7364 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7365 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7366 "vendor",
7367 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7368}
7369
Jooyung Hanb9518072024-11-22 14:05:20 +09007370func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7371 t.Parallel()
7372 ctx := testApex(t, `
7373 apex_test {
7374 name: "myapex",
7375 key: "myapex.key",
7376 skip_validations: {
7377 host_apex_verifier: true,
7378 },
7379 updatable: false,
7380 }
7381 apex_key {
7382 name: "myapex.key",
7383 public_key: "testkey.avbpubkey",
7384 private_key: "testkey.pem",
7385 }
7386 `)
7387
7388 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7389 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7390 t.Error("should not run host_apex_verifier")
7391 }
7392}
7393
7394func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7395 t.Parallel()
7396 ctx := testApex(t, `
7397 apex_test {
7398 name: "myapex",
7399 key: "myapex.key",
7400 updatable: false,
7401 }
7402 apex_key {
7403 name: "myapex.key",
7404 public_key: "testkey.avbpubkey",
7405 private_key: "testkey.pem",
7406 }
7407 `)
7408
7409 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7410 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7411 t.Error("should run host_apex_verifier")
7412 }
7413}
7414
Jiyong Park5d790c32019-11-15 18:40:32 +09007415func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007416 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007417 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007418 apex {
7419 name: "myapex",
7420 key: "myapex.key",
7421 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007422 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007423 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007424 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007425 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007426 }
7427
7428 override_apex {
7429 name: "override_myapex",
7430 base: "myapex",
7431 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007432 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007433 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007434 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007435 compile_multilib: "first",
7436 multilib: {
7437 lib32: {
7438 native_shared_libs: ["mylib32"],
7439 },
7440 lib64: {
7441 native_shared_libs: ["mylib64"],
7442 },
7443 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007444 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007445 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007446 key: "mynewapex.key",
7447 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007448 }
7449
7450 apex_key {
7451 name: "myapex.key",
7452 public_key: "testkey.avbpubkey",
7453 private_key: "testkey.pem",
7454 }
7455
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007456 apex_key {
7457 name: "mynewapex.key",
7458 public_key: "testkey2.avbpubkey",
7459 private_key: "testkey2.pem",
7460 }
7461
7462 android_app_certificate {
7463 name: "myapex.certificate",
7464 certificate: "testkey",
7465 }
7466
Jiyong Park5d790c32019-11-15 18:40:32 +09007467 android_app {
7468 name: "app",
7469 srcs: ["foo/bar/MyClass.java"],
7470 package_name: "foo",
7471 sdk_version: "none",
7472 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007473 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007474 }
7475
7476 override_android_app {
7477 name: "override_app",
7478 base: "app",
7479 package_name: "bar",
7480 }
markchien7c803b82021-08-26 22:10:06 +08007481
7482 bpf {
7483 name: "bpf",
7484 srcs: ["bpf.c"],
7485 }
7486
7487 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007488 name: "overrideBpf",
7489 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007490 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007491
7492 prebuilt_etc {
7493 name: "myetc",
7494 src: "myprebuilt",
7495 }
7496
7497 prebuilt_etc {
7498 name: "override_myetc",
7499 src: "override_myprebuilt",
7500 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007501
7502 cc_library {
7503 name: "mylib32",
7504 apex_available: [ "myapex" ],
7505 }
7506
7507 cc_library {
7508 name: "mylib64",
7509 apex_available: [ "myapex" ],
7510 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007511 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007512
Jooyung Hana0503a52023-08-23 13:12:50 +09007513 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007514 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007515 if originalVariant.GetOverriddenBy() != "" {
7516 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7517 }
7518 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7519 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7520 }
7521
Spandan Das50801e22024-05-13 18:29:45 +00007522 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007523 apexRule := module.Rule("apexRule")
7524 copyCmds := apexRule.Args["copy_commands"]
7525
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007526 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7527 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007528
markchien7c803b82021-08-26 22:10:06 +08007529 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007530 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007531
Daniel Norman5a3ce132021-08-26 15:44:43 -07007532 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7533 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7534
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007535 apexBundle := module.Module().(*apexBundle)
7536 name := apexBundle.Name()
7537 if name != "override_myapex" {
7538 t.Errorf("name should be \"override_myapex\", but was %q", name)
7539 }
7540
Baligh Uddin004d7172020-02-19 21:29:28 -08007541 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7542 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7543 }
7544
Jiyong Park20bacab2020-03-03 11:45:41 +09007545 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007546 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007547 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7548
7549 signApkRule := module.Rule("signapk")
7550 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007551
Colin Crossaa255532020-07-03 13:18:24 -07007552 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007553 var builder strings.Builder
7554 data.Custom(&builder, name, "TARGET_", "", data)
7555 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007556 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7557 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007558 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007559 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007560 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007561 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007562 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007563 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007564}
7565
Albert Martineefabcf2022-03-21 20:11:16 +00007566func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007567 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007568 // Override from 29 to 31
7569 minSdkOverride31 := "31"
7570 ctx := testApex(t, `
7571 apex {
7572 name: "myapex",
7573 key: "myapex.key",
7574 native_shared_libs: ["mylib"],
7575 updatable: true,
7576 min_sdk_version: "29"
7577 }
7578
7579 override_apex {
7580 name: "override_myapex",
7581 base: "myapex",
7582 logging_parent: "com.foo.bar",
7583 package_name: "test.overridden.package"
7584 }
7585
7586 apex_key {
7587 name: "myapex.key",
7588 public_key: "testkey.avbpubkey",
7589 private_key: "testkey.pem",
7590 }
7591
7592 cc_library {
7593 name: "mylib",
7594 srcs: ["mylib.cpp"],
7595 runtime_libs: ["libbar"],
7596 system_shared_libs: [],
7597 stl: "none",
7598 apex_available: [ "myapex" ],
7599 min_sdk_version: "apex_inherit"
7600 }
7601
7602 cc_library {
7603 name: "libbar",
7604 srcs: ["mylib.cpp"],
7605 system_shared_libs: [],
7606 stl: "none",
7607 apex_available: [ "myapex" ],
7608 min_sdk_version: "apex_inherit"
7609 }
7610
7611 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7612
Jooyung Hana0503a52023-08-23 13:12:50 +09007613 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007614 copyCmds := apexRule.Args["copy_commands"]
7615
7616 // Ensure that direct non-stubs dep is always included
7617 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7618
7619 // Ensure that runtime_libs dep in included
7620 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7621
7622 // Ensure libraries target overridden min_sdk_version value
7623 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7624}
7625
7626func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007627 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007628 // Attempt to override from 31 to 29, should be a NOOP
7629 minSdkOverride29 := "29"
7630 ctx := testApex(t, `
7631 apex {
7632 name: "myapex",
7633 key: "myapex.key",
7634 native_shared_libs: ["mylib"],
7635 updatable: true,
7636 min_sdk_version: "31"
7637 }
7638
7639 override_apex {
7640 name: "override_myapex",
7641 base: "myapex",
7642 logging_parent: "com.foo.bar",
7643 package_name: "test.overridden.package"
7644 }
7645
7646 apex_key {
7647 name: "myapex.key",
7648 public_key: "testkey.avbpubkey",
7649 private_key: "testkey.pem",
7650 }
7651
7652 cc_library {
7653 name: "mylib",
7654 srcs: ["mylib.cpp"],
7655 runtime_libs: ["libbar"],
7656 system_shared_libs: [],
7657 stl: "none",
7658 apex_available: [ "myapex" ],
7659 min_sdk_version: "apex_inherit"
7660 }
7661
7662 cc_library {
7663 name: "libbar",
7664 srcs: ["mylib.cpp"],
7665 system_shared_libs: [],
7666 stl: "none",
7667 apex_available: [ "myapex" ],
7668 min_sdk_version: "apex_inherit"
7669 }
7670
7671 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7672
Jooyung Hana0503a52023-08-23 13:12:50 +09007673 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007674 copyCmds := apexRule.Args["copy_commands"]
7675
7676 // Ensure that direct non-stubs dep is always included
7677 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7678
7679 // Ensure that runtime_libs dep in included
7680 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7681
7682 // Ensure libraries target the original min_sdk_version value rather than the overridden
7683 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7684}
7685
Jooyung Han214bf372019-11-12 13:03:50 +09007686func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007687 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007689 apex {
7690 name: "myapex",
7691 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007692 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007693 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007694 }
7695
7696 apex_key {
7697 name: "myapex.key",
7698 public_key: "testkey.avbpubkey",
7699 private_key: "testkey.pem",
7700 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007701
7702 cc_library {
7703 name: "mylib",
7704 srcs: ["mylib.cpp"],
7705 stl: "libc++",
7706 system_shared_libs: [],
7707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007708 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007709 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007710 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007711
Jooyung Hana0503a52023-08-23 13:12:50 +09007712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007713 args := module.Rule("apexRule").Args
7714 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007715
7716 // The copies of the libraries in the apex should have one more dependency than
7717 // the ones outside the apex, namely the unwinder. Ideally we should check
7718 // the dependency names directly here but for some reason the names are blank in
7719 // this test.
7720 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007721 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007722 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7723 if len(apexImplicits) != len(nonApexImplicits)+1 {
7724 t.Errorf("%q missing unwinder dep", lib)
7725 }
7726 }
Jooyung Han214bf372019-11-12 13:03:50 +09007727}
7728
Paul Duffine05480a2021-03-08 15:07:14 +00007729var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007730 "api/current.txt": nil,
7731 "api/removed.txt": nil,
7732 "api/system-current.txt": nil,
7733 "api/system-removed.txt": nil,
7734 "api/test-current.txt": nil,
7735 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007736
Anton Hanssondff2c782020-12-21 17:10:01 +00007737 "100/public/api/foo.txt": nil,
7738 "100/public/api/foo-removed.txt": nil,
7739 "100/system/api/foo.txt": nil,
7740 "100/system/api/foo-removed.txt": nil,
7741
Paul Duffineedc5d52020-06-12 17:46:39 +01007742 // For java_sdk_library_import
7743 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007744}
7745
Jooyung Han58f26ab2019-12-18 15:34:32 +09007746func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007747 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007748 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007749 apex {
7750 name: "myapex",
7751 key: "myapex.key",
7752 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007753 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007754 }
7755
7756 apex_key {
7757 name: "myapex.key",
7758 public_key: "testkey.avbpubkey",
7759 private_key: "testkey.pem",
7760 }
7761
7762 java_sdk_library {
7763 name: "foo",
7764 srcs: ["a.java"],
7765 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007766 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007767 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007768
7769 prebuilt_apis {
7770 name: "sdk",
7771 api_dirs: ["100"],
7772 }
Paul Duffin9b879592020-05-26 13:21:35 +01007773 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007774
7775 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007776 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007777 "javalib/foo.jar",
7778 "etc/permissions/foo.xml",
7779 })
7780 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007781 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7782 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7783 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007784}
7785
Spandan Das3ee19692024-06-19 04:47:40 +00007786func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007787 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007788 ctx := testApex(t, `
7789 override_apex {
7790 name: "mycompanyapex",
7791 base: "myapex",
7792 }
7793 apex {
7794 name: "myapex",
7795 key: "myapex.key",
7796 java_libs: ["foo"],
7797 updatable: false,
7798 }
7799
7800 apex_key {
7801 name: "myapex.key",
7802 public_key: "testkey.avbpubkey",
7803 private_key: "testkey.pem",
7804 }
7805
7806 java_sdk_library {
7807 name: "foo",
7808 srcs: ["a.java"],
7809 api_packages: ["foo"],
7810 apex_available: [ "myapex" ],
7811 }
7812
7813 prebuilt_apis {
7814 name: "sdk",
7815 api_dirs: ["100"],
7816 }
7817 `, withFiles(filesForSdkLibrary))
7818
7819 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7820 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7821 // (com.android.foo), the filepath should not contain override apex name.
7822 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7823 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7824 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7825}
7826
Paul Duffin9b879592020-05-26 13:21:35 +01007827func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007828 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007829 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
7833 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007834 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 java_sdk_library {
7844 name: "foo",
7845 srcs: ["a.java"],
7846 api_packages: ["foo"],
7847 apex_available: ["myapex"],
7848 sdk_version: "none",
7849 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007850 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007851 }
7852
7853 java_library {
7854 name: "bar",
7855 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007856 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007857 apex_available: ["myapex"],
7858 sdk_version: "none",
7859 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007860 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007861 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007862
7863 prebuilt_apis {
7864 name: "sdk",
7865 api_dirs: ["100"],
7866 }
Paul Duffin9b879592020-05-26 13:21:35 +01007867 `, withFiles(filesForSdkLibrary))
7868
7869 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007870 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007871 "javalib/bar.jar",
7872 "javalib/foo.jar",
7873 "etc/permissions/foo.xml",
7874 })
7875
7876 // The bar library should depend on the implementation jar.
7877 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007878 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007879 t.Errorf("expected %q, found %#q", expected, actual)
7880 }
7881}
7882
7883func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007885 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007886 apex {
7887 name: "myapex",
7888 key: "myapex.key",
7889 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007890 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007891 }
7892
7893 apex_key {
7894 name: "myapex.key",
7895 public_key: "testkey.avbpubkey",
7896 private_key: "testkey.pem",
7897 }
7898
7899 java_sdk_library {
7900 name: "foo",
7901 srcs: ["a.java"],
7902 api_packages: ["foo"],
7903 apex_available: ["myapex"],
7904 sdk_version: "none",
7905 system_modules: "none",
7906 }
7907
7908 java_library {
7909 name: "bar",
7910 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007911 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007912 sdk_version: "none",
7913 system_modules: "none",
7914 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007915
7916 prebuilt_apis {
7917 name: "sdk",
7918 api_dirs: ["100"],
7919 }
Paul Duffin9b879592020-05-26 13:21:35 +01007920 `, withFiles(filesForSdkLibrary))
7921
7922 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007923 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007924 "javalib/foo.jar",
7925 "etc/permissions/foo.xml",
7926 })
7927
7928 // The bar library should depend on the stubs jar.
7929 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007930 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007931 t.Errorf("expected %q, found %#q", expected, actual)
7932 }
7933}
7934
Paul Duffineedc5d52020-06-12 17:46:39 +01007935func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007936 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007937 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007938 prebuilt_apis {
7939 name: "sdk",
7940 api_dirs: ["100"],
7941 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007942 withFiles(map[string][]byte{
7943 "apex/a.java": nil,
7944 "apex/apex_manifest.json": nil,
7945 "apex/Android.bp": []byte(`
7946 package {
7947 default_visibility: ["//visibility:private"],
7948 }
7949
7950 apex {
7951 name: "myapex",
7952 key: "myapex.key",
7953 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007954 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007955 }
7956
7957 apex_key {
7958 name: "myapex.key",
7959 public_key: "testkey.avbpubkey",
7960 private_key: "testkey.pem",
7961 }
7962
7963 java_library {
7964 name: "bar",
7965 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007966 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007967 apex_available: ["myapex"],
7968 sdk_version: "none",
7969 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007970 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007971 }
7972`),
7973 "source/a.java": nil,
7974 "source/api/current.txt": nil,
7975 "source/api/removed.txt": nil,
7976 "source/Android.bp": []byte(`
7977 package {
7978 default_visibility: ["//visibility:private"],
7979 }
7980
7981 java_sdk_library {
7982 name: "foo",
7983 visibility: ["//apex"],
7984 srcs: ["a.java"],
7985 api_packages: ["foo"],
7986 apex_available: ["myapex"],
7987 sdk_version: "none",
7988 system_modules: "none",
7989 public: {
7990 enabled: true,
7991 },
Colin Crosse4f34882024-11-14 12:26:00 -08007992 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007993 }
7994`),
7995 "prebuilt/a.jar": nil,
7996 "prebuilt/Android.bp": []byte(`
7997 package {
7998 default_visibility: ["//visibility:private"],
7999 }
8000
8001 java_sdk_library_import {
8002 name: "foo",
8003 visibility: ["//apex", "//source"],
8004 apex_available: ["myapex"],
8005 prefer: true,
8006 public: {
8007 jars: ["a.jar"],
8008 },
Colin Crosse4f34882024-11-14 12:26:00 -08008009 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008010 }
8011`),
Anton Hanssondff2c782020-12-21 17:10:01 +00008012 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01008013 )
8014
8015 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09008016 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01008017 "javalib/bar.jar",
8018 "javalib/foo.jar",
8019 "etc/permissions/foo.xml",
8020 })
8021
8022 // The bar library should depend on the implementation jar.
8023 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00008024 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01008025 t.Errorf("expected %q, found %#q", expected, actual)
8026 }
8027}
8028
8029func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008030 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01008031 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
8032 apex {
8033 name: "myapex",
8034 key: "myapex.key",
8035 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008036 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008037 }
8038
8039 apex_key {
8040 name: "myapex.key",
8041 public_key: "testkey.avbpubkey",
8042 private_key: "testkey.pem",
8043 }
8044
8045 java_sdk_library_import {
8046 name: "foo",
8047 apex_available: ["myapex"],
8048 prefer: true,
8049 public: {
8050 jars: ["a.jar"],
8051 },
8052 }
8053
8054 `, withFiles(filesForSdkLibrary))
8055}
8056
atrost6e126252020-01-27 17:01:16 +00008057func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008058 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01008059 result := android.GroupFixturePreparers(
8060 prepareForApexTest,
8061 java.PrepareForTestWithPlatformCompatConfig,
8062 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00008063 apex {
8064 name: "myapex",
8065 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008066 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008067 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008068 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008069 }
8070
8071 apex_key {
8072 name: "myapex.key",
8073 public_key: "testkey.avbpubkey",
8074 private_key: "testkey.pem",
8075 }
8076
8077 platform_compat_config {
8078 name: "myjar-platform-compat-config",
8079 src: ":myjar",
8080 }
8081
8082 java_library {
8083 name: "myjar",
8084 srcs: ["foo/bar/MyClass.java"],
8085 sdk_version: "none",
8086 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008087 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008088 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008089 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008090
8091 // Make sure that a preferred prebuilt does not affect the apex contents.
8092 prebuilt_platform_compat_config {
8093 name: "myjar-platform-compat-config",
8094 metadata: "compat-config/metadata.xml",
8095 prefer: true,
8096 }
atrost6e126252020-01-27 17:01:16 +00008097 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008098 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008099 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008100 "etc/compatconfig/myjar-platform-compat-config.xml",
8101 "javalib/myjar.jar",
8102 })
8103}
8104
Jooyung Han862c0d62022-12-21 10:15:37 +09008105func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008106 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008107 android.GroupFixturePreparers(
8108 android.PrepareForTestWithAndroidBuildComponents,
8109 PrepareForTestWithApexBuildComponents,
8110 prepareForTestWithMyapex,
8111 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8112 ).
8113 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8114 RunTestWithBp(t, `
8115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
8118 prebuilts: ["foo", "bar"],
8119 updatable: false,
8120 }
8121
8122 apex_key {
8123 name: "myapex.key",
8124 public_key: "testkey.avbpubkey",
8125 private_key: "testkey.pem",
8126 }
8127
8128 prebuilt_etc {
8129 name: "foo",
8130 src: "myprebuilt",
8131 filename_from_src: true,
8132 }
8133
8134 prebuilt_etc {
8135 name: "bar",
8136 src: "myprebuilt",
8137 filename_from_src: true,
8138 }
8139 `)
8140}
8141
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008142func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008143 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008144 bp := `
8145 apex {
8146 name: "myapex",
8147 key: "myapex.key",
8148 native_shared_libs: ["libfoo"],
8149 updatable: false,
8150 unwanted_transitive_deps: ["libbar"],
8151 }
8152
8153 apex_key {
8154 name: "myapex.key",
8155 public_key: "testkey.avbpubkey",
8156 private_key: "testkey.pem",
8157 }
8158
8159 cc_library {
8160 name: "libfoo",
8161 srcs: ["foo.cpp"],
8162 shared_libs: ["libbar"],
8163 apex_available: ["myapex"],
8164 }
8165
8166 cc_library {
8167 name: "libbar",
8168 srcs: ["bar.cpp"],
8169 apex_available: ["myapex"],
8170 }`
8171 ctx := testApex(t, bp)
8172 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8173 "*/libc++.so",
8174 "*/libfoo.so",
8175 // not libbar.so
8176 })
8177}
8178
Jiyong Park479321d2019-12-16 11:47:12 +09008179func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008180 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008181 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8182 apex {
8183 name: "myapex",
8184 key: "myapex.key",
8185 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008186 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008187 }
8188
8189 apex_key {
8190 name: "myapex.key",
8191 public_key: "testkey.avbpubkey",
8192 private_key: "testkey.pem",
8193 }
8194
8195 java_library {
8196 name: "myjar",
8197 srcs: ["foo/bar/MyClass.java"],
8198 sdk_version: "none",
8199 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008200 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008201 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008202 }
8203 `)
8204}
8205
Jiyong Park7cd10e32020-01-14 09:22:18 +09008206func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008207 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008208 bp := `
8209 apex {
8210 name: "myapex",
8211 key: "myapex.key",
8212 native_shared_libs: ["mylib"],
8213 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008214 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008215 }
8216
Jiyong Park9d677202020-02-19 16:29:35 +09008217 apex {
8218 name: "myapex.updatable",
8219 key: "myapex.key",
8220 native_shared_libs: ["mylib"],
8221 java_libs: ["myjar"],
8222 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008223 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008224 }
8225
Jiyong Park7cd10e32020-01-14 09:22:18 +09008226 apex_key {
8227 name: "myapex.key",
8228 public_key: "testkey.avbpubkey",
8229 private_key: "testkey.pem",
8230 }
8231
8232 cc_library {
8233 name: "mylib",
8234 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008235 shared_libs: [
8236 "myotherlib",
8237 "myotherlib_ext",
8238 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008239 system_shared_libs: [],
8240 stl: "none",
8241 apex_available: [
8242 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008243 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008244 "//apex_available:platform",
8245 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008246 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008247 }
8248
8249 cc_library {
8250 name: "myotherlib",
8251 srcs: ["mylib.cpp"],
8252 system_shared_libs: [],
8253 stl: "none",
8254 apex_available: [
8255 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008256 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008257 "//apex_available:platform",
8258 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008259 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008260 }
8261
Jiyong Parkce243632023-02-17 18:22:25 +09008262 cc_library {
8263 name: "myotherlib_ext",
8264 srcs: ["mylib.cpp"],
8265 system_shared_libs: [],
8266 system_ext_specific: true,
8267 stl: "none",
8268 apex_available: [
8269 "myapex",
8270 "myapex.updatable",
8271 "//apex_available:platform",
8272 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008273 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008274 }
8275
Jiyong Park7cd10e32020-01-14 09:22:18 +09008276 java_library {
8277 name: "myjar",
8278 srcs: ["foo/bar/MyClass.java"],
8279 sdk_version: "none",
8280 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008281 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008282 apex_available: [
8283 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008284 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008285 "//apex_available:platform",
8286 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008287 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008288 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008289 }
8290
8291 java_library {
8292 name: "myotherjar",
8293 srcs: ["foo/bar/MyClass.java"],
8294 sdk_version: "none",
8295 system_modules: "none",
8296 apex_available: [
8297 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008298 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008299 "//apex_available:platform",
8300 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008301 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008302 }
8303 `
8304
8305 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8306 for _, f := range files {
8307 if f.path == file {
8308 if f.isLink {
8309 t.Errorf("%q is not a real file", file)
8310 }
8311 return
8312 }
8313 }
8314 t.Errorf("%q is not found", file)
8315 }
8316
Jiyong Parkce243632023-02-17 18:22:25 +09008317 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008318 for _, f := range files {
8319 if f.path == file {
8320 if !f.isLink {
8321 t.Errorf("%q is not a symlink", file)
8322 }
Jiyong Parkce243632023-02-17 18:22:25 +09008323 if f.src != target {
8324 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8325 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008326 return
8327 }
8328 }
8329 t.Errorf("%q is not found", file)
8330 }
8331
Jiyong Park9d677202020-02-19 16:29:35 +09008332 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8333 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008334 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008335 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008336 ensureRealfileExists(t, files, "javalib/myjar.jar")
8337 ensureRealfileExists(t, files, "lib64/mylib.so")
8338 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008339 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008340
Jooyung Hana0503a52023-08-23 13:12:50 +09008341 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008342 ensureRealfileExists(t, files, "javalib/myjar.jar")
8343 ensureRealfileExists(t, files, "lib64/mylib.so")
8344 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008345 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008346
8347 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008348 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008349 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008350 ensureRealfileExists(t, files, "javalib/myjar.jar")
8351 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008352 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8353 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008354
Jooyung Hana0503a52023-08-23 13:12:50 +09008355 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008356 ensureRealfileExists(t, files, "javalib/myjar.jar")
8357 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008358 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8359 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008360}
8361
Yo Chiange8128052020-07-23 20:09:18 +08008362func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008363 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008364 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008365 apex {
8366 name: "myapex",
8367 key: "myapex.key",
8368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008369 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008370 }
8371
8372 apex_key {
8373 name: "myapex.key",
8374 public_key: "testkey.avbpubkey",
8375 private_key: "testkey.pem",
8376 }
8377
8378 cc_library_shared {
8379 name: "mylib",
8380 srcs: ["mylib.cpp"],
8381 shared_libs: ["myotherlib"],
8382 system_shared_libs: [],
8383 stl: "none",
8384 apex_available: [
8385 "myapex",
8386 "//apex_available:platform",
8387 ],
8388 }
8389
8390 cc_prebuilt_library_shared {
8391 name: "myotherlib",
8392 srcs: ["prebuilt.so"],
8393 system_shared_libs: [],
8394 stl: "none",
8395 apex_available: [
8396 "myapex",
8397 "//apex_available:platform",
8398 ],
8399 }
8400 `)
8401
Jooyung Hana0503a52023-08-23 13:12:50 +09008402 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008403 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008404 var builder strings.Builder
8405 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8406 androidMk := builder.String()
8407 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008408 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008409 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8410 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8411 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008412 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008413}
8414
Jooyung Han643adc42020-02-27 13:50:06 +09008415func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008416 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008417 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008418 apex {
8419 name: "myapex",
8420 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008421 binaries: ["mybin"],
8422 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008423 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008424 }
8425
8426 apex_key {
8427 name: "myapex.key",
8428 public_key: "testkey.avbpubkey",
8429 private_key: "testkey.pem",
8430 }
8431
8432 cc_library {
8433 name: "mylib",
8434 srcs: ["mylib.cpp"],
8435 shared_libs: ["mylib2"],
8436 system_shared_libs: [],
8437 stl: "none",
8438 apex_available: [ "myapex" ],
8439 }
8440
8441 cc_library {
8442 name: "mylib2",
8443 srcs: ["mylib.cpp"],
8444 system_shared_libs: [],
8445 stl: "none",
8446 apex_available: [ "myapex" ],
8447 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008448
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008449 // Used as both a JNI library and a regular shared library.
8450 cc_library {
8451 name: "mylib3",
8452 srcs: ["mylib.cpp"],
8453 system_shared_libs: [],
8454 stl: "none",
8455 apex_available: [ "myapex" ],
8456 }
8457
8458 cc_binary {
8459 name: "mybin",
8460 srcs: ["mybin.cpp"],
8461 shared_libs: ["mylib3"],
8462 system_shared_libs: [],
8463 stl: "none",
8464 apex_available: [ "myapex" ],
8465 }
8466
Jiyong Park34d5c332022-02-24 18:02:44 +09008467 rust_ffi_shared {
8468 name: "libfoo.rust",
8469 crate_name: "foo",
8470 srcs: ["foo.rs"],
8471 shared_libs: ["libfoo.shared_from_rust"],
8472 prefer_rlib: true,
8473 apex_available: ["myapex"],
8474 }
8475
8476 cc_library_shared {
8477 name: "libfoo.shared_from_rust",
8478 srcs: ["mylib.cpp"],
8479 system_shared_libs: [],
8480 stl: "none",
8481 stubs: {
8482 versions: ["10", "11", "12"],
8483 },
8484 }
8485
Jooyung Han643adc42020-02-27 13:50:06 +09008486 `)
8487
Jooyung Hana0503a52023-08-23 13:12:50 +09008488 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008489 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008490 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008491 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008492 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008493 "lib64/mylib.so",
8494 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008495 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008496 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008497 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008498
8499 // b/220397949
8500 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008501}
8502
Jooyung Han49f67012020-04-17 13:43:10 +09008503func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008504 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008505 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008506 apex {
8507 name: "myapex",
8508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008509 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008510 }
8511 apex_key {
8512 name: "myapex.key",
8513 public_key: "testkey.avbpubkey",
8514 private_key: "testkey.pem",
8515 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008516 `,
8517 android.FixtureModifyConfig(func(config android.Config) {
8518 delete(config.Targets, android.Android)
8519 config.AndroidCommonTarget = android.Target{}
8520 }),
8521 )
Jooyung Han49f67012020-04-17 13:43:10 +09008522
8523 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8524 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8525 }
8526}
8527
Jiyong Parkbd159612020-02-28 15:22:21 +09008528func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008529 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008530 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008531 apex {
8532 name: "myapex",
8533 key: "myapex.key",
8534 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008535 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008536 }
8537
8538 apex_key {
8539 name: "myapex.key",
8540 public_key: "testkey.avbpubkey",
8541 private_key: "testkey.pem",
8542 }
8543
8544 android_app {
8545 name: "AppFoo",
8546 srcs: ["foo/bar/MyClass.java"],
8547 sdk_version: "none",
8548 system_modules: "none",
8549 apex_available: [ "myapex" ],
8550 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008551 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008552
Jooyung Hana0503a52023-08-23 13:12:50 +09008553 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008554 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008555
8556 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008557 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 +09008558}
8559
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008560func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008561 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008562 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008563 apex {
8564 name: "myapex",
8565 key: "myapex.key",
8566 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008567 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008568 }
8569
8570 apex_key {
8571 name: "myapex.key",
8572 public_key: "testkey.avbpubkey",
8573 private_key: "testkey.pem",
8574 }
8575
8576 android_app_set {
8577 name: "AppSet",
8578 set: "AppSet.apks",
8579 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008580 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008581 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008582 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008583 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8584 s := mod.Rule("apexRule").Args["copy_commands"]
8585 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008586 if len(copyCmds) != 4 {
8587 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008588 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008589 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8590 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008591 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8592 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008593
8594 // Ensure that canned_fs_config has an entry for the app set zip file
8595 generateFsRule := mod.Rule("generateFsConfig")
8596 cmd := generateFsRule.RuleParams.Command
8597 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008598}
8599
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008600func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008601 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008602 apex_set {
8603 name: "myapex",
8604 filename: "foo_v2.apex",
8605 sanitized: {
8606 none: { set: "myapex.apks", },
8607 hwaddress: { set: "myapex.hwasan.apks", },
8608 },
Paul Duffin24704672021-04-06 16:09:30 +01008609 }
8610 `
8611 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008612
Paul Duffin24704672021-04-06 16:09:30 +01008613 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008614 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008615
Spandan Das9d6e2092024-09-21 02:50:00 +00008616 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008617 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008618
Paul Duffin24704672021-04-06 16:09:30 +01008619 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8620
8621 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008622 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8623 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008624
8625 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008626}
8627
Pranav Guptaeba03b02022-09-27 00:27:08 +00008628func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008629 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008630 ctx := testApex(t, `
8631 apex_set {
8632 name: "myapex",
8633 set: ":myapex_apks_file",
8634 }
8635
8636 filegroup {
8637 name: "myapex_apks_file",
8638 srcs: ["myapex.apks"],
8639 }
8640 `)
8641
Spandan Das9d6e2092024-09-21 02:50:00 +00008642 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008643
8644 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008645 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008646 extractedApex := m.Output(extractorOutput)
8647
8648 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8649}
8650
Paul Duffin89f570a2021-06-16 01:42:33 +01008651func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008652 t.Helper()
8653
Paul Duffin55607122021-03-30 23:32:51 +01008654 fs := android.MockFS{
8655 "a.java": nil,
8656 "a.jar": nil,
8657 "apex_manifest.json": nil,
8658 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008659 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008660 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8661 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8662 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008663 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008664 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008665
Paul Duffin55607122021-03-30 23:32:51 +01008666 errorHandler := android.FixtureExpectsNoErrors
8667 if errmsg != "" {
8668 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008669 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008670
Paul Duffin55607122021-03-30 23:32:51 +01008671 result := android.GroupFixturePreparers(
8672 cc.PrepareForTestWithCcDefaultModules,
8673 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008674 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008675 java.PrepareForTestWithJavaSdkLibraryFiles,
8676 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008677 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008678 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008679 android.FixtureModifyMockFS(func(fs android.MockFS) {
8680 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8681 insert := ""
8682 for _, fragment := range fragments {
8683 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8684 }
8685 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8686 platform_bootclasspath {
8687 name: "platform-bootclasspath",
8688 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008689 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008690 %s
8691 ],
8692 }
8693 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008694 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008695 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008696 // Dexpreopt for boot jars requires the ART boot image profile.
8697 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8698 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008699 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008700 ).
8701 ExtendWithErrorHandler(errorHandler).
8702 RunTestWithBp(t, bp)
8703
8704 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008705}
8706
Jooyung Han548640b2020-04-27 12:10:30 +09008707func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008708 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008709 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8710 apex {
8711 name: "myapex",
8712 key: "myapex.key",
8713 updatable: true,
8714 }
8715
8716 apex_key {
8717 name: "myapex.key",
8718 public_key: "testkey.avbpubkey",
8719 private_key: "testkey.pem",
8720 }
8721 `)
8722}
8723
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008725 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008726 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 }
8731
8732 apex_key {
8733 name: "myapex.key",
8734 public_key: "testkey.avbpubkey",
8735 private_key: "testkey.pem",
8736 }
8737 `)
8738}
8739
satayevb98371c2021-06-15 16:49:50 +01008740func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008741 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008742 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 systemserverclasspath_fragments: [
8747 "mysystemserverclasspathfragment",
8748 ],
8749 min_sdk_version: "29",
8750 updatable: true,
8751 }
8752
8753 apex_key {
8754 name: "myapex.key",
8755 public_key: "testkey.avbpubkey",
8756 private_key: "testkey.pem",
8757 }
8758
8759 java_library {
8760 name: "foo",
8761 srcs: ["b.java"],
8762 min_sdk_version: "29",
8763 installable: true,
8764 apex_available: [
8765 "myapex",
8766 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008767 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008768 }
8769
8770 systemserverclasspath_fragment {
8771 name: "mysystemserverclasspathfragment",
8772 generate_classpaths_proto: false,
8773 contents: [
8774 "foo",
8775 ],
8776 apex_available: [
8777 "myapex",
8778 ],
8779 }
satayevabcd5972021-08-06 17:49:46 +01008780 `,
8781 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8782 )
satayevb98371c2021-06-15 16:49:50 +01008783}
8784
Paul Duffin064b70c2020-11-02 17:32:38 +00008785func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008786 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008787 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008788 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008789 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008790 fragment := java.ApexVariantReference{
8791 Apex: proptools.StringPtr("myapex"),
8792 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8793 }
8794
Paul Duffin064b70c2020-11-02 17:32:38 +00008795 testDexpreoptWithApexes(t, `
8796 prebuilt_apex {
8797 name: "myapex" ,
8798 arch: {
8799 arm64: {
8800 src: "myapex-arm64.apex",
8801 },
8802 arm: {
8803 src: "myapex-arm.apex",
8804 },
8805 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008806 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8807 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008808
Paul Duffin89f570a2021-06-16 01:42:33 +01008809 prebuilt_bootclasspath_fragment {
8810 name: "my-bootclasspath-fragment",
8811 contents: ["libfoo"],
8812 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008813 hidden_api: {
8814 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8815 metadata: "my-bootclasspath-fragment/metadata.csv",
8816 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008817 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8818 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8819 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008820 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008821 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008822
Spandan Das52c01a12024-09-20 01:09:48 +00008823 java_sdk_library_import {
8824 name: "libfoo",
8825 prefer: true,
8826 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008827 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008828 },
8829 apex_available: ["myapex"],
8830 shared_library: false,
8831 permitted_packages: ["libfoo"],
8832 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008833 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008834 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008835}
8836
Spandan Dasf14e2542021-11-12 00:01:37 +00008837func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008838 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008839 bp += `
8840 apex_key {
8841 name: "myapex.key",
8842 public_key: "testkey.avbpubkey",
8843 private_key: "testkey.pem",
8844 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008845 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008846 "lib1/src/A.java": nil,
8847 "lib2/src/B.java": nil,
8848 "system/sepolicy/apex/myapex-file_contexts": nil,
8849 }
8850
Paul Duffin45338f02021-03-30 23:07:52 +01008851 errorHandler := android.FixtureExpectsNoErrors
8852 if errmsg != "" {
8853 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008854 }
Colin Crossae8600b2020-10-29 17:09:13 -07008855
Paul Duffin45338f02021-03-30 23:07:52 +01008856 android.GroupFixturePreparers(
8857 android.PrepareForTestWithAndroidBuildComponents,
8858 java.PrepareForTestWithJavaBuildComponents,
8859 PrepareForTestWithApexBuildComponents,
8860 android.PrepareForTestWithNeverallowRules(rules),
8861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008862 apexBootJars := make([]string, 0, len(bootJars))
8863 for _, apexBootJar := range bootJars {
8864 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008865 }
satayevd604b212021-07-21 14:23:52 +01008866 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008867 }),
8868 fs.AddToFixture(),
8869 ).
8870 ExtendWithErrorHandler(errorHandler).
8871 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008872}
8873
8874func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008875 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008876 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008877 name string
8878 expectedError string
8879 bp string
8880 bootJars []string
8881 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008882 }{
8883
8884 {
8885 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8886 expectedError: "",
8887 bp: `
8888 java_library {
8889 name: "bcp_lib1",
8890 srcs: ["lib1/src/*.java"],
8891 permitted_packages: ["foo.bar"],
8892 apex_available: ["myapex"],
8893 sdk_version: "none",
8894 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008895 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008896 }
8897 java_library {
8898 name: "nonbcp_lib2",
8899 srcs: ["lib2/src/*.java"],
8900 apex_available: ["myapex"],
8901 permitted_packages: ["a.b"],
8902 sdk_version: "none",
8903 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008904 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008905 }
8906 apex {
8907 name: "myapex",
8908 key: "myapex.key",
8909 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008910 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008911 }`,
8912 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008913 bcpPermittedPackages: map[string][]string{
8914 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008915 "foo.bar",
8916 },
8917 },
8918 },
8919 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008920 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008921 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 +01008922 bp: `
8923 java_library {
8924 name: "bcp_lib1",
8925 srcs: ["lib1/src/*.java"],
8926 apex_available: ["myapex"],
8927 permitted_packages: ["foo.bar"],
8928 sdk_version: "none",
8929 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008930 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008931 }
8932 java_library {
8933 name: "bcp_lib2",
8934 srcs: ["lib2/src/*.java"],
8935 apex_available: ["myapex"],
8936 permitted_packages: ["foo.bar", "bar.baz"],
8937 sdk_version: "none",
8938 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008939 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008940 }
8941 apex {
8942 name: "myapex",
8943 key: "myapex.key",
8944 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008945 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008946 }
8947 `,
8948 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008949 bcpPermittedPackages: map[string][]string{
8950 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008951 "foo.bar",
8952 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008953 "bcp_lib2": []string{
8954 "foo.bar",
8955 },
8956 },
8957 },
8958 {
8959 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8960 expectedError: "",
8961 bp: `
8962 java_library {
8963 name: "bcp_lib_restricted",
8964 srcs: ["lib1/src/*.java"],
8965 apex_available: ["myapex"],
8966 permitted_packages: ["foo.bar"],
8967 sdk_version: "none",
8968 min_sdk_version: "29",
8969 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008970 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008971 }
8972 java_library {
8973 name: "bcp_lib_unrestricted",
8974 srcs: ["lib2/src/*.java"],
8975 apex_available: ["myapex"],
8976 permitted_packages: ["foo.bar", "bar.baz"],
8977 sdk_version: "none",
8978 min_sdk_version: "29",
8979 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008980 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008981 }
8982 apex {
8983 name: "myapex",
8984 key: "myapex.key",
8985 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8986 updatable: true,
8987 min_sdk_version: "29",
8988 }
8989 `,
8990 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8991 bcpPermittedPackages: map[string][]string{
8992 "bcp_lib1_non_updateable": []string{
8993 "foo.bar",
8994 },
8995 // 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 +01008996 },
8997 },
8998 }
8999 for _, tc := range testcases {
9000 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009001 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00009002 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9003 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009004 })
9005 }
9006}
9007
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009008// TODO(jungjw): Move this to proptools
9009func intPtr(i int) *int {
9010 return &i
9011}
9012
9013func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009014 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009015 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009016 apex_set {
9017 name: "myapex",
9018 set: "myapex.apks",
9019 filename: "foo_v2.apex",
9020 overrides: ["foo"],
9021 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009022 `,
9023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9024 variables.Platform_sdk_version = intPtr(30)
9025 }),
9026 android.FixtureModifyConfig(func(config android.Config) {
9027 config.Targets[android.Android] = []android.Target{
9028 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9029 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9030 }
9031 }),
9032 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033
Spandan Das9d6e2092024-09-21 02:50:00 +00009034 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009035
9036 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009037 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009038 actual := extractedApex.Args["abis"]
9039 expected := "ARMEABI_V7A,ARM64_V8A"
9040 if actual != expected {
9041 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9042 }
9043 actual = extractedApex.Args["sdk-version"]
9044 expected = "30"
9045 if actual != expected {
9046 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9047 }
9048
Paul Duffin6717d882021-06-15 19:09:41 +01009049 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009050 a := m.Module().(*ApexSet)
9051 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009052 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009053 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9054 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9055 }
9056}
9057
Anton Hansson805e0a52022-11-25 14:06:46 +00009058func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009059 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00009060 ctx := testApex(t, `
9061 apex_set {
9062 name: "myapex",
9063 set: "myapex.apks",
9064 filename: "foo_v2.apex",
9065 overrides: ["foo"],
9066 }
9067 `,
9068 android.FixtureModifyConfig(func(config android.Config) {
9069 config.Targets[android.Android] = []android.Target{
9070 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9071 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9072 }
9073 }),
9074 )
9075
Spandan Das9d6e2092024-09-21 02:50:00 +00009076 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009077
9078 // Check extract_apks tool parameters. No native bridge arch expected
9079 extractedApex := m.Output("extracted/myapex.apks")
9080 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9081}
9082
Jiyong Park7d95a512020-05-10 15:16:24 +09009083func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009084 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009085 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9086 apex {
9087 name: "myapex",
9088 key: "myapex.key",
9089 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009090 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009091 }
9092
9093 apex_key {
9094 name: "myapex.key",
9095 public_key: "testkey.avbpubkey",
9096 private_key: "testkey.pem",
9097 }
9098
9099 cc_library {
9100 name: "mylib",
9101 srcs: ["mylib.cpp"],
9102 static_libs: ["otherlib"],
9103 system_shared_libs: [],
9104 stl: "none",
9105 apex_available: [ "myapex" ],
9106 }
9107
9108 cc_library {
9109 name: "otherlib",
9110 srcs: ["mylib.cpp"],
9111 system_shared_libs: [],
9112 stl: "none",
9113 stubs: {
9114 versions: ["1", "2", "3"],
9115 },
9116 apex_available: [ "myapex" ],
9117 }
9118 `)
9119}
9120
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009121func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009122 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009123 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009124 apex {
9125 name: "myapex",
9126 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009127 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009128 custom_sign_tool: "sign_myapex",
9129 }
9130
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136 `)
9137
Jooyung Han286957d2023-10-30 16:17:56 +09009138 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009139 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009140 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 +09009141}
9142
9143func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009144 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009145 ctx := testApex(t, `
9146 apex {
9147 name: "myapex",
9148 key: "myapex.key",
9149 updatable: false,
9150 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009151 }
9152
9153 apex_key {
9154 name: "myapex.key",
9155 public_key: "testkey.avbpubkey",
9156 private_key: "testkey.pem",
9157 }
9158
9159 prebuilt_apex {
9160 name: "myapex",
9161 prefer: true,
9162 arch: {
9163 arm64: {
9164 src: "myapex-arm64.apex",
9165 },
9166 arm: {
9167 src: "myapex-arm.apex",
9168 },
9169 },
9170 }
9171
9172 apex_set {
9173 name: "myapex_set",
9174 set: "myapex.apks",
9175 filename: "myapex_set.apex",
9176 overrides: ["myapex"],
9177 }
9178 `)
9179
Colin Crossf61d03d2023-11-02 16:56:39 -07009180 content := android.ContentFromFileRuleForTests(t, ctx,
9181 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009182 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 -07009183 content = android.ContentFromFileRuleForTests(t, ctx,
9184 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009185 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 +09009186}
9187
Jooyung Han938b5932020-06-20 12:47:47 +09009188func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009189 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009190 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009191 apex {
9192 name: "myapex",
9193 key: "myapex.key",
9194 apps: ["app"],
9195 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009196 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009197 }
9198
9199 apex_key {
9200 name: "myapex.key",
9201 public_key: "testkey.avbpubkey",
9202 private_key: "testkey.pem",
9203 }
9204
9205 android_app {
9206 name: "app",
9207 srcs: ["foo/bar/MyClass.java"],
9208 package_name: "foo",
9209 sdk_version: "none",
9210 system_modules: "none",
9211 apex_available: [ "myapex" ],
9212 }
9213 `, withFiles(map[string][]byte{
9214 "sub/Android.bp": []byte(`
9215 override_apex {
9216 name: "override_myapex",
9217 base: "myapex",
9218 apps: ["override_app"],
9219 allowed_files: ":allowed",
9220 }
9221 // Overridable "path" property should be referenced indirectly
9222 filegroup {
9223 name: "allowed",
9224 srcs: ["allowed.txt"],
9225 }
9226 override_android_app {
9227 name: "override_app",
9228 base: "app",
9229 package_name: "bar",
9230 }
9231 `),
9232 }))
9233
Jooyung Hana0503a52023-08-23 13:12:50 +09009234 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009235 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9236 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9237 }
9238
Spandan Das50801e22024-05-13 18:29:45 +00009239 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009240 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9241 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9242 }
9243}
9244
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009245func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009246 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009247 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009248 apex {
9249 name: "myapex",
9250 key: "myapex.key",
9251 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009252 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009253 }
9254
9255 apex_key {
9256 name: "myapex.key",
9257 public_key: "testkey.avbpubkey",
9258 private_key: "testkey.pem",
9259 }
9260
9261 cc_library {
9262 name: "mylib",
9263 srcs: ["mylib.cpp"],
9264 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009265 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009266 },
9267 apex_available: ["myapex"],
9268 }
9269
9270 cc_prebuilt_library_shared {
9271 name: "mylib",
9272 prefer: false,
9273 srcs: ["prebuilt.so"],
9274 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009275 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009276 },
9277 apex_available: ["myapex"],
9278 }
9279 `)
9280}
9281
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009282func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009283 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009284 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009285 apex {
9286 name: "myapex",
9287 key: "myapex.key",
9288 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009289 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009290 }
9291 apex_key {
9292 name: "myapex.key",
9293 public_key: "testkey.avbpubkey",
9294 private_key: "testkey.pem",
9295 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009296 `,
9297 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9298 variables.CompressedApex = proptools.BoolPtr(true)
9299 }),
9300 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009301
Jooyung Hana0503a52023-08-23 13:12:50 +09009302 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009303 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9304
Jooyung Hana0503a52023-08-23 13:12:50 +09009305 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009306 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9307
9308 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009309 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009310 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9311
9312 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009313 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009314 var builder strings.Builder
9315 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9316 androidMk := builder.String()
9317 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9318}
9319
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009320func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9321 t.Parallel()
9322 ctx := testApex(t, `
9323 apex {
9324 name: "myapex",
9325 key: "myapex.key",
9326 compressible: true,
9327 updatable: false,
9328 payload_fs_type: "erofs",
9329 }
9330 apex_key {
9331 name: "myapex.key",
9332 public_key: "testkey.avbpubkey",
9333 private_key: "testkey.pem",
9334 }
9335 `,
9336 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9337 variables.CompressedApex = proptools.BoolPtr(true)
9338 }),
9339 )
9340
9341 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9342 if compressRule.Rule != nil {
9343 t.Error("erofs apex should not be compressed")
9344 }
9345}
9346
Jooyung Han26ec8482024-07-31 15:04:05 +09009347func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009348 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009349 for _, compressionEnabled := range []bool{true, false} {
9350 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009351 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009352 ctx := testApex(t, `
9353 apex_set {
9354 name: "com.company.android.myapex",
9355 apex_name: "com.android.myapex",
9356 set: "company-myapex.apks",
9357 }
9358 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9359 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9360 }),
9361 )
9362
9363 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9364 if compressionEnabled {
9365 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9366 } else {
9367 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9368 }
9369 })
9370 }
9371}
9372
Martin Stjernholm2856c662020-12-02 15:03:42 +00009373func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009375 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009376 apex {
9377 name: "myapex",
9378 key: "myapex.key",
9379 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009380 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009381 }
9382
9383 apex_key {
9384 name: "myapex.key",
9385 public_key: "testkey.avbpubkey",
9386 private_key: "testkey.pem",
9387 }
9388
9389 cc_library {
9390 name: "mylib",
9391 srcs: ["mylib.cpp"],
9392 apex_available: ["myapex"],
9393 shared_libs: ["otherlib"],
9394 system_shared_libs: [],
9395 }
9396
9397 cc_library {
9398 name: "otherlib",
9399 srcs: ["mylib.cpp"],
9400 stubs: {
9401 versions: ["current"],
9402 },
9403 }
9404
9405 cc_prebuilt_library_shared {
9406 name: "otherlib",
9407 prefer: true,
9408 srcs: ["prebuilt.so"],
9409 stubs: {
9410 versions: ["current"],
9411 },
9412 }
9413 `)
9414
Jooyung Hana0503a52023-08-23 13:12:50 +09009415 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009416 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009417 var builder strings.Builder
9418 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9419 androidMk := builder.String()
9420
9421 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9422 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009423 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009424}
9425
Jiyong Parke3867542020-12-03 17:28:25 +09009426func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009427 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009428 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009429 apex {
9430 name: "myapex",
9431 key: "myapex.key",
9432 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009433 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009434 }
9435
9436 apex_key {
9437 name: "myapex.key",
9438 public_key: "testkey.avbpubkey",
9439 private_key: "testkey.pem",
9440 }
9441
9442 cc_library {
9443 name: "mylib",
9444 srcs: ["mylib.cpp"],
9445 system_shared_libs: [],
9446 stl: "none",
9447 apex_available: ["myapex"],
9448 shared_libs: ["mylib2"],
9449 target: {
9450 apex: {
9451 exclude_shared_libs: ["mylib2"],
9452 },
9453 },
9454 }
9455
9456 cc_library {
9457 name: "mylib2",
9458 srcs: ["mylib.cpp"],
9459 system_shared_libs: [],
9460 stl: "none",
9461 }
9462 `)
9463
9464 // Check if mylib is linked to mylib2 for the non-apex target
9465 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9466 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9467
9468 // Make sure that the link doesn't occur for the apex target
9469 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9470 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9471
9472 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009473 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009474 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9475}
9476
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009477func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009478 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009479 bpBase := `
9480 apex {
9481 name: "myapex",
9482 key: "myapex.key",
9483 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009484 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009485 }
9486 apex_key {
9487 name: "myapex.key",
9488 public_key: "testkey.avbpubkey",
9489 private_key: "testkey.pem",
9490 }
9491 cc_library {
9492 name: "mylib",
9493 srcs: ["mylib.cpp"],
9494 apex_available: ["myapex"],
9495 shared_libs: ["stublib"],
9496 system_shared_libs: [],
9497 }
9498 apex {
9499 name: "otherapex",
9500 enabled: %s,
9501 key: "myapex.key",
9502 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009503 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009504 }
9505 `
9506
9507 stublibSourceBp := `
9508 cc_library {
9509 name: "stublib",
9510 srcs: ["mylib.cpp"],
9511 apex_available: ["otherapex"],
9512 system_shared_libs: [],
9513 stl: "none",
9514 stubs: {
9515 versions: ["1"],
9516 },
9517 }
9518 `
9519
9520 stublibPrebuiltBp := `
9521 cc_prebuilt_library_shared {
9522 name: "stublib",
9523 srcs: ["prebuilt.so"],
9524 apex_available: ["otherapex"],
9525 stubs: {
9526 versions: ["1"],
9527 },
9528 %s
9529 }
9530 `
9531
9532 tests := []struct {
9533 name string
9534 stublibBp string
9535 usePrebuilt bool
9536 modNames []string // Modules to collect AndroidMkEntries for
9537 otherApexEnabled []string
9538 }{
9539 {
9540 name: "only_source",
9541 stublibBp: stublibSourceBp,
9542 usePrebuilt: false,
9543 modNames: []string{"stublib"},
9544 otherApexEnabled: []string{"true", "false"},
9545 },
9546 {
9547 name: "source_preferred",
9548 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9549 usePrebuilt: false,
9550 modNames: []string{"stublib", "prebuilt_stublib"},
9551 otherApexEnabled: []string{"true", "false"},
9552 },
9553 {
9554 name: "prebuilt_preferred",
9555 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9556 usePrebuilt: true,
9557 modNames: []string{"stublib", "prebuilt_stublib"},
9558 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9559 },
9560 {
9561 name: "only_prebuilt",
9562 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9563 usePrebuilt: true,
9564 modNames: []string{"stublib"},
9565 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9566 },
9567 }
9568
9569 for _, test := range tests {
9570 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009571 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009572 for _, otherApexEnabled := range test.otherApexEnabled {
9573 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009574 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009575 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009576
9577 type modAndMkEntries struct {
9578 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009579 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009580 }
9581 entries := []*modAndMkEntries{}
9582
9583 // Gather shared lib modules that are installable
9584 for _, modName := range test.modNames {
9585 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9586 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9587 continue
9588 }
9589 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009590 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009591 continue
9592 }
Yu Liue70976d2024-10-15 20:45:35 +00009593 info := android.AndroidMkInfoForTest(t, ctx, mod)
9594 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9595 ents = append(ents, info.ExtraInfo...)
9596 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009597 if ent.Disabled {
9598 continue
9599 }
9600 entries = append(entries, &modAndMkEntries{
9601 mod: mod,
9602 mkEntries: ent,
9603 })
9604 }
9605 }
9606 }
9607
9608 var entry *modAndMkEntries = nil
9609 for _, ent := range entries {
9610 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9611 if entry != nil {
9612 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9613 } else {
9614 entry = ent
9615 }
9616 }
9617 }
9618
9619 if entry == nil {
9620 t.Errorf("AndroidMk entry for \"stublib\" missing")
9621 } else {
9622 isPrebuilt := entry.mod.Prebuilt() != nil
9623 if isPrebuilt != test.usePrebuilt {
9624 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9625 }
9626 if !entry.mod.IsStubs() {
9627 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9628 }
9629 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9630 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9631 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009632 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009633 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009634 if !android.InList(expected, cflags) {
9635 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9636 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009637 }
9638 })
9639 }
9640 })
9641 }
9642}
9643
Colin Crossc33e5212021-05-25 18:16:02 -07009644func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009645 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009646 bp := `
9647 apex {
9648 name: "myapex",
9649 key: "myapex.key",
9650 java_libs: ["mylib"],
9651 bootclasspath_fragments: ["mybootclasspathfragment"],
9652 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9653 updatable: false,
9654 }
9655
9656 apex_key {
9657 name: "myapex.key",
9658 public_key: "testkey.avbpubkey",
9659 private_key: "testkey.pem",
9660 }
9661
9662 java_library {
9663 name: "mylib",
9664 srcs: ["mylib.java"],
9665 apex_available: ["myapex"],
9666 compile_dex: true,
9667 }
9668
9669 bootclasspath_fragment {
9670 name: "mybootclasspathfragment",
9671 contents: ["mybootclasspathlib"],
9672 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009673 hidden_api: {
9674 split_packages: ["*"],
9675 },
Colin Crossc33e5212021-05-25 18:16:02 -07009676 }
9677
9678 java_library {
9679 name: "mybootclasspathlib",
9680 srcs: ["mybootclasspathlib.java"],
9681 apex_available: ["myapex"],
9682 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009683 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009684 }
9685
9686 systemserverclasspath_fragment {
9687 name: "mysystemserverclasspathfragment",
9688 contents: ["mysystemserverclasspathlib"],
9689 apex_available: ["myapex"],
9690 }
9691
9692 java_library {
9693 name: "mysystemserverclasspathlib",
9694 srcs: ["mysystemserverclasspathlib.java"],
9695 apex_available: ["myapex"],
9696 compile_dex: true,
9697 }
9698 `
9699
9700 result := android.GroupFixturePreparers(
9701 PrepareForTestWithApexBuildComponents,
9702 prepareForTestWithMyapex,
9703 java.PrepareForTestWithJavaDefaultModules,
9704 android.PrepareForTestWithAndroidBuildComponents,
9705 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009706 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9707 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009708 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009709 ).RunTest(t)
9710
9711 // Make sure jacoco ran on both mylib and mybootclasspathlib
9712 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9713 t.Errorf("Failed to find jacoco rule for mylib")
9714 }
9715 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9716 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9717 }
9718 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9719 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9720 }
9721}
9722
Jiyong Park192600a2021-08-03 07:52:17 +00009723func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009724 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009725 testApexError(t, `executable mybin is static`, `
9726 apex {
9727 name: "myapex",
9728 key: "myapex.key",
9729 binaries: ["mybin"],
9730 min_sdk_version: "29",
9731 }
9732
9733 apex_key {
9734 name: "myapex.key",
9735 public_key: "testkey.avbpubkey",
9736 private_key: "testkey.pem",
9737 }
9738
9739 cc_binary {
9740 name: "mybin",
9741 srcs: ["mylib.cpp"],
9742 relative_install_path: "foo/bar",
9743 static_executable: true,
9744 system_shared_libs: [],
9745 stl: "none",
9746 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009747 min_sdk_version: "29",
9748 }
9749 `)
9750
9751 testApexError(t, `executable mybin.rust is static`, `
9752 apex {
9753 name: "myapex",
9754 key: "myapex.key",
9755 binaries: ["mybin.rust"],
9756 min_sdk_version: "29",
9757 }
9758
9759 apex_key {
9760 name: "myapex.key",
9761 public_key: "testkey.avbpubkey",
9762 private_key: "testkey.pem",
9763 }
9764
9765 rust_binary {
9766 name: "mybin.rust",
9767 srcs: ["foo.rs"],
9768 static_executable: true,
9769 apex_available: ["myapex"],
9770 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009771 }
9772 `)
9773}
9774
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009775func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009776 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009777 ctx := testApex(t, `
9778 apex {
9779 name: "myapex",
9780 key: "myapex.key",
9781 updatable: false,
9782 java_libs: ["foo"],
9783 }
9784
9785 apex_key {
9786 name: "myapex.key",
9787 public_key: "testkey.avbpubkey",
9788 private_key: "testkey.pem",
9789 }
9790
9791 java_library {
9792 name: "foo",
9793 srcs: ["foo.java"],
9794 apex_available: ["myapex"],
9795 installable: true,
9796 }
9797 `,
9798 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9799 )
9800
Jooyung Hana0503a52023-08-23 13:12:50 +09009801 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009802 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9803 var builder strings.Builder
9804 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9805 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009806 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 +00009807}
9808
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009809func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009810 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009811 ctx := testApex(t, `
9812 apex {
9813 name: "myapex",
9814 key: "myapex.key",
9815 updatable: false,
9816 java_libs: ["foo"],
9817 required: ["otherapex"],
9818 }
9819
9820 apex {
9821 name: "otherapex",
9822 key: "myapex.key",
9823 updatable: false,
9824 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009825 }
9826
9827 apex_key {
9828 name: "myapex.key",
9829 public_key: "testkey.avbpubkey",
9830 private_key: "testkey.pem",
9831 }
9832
9833 java_library {
9834 name: "foo",
9835 srcs: ["foo.java"],
9836 apex_available: ["myapex", "otherapex"],
9837 installable: true,
9838 }
9839 `)
9840
Jooyung Hana0503a52023-08-23 13:12:50 +09009841 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009842 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9843 var builder strings.Builder
9844 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9845 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009846 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009847}
9848
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009849func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009850 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009851 ctx := testApex(t, `
9852 apex {
9853 name: "myapex",
9854 key: "myapex.key",
9855 updatable: false,
9856 }
9857
9858 apex_key {
9859 name: "myapex.key",
9860 public_key: "testkey.avbpubkey",
9861 private_key: "testkey.pem",
9862 }
9863 `)
9864
Jooyung Hana0503a52023-08-23 13:12:50 +09009865 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009866 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009867 data := android.AndroidMkDataForTest(t, ctx, bundle)
9868 var builder strings.Builder
9869 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9870 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009871 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009872}
9873
Jooyung Hana6d36672022-02-24 13:58:07 +09009874func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009875 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009876 for _, tc := range []struct {
9877 name string
9878 ref string
9879 expected_data []string
9880 }{
9881 {
9882 name: "test_using_output",
9883 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009884 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009885 },
9886 {
9887 name: "test_using_apex",
9888 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009889 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009890 },
9891 } {
9892 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009893 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009894 ctx := testApex(t, `
9895 apex {
9896 name: "myapex",
9897 key: "myapex.key",
9898 compressible: true,
9899 updatable: false,
9900 }
9901
9902 apex_key {
9903 name: "myapex.key",
9904 public_key: "testkey.avbpubkey",
9905 private_key: "testkey.pem",
9906 }
9907
9908 java_test {
9909 name: "`+tc.name+`",
9910 srcs: ["a.java"],
9911 data: ["`+tc.ref+`"],
9912 }
9913 `,
9914 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9915 variables.CompressedApex = proptools.BoolPtr(true)
9916 }))
9917 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9918 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9919 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9920 })
9921 }
9922}
9923
satayev758968a2021-12-06 11:42:40 +00009924func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009925 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009926 preparer := android.GroupFixturePreparers(
9927 PrepareForTestWithApexBuildComponents,
9928 prepareForTestWithMyapex,
9929 java.PrepareForTestWithJavaSdkLibraryFiles,
9930 java.PrepareForTestWithJavaDefaultModules,
9931 android.PrepareForTestWithAndroidBuildComponents,
9932 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9933 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9934 )
9935
9936 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9937 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009938 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009939 preparer.RunTestWithBp(t, `
9940 apex {
9941 name: "myapex",
9942 key: "myapex.key",
9943 bootclasspath_fragments: ["mybootclasspathfragment"],
9944 min_sdk_version: "30",
9945 updatable: false,
9946 }
9947
9948 apex_key {
9949 name: "myapex.key",
9950 public_key: "testkey.avbpubkey",
9951 private_key: "testkey.pem",
9952 }
9953
9954 bootclasspath_fragment {
9955 name: "mybootclasspathfragment",
9956 contents: ["mybootclasspathlib"],
9957 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009958 hidden_api: {
9959 split_packages: ["*"],
9960 },
satayev758968a2021-12-06 11:42:40 +00009961 }
9962
9963 java_sdk_library {
9964 name: "mybootclasspathlib",
9965 srcs: ["mybootclasspathlib.java"],
9966 apex_available: ["myapex"],
9967 compile_dex: true,
9968 unsafe_ignore_missing_latest_api: true,
9969 min_sdk_version: "31",
9970 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009971 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009972 }
9973
9974 java_library {
9975 name: "util",
9976 srcs: ["a.java"],
9977 apex_available: ["myapex"],
9978 min_sdk_version: "31",
9979 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009980 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009981 }
9982
9983 java_library {
9984 name: "another_util",
9985 srcs: ["a.java"],
9986 min_sdk_version: "31",
9987 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009988 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009989 }
9990 `)
9991 })
9992
9993 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9994 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009995 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009996 preparer.RunTestWithBp(t, `
9997 apex {
9998 name: "myapex",
9999 key: "myapex.key",
10000 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10001 min_sdk_version: "30",
10002 updatable: false,
10003 }
10004
10005 apex_key {
10006 name: "myapex.key",
10007 public_key: "testkey.avbpubkey",
10008 private_key: "testkey.pem",
10009 }
10010
10011 systemserverclasspath_fragment {
10012 name: "mysystemserverclasspathfragment",
10013 contents: ["mysystemserverclasspathlib"],
10014 apex_available: ["myapex"],
10015 }
10016
10017 java_sdk_library {
10018 name: "mysystemserverclasspathlib",
10019 srcs: ["mysystemserverclasspathlib.java"],
10020 apex_available: ["myapex"],
10021 compile_dex: true,
10022 min_sdk_version: "32",
10023 unsafe_ignore_missing_latest_api: true,
10024 static_libs: ["util"],
10025 }
10026
10027 java_library {
10028 name: "util",
10029 srcs: ["a.java"],
10030 apex_available: ["myapex"],
10031 min_sdk_version: "31",
10032 static_libs: ["another_util"],
10033 }
10034
10035 java_library {
10036 name: "another_util",
10037 srcs: ["a.java"],
10038 min_sdk_version: "31",
10039 apex_available: ["myapex"],
10040 }
10041 `)
10042 })
10043
10044 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010045 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +000010046 preparer.
satayev758968a2021-12-06 11:42:40 +000010047 RunTestWithBp(t, `
10048 apex {
10049 name: "myapex",
10050 key: "myapex.key",
10051 bootclasspath_fragments: ["mybootclasspathfragment"],
10052 min_sdk_version: "30",
10053 updatable: false,
10054 }
10055
10056 apex_key {
10057 name: "myapex.key",
10058 public_key: "testkey.avbpubkey",
10059 private_key: "testkey.pem",
10060 }
10061
10062 bootclasspath_fragment {
10063 name: "mybootclasspathfragment",
10064 contents: ["mybootclasspathlib"],
10065 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010066 hidden_api: {
10067 split_packages: ["*"],
10068 },
satayev758968a2021-12-06 11:42:40 +000010069 }
10070
10071 java_sdk_library {
10072 name: "mybootclasspathlib",
10073 srcs: ["mybootclasspathlib.java"],
10074 apex_available: ["myapex"],
10075 compile_dex: true,
10076 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010077 sdk_version: "current",
10078 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010079 }
10080 `)
10081 })
10082
10083 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010084 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010085 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10086 RunTestWithBp(t, `
10087 apex {
10088 name: "myapex",
10089 key: "myapex.key",
10090 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10091 min_sdk_version: "30",
10092 updatable: false,
10093 }
10094
10095 apex_key {
10096 name: "myapex.key",
10097 public_key: "testkey.avbpubkey",
10098 private_key: "testkey.pem",
10099 }
10100
10101 systemserverclasspath_fragment {
10102 name: "mysystemserverclasspathfragment",
10103 contents: ["mysystemserverclasspathlib"],
10104 apex_available: ["myapex"],
10105 }
10106
10107 java_sdk_library {
10108 name: "mysystemserverclasspathlib",
10109 srcs: ["mysystemserverclasspathlib.java"],
10110 apex_available: ["myapex"],
10111 compile_dex: true,
10112 unsafe_ignore_missing_latest_api: true,
10113 }
10114 `)
10115 })
10116}
10117
Jiakai Zhang6decef92022-01-12 17:56:19 +000010118// Verifies that the APEX depends on all the Make modules in the list.
10119func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10120 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10121 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010122 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010123 }
10124}
10125
10126// Verifies that the APEX does not depend on any of the Make modules in the list.
10127func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10128 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10129 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010130 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010131 }
10132}
10133
Cole Faust24e25c02024-01-19 14:12:17 -080010134func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010135 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010136 bpTemplate := `
10137 apex {
10138 name: "myapex",
10139 key: "myapex.key",
10140 java_libs: ["myjavalib"],
10141 updatable: %v,
10142 min_sdk_version: "29",
10143 }
10144 apex_key {
10145 name: "myapex.key",
10146 }
10147 java_library {
10148 name: "myjavalib",
10149 srcs: ["MyClass.java"],
10150 apex_available: [ "myapex" ],
10151 lint: {
10152 strict_updatability_linting: %v,
10153 %s
10154 },
10155 sdk_version: "current",
10156 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010157 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010158 }
10159 `
10160 fs := android.MockFS{
10161 "lint-baseline.xml": nil,
10162 }
10163
10164 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010165 testCaseName string
10166 apexUpdatable bool
10167 javaStrictUpdtabilityLint bool
10168 lintFileExists bool
10169 disallowedFlagExpectedOnApex bool
10170 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010171 }{
10172 {
Colin Cross87427352024-09-25 15:41:19 -070010173 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10174 apexUpdatable: true,
10175 javaStrictUpdtabilityLint: true,
10176 lintFileExists: false,
10177 disallowedFlagExpectedOnApex: false,
10178 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010179 },
10180 {
Colin Cross87427352024-09-25 15:41:19 -070010181 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10182 apexUpdatable: false,
10183 javaStrictUpdtabilityLint: false,
10184 lintFileExists: true,
10185 disallowedFlagExpectedOnApex: false,
10186 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010187 },
10188 {
Colin Cross87427352024-09-25 15:41:19 -070010189 testCaseName: "non-updatable apex respects strict updatability of javalib",
10190 apexUpdatable: false,
10191 javaStrictUpdtabilityLint: true,
10192 lintFileExists: true,
10193 disallowedFlagExpectedOnApex: false,
10194 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010195 },
10196 {
Colin Cross87427352024-09-25 15:41:19 -070010197 testCaseName: "updatable apex checks strict updatability of javalib",
10198 apexUpdatable: true,
10199 javaStrictUpdtabilityLint: false,
10200 lintFileExists: true,
10201 disallowedFlagExpectedOnApex: true,
10202 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010203 },
10204 }
10205
10206 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010207 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010208 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010209 fixtures := []android.FixturePreparer{}
10210 baselineProperty := ""
10211 if testCase.lintFileExists {
10212 fixtures = append(fixtures, fs.AddToFixture())
10213 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10214 }
10215 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010216
Colin Cross87427352024-09-25 15:41:19 -070010217 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010218
Colin Cross87427352024-09-25 15:41:19 -070010219 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10220 if expectStrictUpdatability {
10221 if m.Rule == nil {
10222 t.Errorf("expected strict updatability check rule on %s", name)
10223 } else {
10224 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10225 m.RuleParams.Command, "--disallowed_issues NewApi")
10226 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10227 m.Inputs.Strings(), "lint-baseline.xml")
10228 }
10229 } else {
10230 if m.Rule != nil {
10231 t.Errorf("expected no strict updatability check rule on %s", name)
10232 }
10233 }
10234 }
10235
10236 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10237 apex := result.ModuleForTests("myapex", "android_common_myapex")
10238 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10239 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10240
10241 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10242 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10243 })
Cole Faust24e25c02024-01-19 14:12:17 -080010244 }
10245}
10246
Cole Faust24e25c02024-01-19 14:12:17 -080010247// checks transtive deps of an apex coming from bootclasspath_fragment
10248func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010249 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010250 bp := `
10251 apex {
10252 name: "myapex",
10253 key: "myapex.key",
10254 bootclasspath_fragments: ["mybootclasspathfragment"],
10255 updatable: true,
10256 min_sdk_version: "29",
10257 }
10258 apex_key {
10259 name: "myapex.key",
10260 }
10261 bootclasspath_fragment {
10262 name: "mybootclasspathfragment",
10263 contents: ["myjavalib"],
10264 apex_available: ["myapex"],
10265 hidden_api: {
10266 split_packages: ["*"],
10267 },
10268 }
10269 java_library {
10270 name: "myjavalib",
10271 srcs: ["MyClass.java"],
10272 apex_available: [ "myapex" ],
10273 sdk_version: "current",
10274 min_sdk_version: "29",
10275 compile_dex: true,
10276 lint: {
10277 baseline_filename: "lint-baseline.xml",
10278 }
10279 }
10280 `
10281 fs := android.MockFS{
10282 "lint-baseline.xml": nil,
10283 }
10284
10285 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010286 apex := result.ModuleForTests("myapex", "android_common_myapex")
10287 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10288 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10289 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10290 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10291 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010292}
Spandan Das66773252022-01-15 00:23:18 +000010293
Jihoon Kang784c0052024-06-25 22:15:39 +000010294func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010295 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010296 bp := `
10297 apex {
10298 name: "myapex",
10299 key: "myapex.key",
10300 bootclasspath_fragments: ["mybootclasspathfragment"],
10301 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010302 java_libs: [
10303 "jacocoagent",
10304 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010305 }
10306 apex_key {
10307 name: "myapex.key",
10308 }
10309 bootclasspath_fragment {
10310 name: "mybootclasspathfragment",
10311 contents: ["foo"],
10312 apex_available: ["myapex"],
10313 hidden_api: {
10314 split_packages: ["*"],
10315 },
10316 }
10317 java_sdk_library {
10318 name: "foo",
10319 srcs: ["MyClass.java"],
10320 apex_available: [ "myapex" ],
10321 sdk_version: "current",
10322 min_sdk_version: "29",
10323 compile_dex: true,
10324 }
10325 `
10326 fs := android.MockFS{
10327 "lint-baseline.xml": nil,
10328 }
10329
10330 result := android.GroupFixturePreparers(
10331 prepareForApexTest,
10332 java.PrepareForTestWithJavaSdkLibraryFiles,
10333 java.PrepareForTestWithJacocoInstrumentation,
10334 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010335 android.FixtureMergeMockFs(fs),
10336 ).RunTestWithBp(t, bp)
10337
10338 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10339 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10340 android.AssertStringDoesContain(t,
10341 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10342 lintReportInputs, "foo.impl")
10343}
10344
Spandan Das42e89502022-05-06 22:12:55 +000010345// updatable apexes should propagate updatable=true to its apps
10346func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010347 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010348 bp := `
10349 apex {
10350 name: "myapex",
10351 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010352 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010353 apps: [
10354 "myapp",
10355 ],
10356 min_sdk_version: "30",
10357 }
10358 apex_key {
10359 name: "myapex.key",
10360 }
10361 android_app {
10362 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010363 apex_available: [
10364 "myapex",
10365 ],
10366 sdk_version: "current",
10367 min_sdk_version: "30",
10368 }
10369 `
Colin Cross99939e92024-10-01 16:02:46 -070010370 _ = android.GroupFixturePreparers(
10371 prepareForApexTest,
10372 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10373 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010374}
10375
Jingwen Chendea7a642023-03-28 11:30:50 +000010376func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010377 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010378 ctx := testApex(t, `
10379 apex {
10380 name: "myapex",
10381 key: "myapex.key",
10382 updatable: false,
10383 }
10384
10385 apex_key {
10386 name: "myapex.key",
10387 public_key: "testkey.avbpubkey",
10388 private_key: "testkey.pem",
10389 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010390 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010391 generateFsRule := mod.Rule("generateFsConfig")
10392 cmd := generateFsRule.RuleParams.Command
10393
10394 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10395}
10396
10397func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010398 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010399 ctx := testApex(t, `
10400 apex {
10401 name: "myapex",
10402 key: "myapex.key",
10403 canned_fs_config: "my_config",
10404 updatable: false,
10405 }
10406
10407 apex_key {
10408 name: "myapex.key",
10409 public_key: "testkey.avbpubkey",
10410 private_key: "testkey.pem",
10411 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010412 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010413 generateFsRule := mod.Rule("generateFsConfig")
10414 cmd := generateFsRule.RuleParams.Command
10415
10416 // Ensure that canned_fs_config has "cat my_config" at the end
10417 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10418}
Spandan Das20fce2d2023-04-12 17:21:39 +000010419
10420func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010421 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010422 testCases := []struct {
10423 desc string
10424 hasStubs bool
10425 apexAvailable string
10426 expectedError string
10427 }{
10428 {
10429 desc: "non-stub library can have multiple apex_available",
10430 hasStubs: false,
10431 apexAvailable: `["myapex", "otherapex"]`,
10432 },
10433 {
10434 desc: "stub library should not be available to anyapex",
10435 hasStubs: true,
10436 apexAvailable: `["//apex_available:anyapex"]`,
10437 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10438 },
10439 {
10440 desc: "stub library should not be available to multiple apexes",
10441 hasStubs: true,
10442 apexAvailable: `["myapex", "otherapex"]`,
10443 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10444 },
10445 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010446 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 +000010447 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010448 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010449 },
10450 }
10451 bpTemplate := `
10452 cc_library {
10453 name: "libfoo",
10454 %v
10455 apex_available: %v,
10456 }
10457 apex {
10458 name: "myapex",
10459 key: "apex.key",
10460 updatable: false,
10461 native_shared_libs: ["libfoo"],
10462 }
10463 apex {
10464 name: "otherapex",
10465 key: "apex.key",
10466 updatable: false,
10467 }
10468 apex_test {
10469 name: "test_myapex",
10470 key: "apex.key",
10471 updatable: false,
10472 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010473 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010474 }
10475 apex_key {
10476 name: "apex.key",
10477 }
10478 `
10479 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010480 t.Run(tc.desc, func(t *testing.T) {
10481 stubs := ""
10482 if tc.hasStubs {
10483 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10484 }
10485 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10486 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10487 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10488 })
10489 if tc.expectedError == "" {
10490 testApex(t, bp, mockFsFixturePreparer)
10491 } else {
10492 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10493 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010494 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010495 }
10496}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010497
10498func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010499 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010500 context := android.GroupFixturePreparers(
10501 android.PrepareForIntegrationTestWithAndroid,
10502 cc.PrepareForIntegrationTestWithCc,
10503 PrepareForTestWithApexBuildComponents,
10504 prepareForTestWithMyapex,
10505 filesystem.PrepareForTestWithFilesystemBuildComponents,
10506 )
10507 result := context.RunTestWithBp(t, `
10508 android_system_image {
10509 name: "myfilesystem",
10510 deps: [
10511 "libfoo",
10512 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010513 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010514 gen_linker_config: true,
10515 linker_config_srcs: ["linker.config.json"],
10516 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010517 }
10518
10519 cc_library {
10520 name: "libfoo",
10521 shared_libs: [
10522 "libbar",
10523 ],
10524 stl: "none",
10525 }
10526
10527 cc_library {
10528 name: "libbar",
10529 stl: "none",
10530 apex_available: ["myapex"],
10531 }
10532
10533 apex {
10534 name: "myapex",
10535 native_shared_libs: ["libbar"],
10536 key: "myapex.key",
10537 updatable: false,
10538 }
10539
10540 apex_key {
10541 name: "myapex.key",
10542 public_key: "testkey.avbpubkey",
10543 private_key: "testkey.pem",
10544 }
10545 `)
10546
Cole Faust3b806d32024-03-11 15:15:03 -070010547 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010548 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10549 inputs.Strings(),
10550 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10551}
Yu Liueae7b362023-11-16 17:05:47 -080010552
10553var apex_default_bp = `
10554 apex_key {
10555 name: "myapex.key",
10556 public_key: "testkey.avbpubkey",
10557 private_key: "testkey.pem",
10558 }
10559
10560 filegroup {
10561 name: "myapex.manifest",
10562 srcs: ["apex_manifest.json"],
10563 }
10564
10565 filegroup {
10566 name: "myapex.androidmanifest",
10567 srcs: ["AndroidManifest.xml"],
10568 }
10569`
10570
10571func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010572 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010573 ctx := testApex(t, apex_default_bp+`
10574 apex {
10575 name: "myapex",
10576 manifest: ":myapex.manifest",
10577 androidManifest: ":myapex.androidmanifest",
10578 key: "myapex.key",
10579 java_libs: [
10580 "my_java_library_foo",
10581 "my_java_library_bar",
10582 ],
10583 updatable: false,
10584 }
10585
10586 java_library {
10587 name: "my_java_library_foo",
10588 srcs: ["foo/bar/MyClass.java"],
10589 sdk_version: "none",
10590 system_modules: "none",
10591 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010592 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010593 "myapex",
10594 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010595 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010596 }
10597
10598 java_library {
10599 name: "my_java_library_bar",
10600 srcs: ["foo/bar/MyClass.java"],
10601 sdk_version: "none",
10602 system_modules: "none",
10603 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010604 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010605 "myapex",
10606 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010607 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010608 }
10609
10610 aconfig_declarations {
10611 name: "my_aconfig_declarations_foo",
10612 package: "com.example.package",
10613 container: "myapex",
10614 srcs: ["foo.aconfig"],
10615 }
10616
10617 java_aconfig_library {
10618 name: "my_java_aconfig_library_foo",
10619 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010620 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010621 "myapex",
10622 ],
10623 }
10624
10625 aconfig_declarations {
10626 name: "my_aconfig_declarations_bar",
10627 package: "com.example.package",
10628 container: "myapex",
10629 srcs: ["bar.aconfig"],
10630 }
10631
10632 java_aconfig_library {
10633 name: "my_java_aconfig_library_bar",
10634 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010635 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010636 "myapex",
10637 ],
10638 }
10639 `)
10640
10641 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10642 s := mod.Rule("apexRule").Args["copy_commands"]
10643 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010644 if len(copyCmds) != 14 {
10645 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010646 }
10647
Jooyung Hana3fddf42024-09-03 13:22:21 +090010648 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10649 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10650 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10651 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010652 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010653
Yu Liubba555e2024-02-17 00:36:42 +000010654 inputs := []string{
10655 "my_aconfig_declarations_foo/intermediate.pb",
10656 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010657 }
Yu Liubba555e2024-02-17 00:36:42 +000010658 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10659 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10660 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10661 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010662 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010663}
10664
10665func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010666 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010667 ctx := testApex(t, apex_default_bp+`
10668 apex {
10669 name: "myapex",
10670 manifest: ":myapex.manifest",
10671 androidManifest: ":myapex.androidmanifest",
10672 key: "myapex.key",
10673 java_libs: [
10674 "my_java_library_foo",
10675 ],
10676 native_shared_libs: [
10677 "my_cc_library_bar",
10678 ],
10679 binaries: [
10680 "my_cc_binary_baz",
10681 ],
10682 updatable: false,
10683 }
10684
10685 java_library {
10686 name: "my_java_library_foo",
10687 srcs: ["foo/bar/MyClass.java"],
10688 sdk_version: "none",
10689 system_modules: "none",
10690 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010691 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010692 "myapex",
10693 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010694 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010695 }
10696
10697 cc_library {
10698 name: "my_cc_library_bar",
10699 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010700 static_libs: [
10701 "my_cc_aconfig_library_bar",
10702 "my_cc_aconfig_library_baz",
10703 ],
Yu Liueae7b362023-11-16 17:05:47 -080010704 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010705 "myapex",
10706 ],
10707 }
10708
10709 cc_binary {
10710 name: "my_cc_binary_baz",
10711 srcs: ["foo/bar/MyClass.cc"],
10712 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010713 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010714 "myapex",
10715 ],
10716 }
10717
10718 aconfig_declarations {
10719 name: "my_aconfig_declarations_foo",
10720 package: "com.example.package",
10721 container: "myapex",
10722 srcs: ["foo.aconfig"],
10723 }
10724
10725 java_aconfig_library {
10726 name: "my_java_aconfig_library_foo",
10727 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010728 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010729 "myapex",
10730 ],
10731 }
10732
10733 aconfig_declarations {
10734 name: "my_aconfig_declarations_bar",
10735 package: "com.example.package",
10736 container: "myapex",
10737 srcs: ["bar.aconfig"],
10738 }
10739
10740 cc_aconfig_library {
10741 name: "my_cc_aconfig_library_bar",
10742 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010743 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010744 "myapex",
10745 ],
10746 }
10747
10748 aconfig_declarations {
10749 name: "my_aconfig_declarations_baz",
10750 package: "com.example.package",
10751 container: "myapex",
10752 srcs: ["baz.aconfig"],
10753 }
10754
10755 cc_aconfig_library {
10756 name: "my_cc_aconfig_library_baz",
10757 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010758 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010759 "myapex",
10760 ],
10761 }
10762
10763 cc_library {
10764 name: "server_configurable_flags",
10765 srcs: ["server_configurable_flags.cc"],
10766 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010767 cc_library {
10768 name: "libbase",
10769 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010770 apex_available: [
10771 "myapex",
10772 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010773 }
10774 cc_library {
10775 name: "libaconfig_storage_read_api_cc",
10776 srcs: ["libaconfig_storage_read_api_cc.cc"],
10777 }
Yu Liueae7b362023-11-16 17:05:47 -080010778 `)
10779
10780 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10781 s := mod.Rule("apexRule").Args["copy_commands"]
10782 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010783 if len(copyCmds) != 18 {
10784 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010785 }
10786
Jooyung Hana3fddf42024-09-03 13:22:21 +090010787 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10788 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10789 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10790 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010791 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010792
Yu Liubba555e2024-02-17 00:36:42 +000010793 inputs := []string{
10794 "my_aconfig_declarations_foo/intermediate.pb",
10795 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10796 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010797 }
Yu Liubba555e2024-02-17 00:36:42 +000010798 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10799 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10800 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10801 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010802 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010803}
10804
Yu Liucec0e412023-11-30 16:45:50 -080010805func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010806 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010807 ctx := testApex(t, apex_default_bp+`
10808 apex {
10809 name: "myapex",
10810 manifest: ":myapex.manifest",
10811 androidManifest: ":myapex.androidmanifest",
10812 key: "myapex.key",
10813 native_shared_libs: [
10814 "libmy_rust_library",
10815 ],
10816 binaries: [
10817 "my_rust_binary",
10818 ],
10819 rust_dyn_libs: [
10820 "libmy_rust_dylib",
10821 ],
10822 updatable: false,
10823 }
10824
10825 rust_library {
Yu Liucec0e412023-11-30 16:45:50 -080010826 name: "liblazy_static", // test mock
10827 crate_name: "lazy_static",
10828 srcs: ["src/lib.rs"],
10829 apex_available: [
10830 "myapex",
10831 ],
10832 }
10833
Ted Bauer02d475c2024-03-27 20:56:26 +000010834 rust_library {
10835 name: "libaconfig_storage_read_api", // test mock
10836 crate_name: "aconfig_storage_read_api",
10837 srcs: ["src/lib.rs"],
10838 apex_available: [
10839 "myapex",
10840 ],
10841 }
10842
Ted Bauer6ef40db2024-03-29 14:04:10 +000010843 rust_library {
10844 name: "liblogger", // test mock
10845 crate_name: "logger",
10846 srcs: ["src/lib.rs"],
10847 apex_available: [
10848 "myapex",
10849 ],
10850 }
10851
10852 rust_library {
10853 name: "liblog_rust", // test mock
10854 crate_name: "log_rust",
10855 srcs: ["src/lib.rs"],
10856 apex_available: [
10857 "myapex",
10858 ],
10859 }
10860
Yu Liucec0e412023-11-30 16:45:50 -080010861 rust_ffi_shared {
10862 name: "libmy_rust_library",
10863 srcs: ["src/lib.rs"],
10864 rustlibs: ["libmy_rust_aconfig_library_foo"],
10865 crate_name: "my_rust_library",
10866 apex_available: [
10867 "myapex",
10868 ],
10869 }
10870
10871 rust_library_dylib {
10872 name: "libmy_rust_dylib",
10873 srcs: ["foo/bar/MyClass.rs"],
10874 rustlibs: ["libmy_rust_aconfig_library_bar"],
10875 crate_name: "my_rust_dylib",
10876 apex_available: [
10877 "myapex",
10878 ],
10879 }
10880
10881 rust_binary {
10882 name: "my_rust_binary",
10883 srcs: ["foo/bar/MyClass.rs"],
10884 rustlibs: [
10885 "libmy_rust_aconfig_library_baz",
10886 "libmy_rust_dylib",
10887 ],
10888 apex_available: [
10889 "myapex",
10890 ],
10891 }
10892
10893 aconfig_declarations {
10894 name: "my_aconfig_declarations_foo",
10895 package: "com.example.package",
10896 container: "myapex",
10897 srcs: ["foo.aconfig"],
10898 }
10899
10900 aconfig_declarations {
10901 name: "my_aconfig_declarations_bar",
10902 package: "com.example.package",
10903 container: "myapex",
10904 srcs: ["bar.aconfig"],
10905 }
10906
10907 aconfig_declarations {
10908 name: "my_aconfig_declarations_baz",
10909 package: "com.example.package",
10910 container: "myapex",
10911 srcs: ["baz.aconfig"],
10912 }
10913
10914 rust_aconfig_library {
10915 name: "libmy_rust_aconfig_library_foo",
10916 aconfig_declarations: "my_aconfig_declarations_foo",
10917 crate_name: "my_rust_aconfig_library_foo",
10918 apex_available: [
10919 "myapex",
10920 ],
10921 }
10922
10923 rust_aconfig_library {
10924 name: "libmy_rust_aconfig_library_bar",
10925 aconfig_declarations: "my_aconfig_declarations_bar",
10926 crate_name: "my_rust_aconfig_library_bar",
10927 apex_available: [
10928 "myapex",
10929 ],
10930 }
10931
10932 rust_aconfig_library {
10933 name: "libmy_rust_aconfig_library_baz",
10934 aconfig_declarations: "my_aconfig_declarations_baz",
10935 crate_name: "my_rust_aconfig_library_baz",
10936 apex_available: [
10937 "myapex",
10938 ],
10939 }
10940 `)
10941
10942 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10943 s := mod.Rule("apexRule").Args["copy_commands"]
10944 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen396237a2025-01-30 20:06:25 +000010945 if len(copyCmds) != 32 {
10946 t.Fatalf("Expected 32 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010947 }
10948
Jooyung Hana3fddf42024-09-03 13:22:21 +090010949 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10950 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10951 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10952 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010953 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010954
Yu Liubba555e2024-02-17 00:36:42 +000010955 inputs := []string{
10956 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010957 "my_aconfig_declarations_bar/intermediate.pb",
10958 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010959 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10960 }
10961 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10962 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10963 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10964 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010965 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010966}
10967
10968func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10969 aconfigRule := mod.Description(desc)
10970 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010971 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010972 if len(aconfigArgs) != len(inputs) {
10973 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010974 }
Yu Liucec0e412023-11-30 16:45:50 -080010975
Yu Liubba555e2024-02-17 00:36:42 +000010976 ensureEquals(t, container, aconfigRule.Args["container"])
10977 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10978
10979 buildParams := aconfigRule.BuildParams
10980 for _, input := range inputs {
10981 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10982 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010983 }
Yu Liubba555e2024-02-17 00:36:42 +000010984
10985 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010986}
10987
Yu Liueae7b362023-11-16 17:05:47 -080010988func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010989 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010990 ctx := testApex(t, apex_default_bp+`
10991 apex {
10992 name: "myapex",
10993 manifest: ":myapex.manifest",
10994 androidManifest: ":myapex.androidmanifest",
10995 key: "myapex.key",
10996 java_libs: [
10997 "my_java_library_foo",
10998 "other_java_library_bar",
10999 ],
11000 updatable: false,
11001 }
11002
11003 java_library {
11004 name: "my_java_library_foo",
11005 srcs: ["foo/bar/MyClass.java"],
11006 sdk_version: "none",
11007 system_modules: "none",
11008 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011009 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011010 "myapex",
11011 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011012 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011013 }
11014
11015 java_library {
11016 name: "other_java_library_bar",
11017 srcs: ["foo/bar/MyClass.java"],
11018 sdk_version: "none",
11019 system_modules: "none",
11020 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011021 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011022 "myapex",
11023 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011024 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011025 }
11026
11027 aconfig_declarations {
11028 name: "my_aconfig_declarations_foo",
11029 package: "com.example.package",
11030 container: "myapex",
11031 srcs: ["foo.aconfig"],
11032 }
11033
11034 java_aconfig_library {
11035 name: "my_java_aconfig_library_foo",
11036 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011037 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011038 "myapex",
11039 ],
11040 }
11041
11042 aconfig_declarations {
11043 name: "other_aconfig_declarations_bar",
11044 package: "com.example.package",
11045 container: "otherapex",
11046 srcs: ["bar.aconfig"],
11047 }
11048
11049 java_aconfig_library {
11050 name: "other_java_aconfig_library_bar",
11051 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011052 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011053 "myapex",
11054 ],
11055 }
11056 `)
11057
11058 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11059 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11060 s := " " + combineAconfigRule.Args["cache_files"]
11061 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11062 if len(aconfigArgs) != 1 {
11063 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11064 }
11065 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11066
11067 buildParams := combineAconfigRule.BuildParams
11068 if len(buildParams.Inputs) != 1 {
11069 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11070 }
11071 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11072 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11073}
11074
11075func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011076 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011077 ctx := testApex(t, apex_default_bp+`
11078 apex {
11079 name: "myapex",
11080 manifest: ":myapex.manifest",
11081 androidManifest: ":myapex.androidmanifest",
11082 key: "myapex.key",
11083 java_libs: [
11084 "my_java_library_foo",
11085 "my_java_library_bar",
11086 ],
11087 updatable: false,
11088 }
11089
11090 java_library {
11091 name: "my_java_library_foo",
11092 srcs: ["foo/bar/MyClass.java"],
11093 sdk_version: "none",
11094 system_modules: "none",
11095 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011096 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011097 "myapex",
11098 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011099 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011100 }
11101
11102 java_library {
11103 name: "my_java_library_bar",
11104 srcs: ["foo/bar/MyClass.java"],
11105 sdk_version: "none",
11106 system_modules: "none",
11107 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011108 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011109 "myapex",
11110 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011111 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011112 }
11113
11114 aconfig_declarations {
11115 name: "my_aconfig_declarations_foo",
11116 package: "com.example.package",
11117 container: "myapex",
11118 srcs: ["foo.aconfig"],
11119 }
11120
11121 java_aconfig_library {
11122 name: "my_java_aconfig_library_foo",
11123 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011124 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011125 "myapex",
11126 ],
11127 }
11128
11129 java_aconfig_library {
11130 name: "my_java_aconfig_library_bar",
11131 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011132 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011133 "myapex",
11134 ],
11135 }
11136 `)
11137
11138 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11139 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11140 s := " " + combineAconfigRule.Args["cache_files"]
11141 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11142 if len(aconfigArgs) != 1 {
11143 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11144 }
11145 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11146
11147 buildParams := combineAconfigRule.BuildParams
11148 if len(buildParams.Inputs) != 1 {
11149 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11150 }
11151 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11152 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11153}
Spandan Das5be63332023-12-13 00:06:32 +000011154
11155// Test that the boot jars come from the _selected_ apex prebuilt
11156// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11157func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011158 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011159 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11160 t.Helper()
11161 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11162 foundLibfooJar := false
11163 base := stem + ".jar"
11164 for _, output := range s.AllOutputs() {
11165 if filepath.Base(output) == base {
11166 foundLibfooJar = true
11167 buildRule := s.Output(output)
11168 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11169 }
11170 }
11171 if !foundLibfooJar {
11172 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11173 }
11174 }
11175
Spandan Das64c9e0c2023-12-20 20:13:34 +000011176 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11177 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11178 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11179 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11180 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11181 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)
11182 }
11183
11184 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11185 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11186 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11187 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11188 }
11189
Spandan Das5be63332023-12-13 00:06:32 +000011190 bp := `
11191 // Source APEX.
11192
11193 java_library {
11194 name: "framework-foo",
11195 srcs: ["foo.java"],
11196 installable: true,
11197 apex_available: [
11198 "com.android.foo",
11199 ],
11200 }
11201
11202 bootclasspath_fragment {
11203 name: "foo-bootclasspath-fragment",
11204 contents: ["framework-foo"],
11205 apex_available: [
11206 "com.android.foo",
11207 ],
11208 hidden_api: {
11209 split_packages: ["*"],
11210 },
11211 }
11212
11213 apex_key {
11214 name: "com.android.foo.key",
11215 public_key: "com.android.foo.avbpubkey",
11216 private_key: "com.android.foo.pem",
11217 }
11218
11219 apex {
11220 name: "com.android.foo",
11221 key: "com.android.foo.key",
11222 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11223 updatable: false,
11224 }
11225
11226 // Prebuilt APEX.
11227
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011228 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011229 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011230 public: {
11231 jars: ["foo.jar"],
11232 },
Spandan Das5be63332023-12-13 00:06:32 +000011233 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011234 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011235 }
11236
11237 prebuilt_bootclasspath_fragment {
11238 name: "foo-bootclasspath-fragment",
11239 contents: ["framework-foo"],
11240 hidden_api: {
11241 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11242 metadata: "my-bootclasspath-fragment/metadata.csv",
11243 index: "my-bootclasspath-fragment/index.csv",
11244 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11245 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11246 },
11247 apex_available: [
11248 "com.android.foo",
11249 ],
11250 }
11251
11252 prebuilt_apex {
11253 name: "com.android.foo",
11254 apex_name: "com.android.foo",
11255 src: "com.android.foo-arm.apex",
11256 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11257 }
11258
11259 // Another Prebuilt ART APEX
11260 prebuilt_apex {
11261 name: "com.android.foo.v2",
11262 apex_name: "com.android.foo", // Used to determine the API domain
11263 src: "com.android.foo-arm.apex",
11264 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11265 }
11266
11267 // APEX contribution modules
11268
11269 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011270 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011271 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011272 contents: ["com.android.foo"],
11273 }
11274
11275 apex_contributions {
11276 name: "foo.prebuilt.contributions",
11277 api_domain: "com.android.foo",
11278 contents: ["prebuilt_com.android.foo"],
11279 }
11280
11281 apex_contributions {
11282 name: "foo.prebuilt.v2.contributions",
11283 api_domain: "com.android.foo",
11284 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011285 }
11286 `
11287
11288 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011289 desc string
11290 selectedApexContributions string
11291 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011292 }{
11293 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011294 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11295 selectedApexContributions: "foo.source.contributions",
11296 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011297 },
11298 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011299 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11300 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011301 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 +000011302 },
11303 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011304 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11305 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011306 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 +000011307 },
11308 }
11309
11310 fragment := java.ApexVariantReference{
11311 Apex: proptools.StringPtr("com.android.foo"),
11312 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11313 }
11314
11315 for _, tc := range testCases {
11316 preparer := android.GroupFixturePreparers(
11317 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11318 android.FixtureMergeMockFs(map[string][]byte{
11319 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11320 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011321 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11322 // file creation.
11323 java.FixtureConfigureBootJars("platform:foo"),
11324 android.FixtureModifyMockFS(func(fs android.MockFS) {
11325 fs["platform/Android.bp"] = []byte(`
11326 java_library {
11327 name: "foo",
11328 srcs: ["Test.java"],
11329 compile_dex: true,
11330 }
11331 `)
11332 fs["platform/Test.java"] = nil
11333 }),
11334
Colin Crossa66b4632024-08-08 15:50:47 -070011335 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011336 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011337 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011338 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011339 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11340 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011341 }
11342}
Spandan Das3576e762024-01-03 18:57:03 +000011343
11344// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11345// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11346func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011347 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011348 // for a mainline module family, check that only the flagged soong module is visible to make
11349 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11350 variation := func(moduleName string) string {
11351 ret := "android_common_com.android.foo"
11352 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011353 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011354 }
11355 return ret
11356 }
11357
11358 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11359 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11360
11361 for _, hiddenModuleName := range hiddenModuleNames {
11362 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11363 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11364
11365 }
11366 }
11367
11368 bp := `
11369 apex_key {
11370 name: "com.android.foo.key",
11371 public_key: "com.android.foo.avbpubkey",
11372 private_key: "com.android.foo.pem",
11373 }
11374
11375 // AOSP source apex
11376 apex {
11377 name: "com.android.foo",
11378 key: "com.android.foo.key",
11379 updatable: false,
11380 }
11381
11382 // Google source apex
11383 override_apex {
11384 name: "com.google.android.foo",
11385 base: "com.android.foo",
11386 key: "com.android.foo.key",
11387 }
11388
11389 // Prebuilt Google APEX.
11390
11391 prebuilt_apex {
11392 name: "com.google.android.foo",
11393 apex_name: "com.android.foo",
11394 src: "com.android.foo-arm.apex",
11395 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11396 }
11397
11398 // Another Prebuilt Google APEX
11399 prebuilt_apex {
11400 name: "com.google.android.foo.v2",
11401 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011402 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011403 src: "com.android.foo-arm.apex",
11404 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11405 }
11406
11407 // APEX contribution modules
11408
11409 apex_contributions {
11410 name: "foo.source.contributions",
11411 api_domain: "com.android.foo",
11412 contents: ["com.google.android.foo"],
11413 }
11414
11415 apex_contributions {
11416 name: "foo.prebuilt.contributions",
11417 api_domain: "com.android.foo",
11418 contents: ["prebuilt_com.google.android.foo"],
11419 }
11420
11421 apex_contributions {
11422 name: "foo.prebuilt.v2.contributions",
11423 api_domain: "com.android.foo",
11424 contents: ["prebuilt_com.google.android.foo.v2"],
11425 }
11426
11427 // This is an incompatible module because it selects multiple versions of the same mainline module
11428 apex_contributions {
11429 name: "foo.prebuilt.duplicate.contributions",
11430 api_domain: "com.android.foo",
11431 contents: [
11432 "prebuilt_com.google.android.foo",
11433 "prebuilt_com.google.android.foo.v2",
11434 ],
11435 }
11436 `
11437
11438 testCases := []struct {
11439 desc string
11440 selectedApexContributions string
11441 expectedVisibleModuleName string
11442 expectedHiddenModuleNames []string
11443 expectedError string
11444 }{
11445 {
11446 desc: "Source apex is selected, prebuilts should be hidden from make",
11447 selectedApexContributions: "foo.source.contributions",
11448 expectedVisibleModuleName: "com.google.android.foo",
11449 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11450 },
11451 {
11452 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11453 selectedApexContributions: "foo.prebuilt.contributions",
11454 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11455 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11456 },
11457 {
11458 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11459 selectedApexContributions: "foo.prebuilt.v2.contributions",
11460 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11461 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11462 },
11463 {
11464 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11465 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11466 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11467 },
11468 }
11469
11470 for _, tc := range testCases {
11471 preparer := android.GroupFixturePreparers(
11472 android.FixtureMergeMockFs(map[string][]byte{
11473 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11474 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011475 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011476 )
11477 if tc.expectedError != "" {
11478 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11479 testApex(t, bp, preparer)
11480 return
11481 }
11482 ctx := testApex(t, bp, preparer)
11483
Spandan Das3576e762024-01-03 18:57:03 +000011484 // Check that
11485 // 1. The contents of the selected apex_contributions are visible to make
11486 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11487 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11488 }
11489}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011490
Spandan Das85bd4622024-08-01 00:51:20 +000011491// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11492func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011493 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011494 // for a mainline module family, check that only the flagged soong module is visible to make
11495 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11496 variation := func(moduleName string) string {
11497 ret := "android_common_com.android.adservices"
11498 if moduleName == "com.google.android.foo" {
11499 ret = "android_common_com.google.android.foo_com.google.android.foo"
11500 }
11501 return ret
11502 }
11503
11504 for _, visibleModuleName := range visibleModuleNames {
11505 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11506 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11507 }
11508
11509 for _, hiddenModuleName := range hiddenModuleNames {
11510 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11511 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11512
11513 }
11514 }
11515
11516 bp := `
11517 apex_key {
11518 name: "com.android.adservices.key",
11519 public_key: "com.android.adservices.avbpubkey",
11520 private_key: "com.android.adservices.pem",
11521 }
11522
11523 // AOSP source apex
11524 apex {
11525 name: "com.android.adservices",
11526 key: "com.android.adservices.key",
11527 updatable: false,
11528 }
11529
11530 // Prebuilt Google APEX.
11531
11532 prebuilt_apex {
11533 name: "com.google.android.adservices",
11534 apex_name: "com.android.adservices",
11535 src: "com.android.foo-arm.apex",
11536 }
11537
11538 // Another Prebuilt Google APEX
11539 prebuilt_apex {
11540 name: "com.google.android.adservices.v2",
11541 apex_name: "com.android.adservices",
11542 src: "com.android.foo-arm.apex",
11543 }
11544
11545 // APEX contribution modules
11546
11547
11548 apex_contributions {
11549 name: "adservices.prebuilt.contributions",
11550 api_domain: "com.android.adservices",
11551 contents: ["prebuilt_com.google.android.adservices"],
11552 }
11553
11554 apex_contributions {
11555 name: "adservices.prebuilt.v2.contributions",
11556 api_domain: "com.android.adservices",
11557 contents: ["prebuilt_com.google.android.adservices.v2"],
11558 }
11559 `
11560
11561 testCases := []struct {
11562 desc string
11563 selectedApexContributions string
11564 expectedVisibleModuleNames []string
11565 expectedHiddenModuleNames []string
11566 }{
11567 {
11568 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11569 selectedApexContributions: "",
11570 expectedVisibleModuleNames: []string{"com.android.adservices"},
11571 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11572 },
11573 {
11574 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11575 selectedApexContributions: "adservices.prebuilt.contributions",
11576 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11577 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11578 },
11579 {
11580 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11581 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11582 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11583 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11584 },
11585 }
11586
11587 for _, tc := range testCases {
11588 preparer := android.GroupFixturePreparers(
11589 android.FixtureMergeMockFs(map[string][]byte{
11590 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11591 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011592 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011593 )
11594 ctx := testApex(t, bp, preparer)
11595
11596 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11597 }
11598}
11599
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011600func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011601 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011602 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11603 for _, moduleName := range moduleNames {
11604 ret += fmt.Sprintf(`
11605 aconfig_declarations {
11606 name: "%[1]s",
11607 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011608 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011609 srcs: [
11610 "%[1]s.aconfig",
11611 ],
11612 }
11613 java_aconfig_library {
11614 name: "%[1]s-lib",
11615 aconfig_declarations: "%[1]s",
11616 }
11617 `, moduleName)
11618 }
11619 return ret
11620 }
11621
11622 result := android.GroupFixturePreparers(
11623 prepareForApexTest,
11624 java.PrepareForTestWithJavaSdkLibraryFiles,
11625 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011626 ).RunTestWithBp(t, `
11627 java_library {
11628 name: "baz-java-lib",
11629 static_libs: [
11630 "baz-lib",
11631 ],
11632 }
11633 filegroup {
11634 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011635 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011636 ":qux-lib{.generated_srcjars}",
11637 ],
11638 }
11639 filegroup {
11640 name: "qux-another-filegroup",
11641 srcs: [
11642 ":qux-filegroup",
11643 ],
11644 }
11645 java_library {
11646 name: "quux-java-lib",
11647 srcs: [
11648 "a.java",
11649 ],
11650 libs: [
11651 "quux-lib",
11652 ],
11653 }
11654 java_sdk_library {
11655 name: "foo",
11656 srcs: [
11657 ":qux-another-filegroup",
11658 ],
11659 api_packages: ["foo"],
11660 system: {
11661 enabled: true,
11662 },
11663 module_lib: {
11664 enabled: true,
11665 },
11666 test: {
11667 enabled: true,
11668 },
11669 static_libs: [
11670 "bar-lib",
11671 ],
11672 libs: [
11673 "baz-java-lib",
11674 "quux-java-lib",
11675 ],
11676 aconfig_declarations: [
11677 "bar",
11678 ],
11679 }
11680 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11681
11682 m := result.ModuleForTests("foo.stubs.source", "android_common")
11683 outDir := "out/soong/.intermediates"
11684
11685 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11686 // textproto files
11687 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11688
11689 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11690 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11691 // to aconfig.
11692 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11693 "passed as an input",
11694 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11695
11696 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11697 // to metalava as classpath. Thus the cache file provided by the associated
11698 // aconfig_declarations module "baz" should be passed to aconfig.
11699 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11700 "java_aconfig_library passed as an input",
11701 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11702
11703 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11704 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11705 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11706 "input",
11707 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11708
11709 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11710 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11711 // aconfig_declarations module "quux" should not be passed to aconfig.
11712 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11713 "depend on java_aconfig_library not passed as an input",
11714 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11715}
Cole Faust7c991b42024-05-15 11:17:55 -070011716
11717func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011718 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011719 ctx := testApex(t, `
11720 apex {
11721 name: "myapex",
11722 key: "myapex.key",
11723 prebuilts: ["myetc", "myetc2"],
11724 min_sdk_version: "29",
11725 }
11726 apex_key {
11727 name: "myapex.key",
11728 public_key: "testkey.avbpubkey",
11729 private_key: "testkey.pem",
11730 }
11731
11732 prebuilt_etc {
11733 name: "myetc",
11734 src: "myprebuilt",
11735 filename: "myfilename",
11736 }
11737 prebuilt_etc {
11738 name: "myetc2",
11739 sub_dir: "mysubdir",
11740 src: "myprebuilt",
11741 filename: "myfilename",
11742 }
11743 `, withFiles(android.MockFS{
11744 "packages/modules/common/build/allowed_deps.txt": nil,
11745 }))
11746
11747 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11748 data := android.AndroidMkDataForTest(t, ctx, ab)
11749 var builder strings.Builder
11750 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11751 androidMk := builder.String()
11752
11753 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11754 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11755}
Spandan Das50801e22024-05-13 18:29:45 +000011756
11757func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011758 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011759 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11760 args := module.Rule("apexRule").Args
11761 optFlags := args["opt_flags"]
11762 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11763 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11764 }
11765 }
11766
11767 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11768 t.Helper()
11769 found := false
11770 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11771 if dep == wantDep {
11772 found = true
11773 }
11774 })
11775 if !found {
11776 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11777 }
11778 }
11779
11780 ctx := testApex(t, `
11781 apex {
11782 name: "com.android.apex30",
11783 min_sdk_version: "30",
11784 key: "apex30.key",
11785 java_libs: ["javalib"],
11786 }
11787
11788 java_library {
11789 name: "javalib",
11790 srcs: ["A.java"],
11791 apex_available: ["com.android.apex30"],
11792 min_sdk_version: "30",
11793 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011794 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011795 }
11796
11797 override_apex {
11798 name: "com.mycompany.android.apex30",
11799 base: "com.android.apex30",
11800 }
11801
11802 override_apex {
11803 name: "com.mycompany.android.apex31",
11804 base: "com.android.apex30",
11805 min_sdk_version: "31",
11806 }
11807
11808 apex_key {
11809 name: "apex30.key",
11810 public_key: "testkey.avbpubkey",
11811 private_key: "testkey.pem",
11812 }
11813
11814 `, android.FixtureMergeMockFs(android.MockFS{
11815 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11816 }),
11817 )
11818
11819 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11820 checkMinSdkVersion(t, baseModule, "30")
11821
11822 // Override module, but uses same min_sdk_version
11823 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11824 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11825 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11826 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11827
11828 // Override module, uses different min_sdk_version
11829 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11830 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11831 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11832 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11833}
Spandan Das0b28fa02024-05-28 23:40:17 +000011834
11835func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011836 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011837 context := android.GroupFixturePreparers(
11838 android.PrepareForIntegrationTestWithAndroid,
11839 PrepareForTestWithApexBuildComponents,
11840 android.FixtureMergeMockFs(android.MockFS{
11841 "system/sepolicy/apex/foo-file_contexts": nil,
11842 }),
11843 )
11844 res := context.RunTestWithBp(t, `
11845 apex {
11846 name: "foo",
11847 key: "myapex.key",
11848 apex_available_name: "com.android.foo",
11849 variant_version: "0",
11850 updatable: false,
11851 }
11852 apex_key {
11853 name: "myapex.key",
11854 public_key: "testkey.avbpubkey",
11855 private_key: "testkey.pem",
11856 }
11857 prebuilt_apex {
11858 name: "foo",
11859 src: "foo.apex",
11860 prefer: true,
11861 }
11862 override_apex {
11863 name: "myoverrideapex",
11864 base: "foo",
11865 }
11866 `)
11867
11868 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11869}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011870
11871func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011872 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011873 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`, `
11874 apex {
11875 name: "myapex",
11876 key: "myapex.key",
11877 updatable: true,
11878 min_sdk_version: "current",
11879 }
11880
11881 apex_key {
11882 name: "myapex.key",
11883 public_key: "testkey.avbpubkey",
11884 private_key: "testkey.pem",
11885 }
11886 `)
11887}
Spandan Das2f68f192024-07-22 19:25:50 +000011888
11889func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011890 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011891 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11892 result := android.GroupFixturePreparers(
11893 prepareForApexTest,
11894 android.PrepareForTestWithAndroidMk,
11895 android.PrepareForTestWithMakevars,
11896 android.FixtureMergeMockFs(fs),
11897 ).RunTest(t)
11898
11899 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011900 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011901
11902 installRules := result.InstallMakeRulesForTesting(t)
11903
11904 var installedlibRule *android.InstallMakeRule
11905 for i, rule := range installRules {
11906 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11907 if installedlibRule != nil {
11908 t.Errorf("Duplicate install rules for %s", rule.Target)
11909 }
11910 installedlibRule = &installRules[i]
11911 }
11912 }
11913 if installedlibRule == nil {
11914 t.Errorf("No install rule found for installedlib")
11915 return
11916 }
11917
11918 if expectLibfooOnSystemLib {
11919 android.AssertStringListContains(t,
11920 "installedlib doesn't have install dependency on libfoo impl",
11921 installedlibRule.OrderOnlyDeps,
11922 "out/target/product/test_device/system/lib/libfoo.so")
11923 } else {
11924 android.AssertStringListDoesNotContain(t,
11925 "installedlib has install dependency on libfoo stub",
11926 installedlibRule.Deps,
11927 "out/target/product/test_device/system/lib/libfoo.so")
11928 android.AssertStringListDoesNotContain(t,
11929 "installedlib has order-only install dependency on libfoo stub",
11930 installedlibRule.OrderOnlyDeps,
11931 "out/target/product/test_device/system/lib/libfoo.so")
11932 }
11933 }
11934
11935 prebuiltLibfooBp := []byte(`
11936 cc_prebuilt_library {
11937 name: "libfoo",
11938 prefer: true,
11939 srcs: ["libfoo.so"],
11940 stubs: {
11941 versions: ["1"],
11942 },
11943 apex_available: ["apexfoo"],
11944 }
11945 `)
11946
11947 apexfooBp := []byte(`
11948 apex {
11949 name: "apexfoo",
11950 key: "apexfoo.key",
11951 native_shared_libs: ["libfoo"],
11952 updatable: false,
11953 compile_multilib: "both",
11954 }
11955 apex_key {
11956 name: "apexfoo.key",
11957 public_key: "testkey.avbpubkey",
11958 private_key: "testkey.pem",
11959 }
11960 `)
11961
11962 installedlibBp := []byte(`
11963 cc_library {
11964 name: "installedlib",
11965 shared_libs: ["libfoo"],
11966 }
11967 `)
11968
11969 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011970 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011971 testFunc(
11972 t,
11973 /*expectLibfooOnSystemLib=*/ false,
11974 android.MockFS{
11975 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11976 "apexfoo/Android.bp": apexfooBp,
11977 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11978 "Android.bp": installedlibBp,
11979 },
11980 )
11981 })
11982
11983 disabledSourceLibfooBp := []byte(`
11984 cc_library {
11985 name: "libfoo",
11986 enabled: false,
11987 stubs: {
11988 versions: ["1"],
11989 },
11990 apex_available: ["apexfoo"],
11991 }
11992 `)
11993
11994 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011995 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011996 testFunc(
11997 t,
11998 /*expectLibfooOnSystemLib=*/ false,
11999 android.MockFS{
12000 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12001 "impl/Android.bp": disabledSourceLibfooBp,
12002 "apexfoo/Android.bp": apexfooBp,
12003 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12004 "Android.bp": installedlibBp,
12005 },
12006 )
12007 })
12008}
Jihoon Kange246bb72024-09-18 22:26:22 +000012009
12010func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012011 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000012012 // This test case tests that listing the impl lib instead of the top level java_sdk_library
12013 // in libs of android_app and java_library does not lead to class loader context device/host
12014 // path mismatch errors.
12015 android.GroupFixturePreparers(
12016 prepareForApexTest,
12017 android.PrepareForIntegrationTestWithAndroid,
12018 PrepareForTestWithApexBuildComponents,
12019 android.FixtureModifyEnv(func(env map[string]string) {
12020 env["DISABLE_CONTAINER_CHECK"] = "true"
12021 }),
12022 withFiles(filesForSdkLibrary),
12023 android.FixtureMergeMockFs(android.MockFS{
12024 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
12025 }),
12026 ).RunTestWithBp(t, `
12027 apex {
12028 name: "com.android.foo30",
12029 key: "myapex.key",
12030 updatable: true,
12031 bootclasspath_fragments: [
12032 "foo-bootclasspath-fragment",
12033 ],
12034 java_libs: [
12035 "bar",
12036 ],
12037 apps: [
12038 "bar-app",
12039 ],
12040 min_sdk_version: "30",
12041 }
12042 apex_key {
12043 name: "myapex.key",
12044 public_key: "testkey.avbpubkey",
12045 private_key: "testkey.pem",
12046 }
12047 bootclasspath_fragment {
12048 name: "foo-bootclasspath-fragment",
12049 contents: [
12050 "framework-foo",
12051 ],
12052 apex_available: [
12053 "com.android.foo30",
12054 ],
12055 hidden_api: {
12056 split_packages: ["*"]
12057 },
12058 }
12059
12060 java_sdk_library {
12061 name: "framework-foo",
12062 srcs: [
12063 "A.java"
12064 ],
12065 unsafe_ignore_missing_latest_api: true,
12066 apex_available: [
12067 "com.android.foo30",
12068 ],
12069 compile_dex: true,
12070 sdk_version: "core_current",
12071 shared_library: false,
12072 }
12073
12074 java_library {
12075 name: "bar",
12076 srcs: [
12077 "A.java"
12078 ],
12079 libs: [
12080 "framework-foo.impl",
12081 ],
12082 apex_available: [
12083 "com.android.foo30",
12084 ],
12085 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012086 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012087 }
12088
12089 java_library {
12090 name: "baz",
12091 srcs: [
12092 "A.java"
12093 ],
12094 libs: [
12095 "bar",
12096 ],
12097 sdk_version: "core_current",
12098 }
12099
12100 android_app {
12101 name: "bar-app",
12102 srcs: [
12103 "A.java"
12104 ],
12105 libs: [
12106 "baz",
12107 "framework-foo.impl",
12108 ],
12109 apex_available: [
12110 "com.android.foo30",
12111 ],
12112 sdk_version: "core_current",
12113 min_sdk_version: "30",
12114 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012115 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012116 }
12117 `)
12118}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012119
12120// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12121func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012122 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012123 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12124 apex {
12125 name: "myapex",
12126 key: "myapex.key",
12127 systemserverclasspath_fragments: [
12128 "mysystemserverclasspathfragment",
12129 ],
12130 min_sdk_version: "29",
12131 updatable: true,
12132 system_ext_specific: true,
12133 }
12134
12135 apex_key {
12136 name: "myapex.key",
12137 public_key: "testkey.avbpubkey",
12138 private_key: "testkey.pem",
12139 }
12140
12141 java_library {
12142 name: "foo",
12143 srcs: ["b.java"],
12144 min_sdk_version: "29",
12145 installable: true,
12146 apex_available: [
12147 "myapex",
12148 ],
12149 sdk_version: "current",
12150 }
12151
12152 systemserverclasspath_fragment {
12153 name: "mysystemserverclasspathfragment",
12154 contents: [
12155 "foo",
12156 ],
12157 apex_available: [
12158 "myapex",
12159 ],
12160 }
12161 `,
12162 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12163 )
12164}
Spandan Das72d86c62024-10-15 19:27:41 +000012165
12166// partitions should not package the artifacts that are included inside the apex.
12167func TestFilesystemWithApexDeps(t *testing.T) {
12168 t.Parallel()
12169 result := testApex(t, `
12170 android_filesystem {
12171 name: "myfilesystem",
12172 deps: ["myapex"],
12173 }
12174 apex {
12175 name: "myapex",
12176 key: "myapex.key",
12177 binaries: ["binfoo"],
12178 native_shared_libs: ["libfoo"],
12179 apps: ["appfoo"],
12180 updatable: false,
12181 }
12182 apex_key {
12183 name: "myapex.key",
12184 }
12185 cc_binary {
12186 name: "binfoo",
12187 apex_available: ["myapex"],
12188 }
12189 cc_library {
12190 name: "libfoo",
12191 apex_available: ["myapex"],
12192 }
12193 android_app {
12194 name: "appfoo",
12195 sdk_version: "current",
12196 apex_available: ["myapex"],
12197 }
12198 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12199
12200 partition := result.ModuleForTests("myfilesystem", "android_common")
12201 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12202 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12203}
Colin Crossb614cd42024-10-11 12:52:21 -070012204
12205func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12206 t.Parallel()
12207
12208 extractDepenencyPathFromErrors := func(errs []error) []string {
12209 i := slices.IndexFunc(errs, func(err error) bool {
12210 return strings.Contains(err.Error(), "dependency path:")
12211 })
12212 if i < 0 {
12213 return nil
12214 }
12215 var dependencyPath []string
12216 for _, err := range errs[i+1:] {
12217 s := err.Error()
12218 lastSpace := strings.LastIndexByte(s, ' ')
12219 if lastSpace >= 0 {
12220 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12221 }
12222 }
12223 return dependencyPath
12224 }
12225
12226 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12227 return func(t *testing.T, result *android.TestResult) {
12228 t.Helper()
12229 if len(result.Errs) == 0 {
12230 t.Fatalf("expected errors")
12231 }
12232 t.Log("found errors:")
12233 for _, err := range result.Errs {
12234 t.Log(err)
12235 }
12236 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12237 t.Fatalf("expected error %q, got %q", w, g)
12238 }
12239 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12240 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12241 t.Errorf("expected dependency path %q, got %q", w, g)
12242 }
12243 }
12244 }
12245
12246 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12247 return func(bp *bpmodify.Blueprint) {
12248 m := bp.ModulesByName(module)
12249 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12250 if err != nil {
12251 panic(err)
12252 }
12253 props.AddStringToList(lib)
12254 }
12255 }
12256
12257 bpTemplate := `
12258 apex {
12259 name: "myapex",
12260 key: "myapex.key",
12261 native_shared_libs: ["mylib"],
12262 rust_dyn_libs: ["libmyrust"],
12263 binaries: ["mybin", "myrustbin"],
12264 jni_libs: ["libjni"],
12265 apps: ["myapp"],
12266 updatable: false,
12267 }
12268
12269 apex {
12270 name: "otherapex",
12271 key: "myapex.key",
12272 native_shared_libs: ["libotherapex"],
12273 updatable: false,
12274 }
12275
12276 apex_key {
12277 name: "myapex.key",
12278 public_key: "testkey.avbpubkey",
12279 private_key: "testkey.pem",
12280 }
12281
12282 cc_library {
12283 name: "mylib",
12284 srcs: ["foo.cpp"],
12285 apex_available: ["myapex"],
12286 }
12287
12288 cc_binary {
12289 name: "mybin",
12290 srcs: ["foo.cpp"],
12291 apex_available: ["myapex"],
12292 }
12293
12294 rust_library {
12295 name: "libmyrust",
12296 crate_name: "myrust",
12297 srcs: ["src/lib.rs"],
12298 rustlibs: ["libmyrust_transitive_dylib"],
12299 rlibs: ["libmyrust_transitive_rlib"],
12300 apex_available: ["myapex"],
12301 }
12302
12303 rust_library{
12304 name: "libmyrust_transitive_dylib",
12305 crate_name: "myrust_transitive_dylib",
12306 srcs: ["src/lib.rs"],
12307 apex_available: ["myapex"],
12308 }
12309
12310 rust_library {
12311 name: "libmyrust_transitive_rlib",
12312 crate_name: "myrust_transitive_rlib",
12313 srcs: ["src/lib.rs"],
12314 apex_available: ["myapex"],
12315 }
12316
12317 rust_binary {
12318 name: "myrustbin",
12319 srcs: ["src/main.rs"],
12320 apex_available: ["myapex"],
12321 }
12322
12323 cc_library {
12324 name: "libbar",
12325 sdk_version: "current",
12326 srcs: ["bar.cpp"],
12327 apex_available: ["myapex"],
12328 stl: "none",
12329 }
12330
12331 android_app {
12332 name: "myapp",
12333 jni_libs: ["libembeddedjni"],
12334 use_embedded_native_libs: true,
12335 sdk_version: "current",
12336 apex_available: ["myapex"],
12337 }
12338
12339 cc_library {
12340 name: "libembeddedjni",
12341 sdk_version: "current",
12342 srcs: ["bar.cpp"],
12343 apex_available: ["myapex"],
12344 stl: "none",
12345 }
12346
12347 cc_library {
12348 name: "libjni",
12349 sdk_version: "current",
12350 srcs: ["bar.cpp"],
12351 apex_available: ["myapex"],
12352 stl: "none",
12353 }
12354
12355 cc_library {
12356 name: "libotherapex",
12357 sdk_version: "current",
12358 srcs: ["otherapex.cpp"],
12359 apex_available: ["otherapex"],
12360 stubs: {
12361 symbol_file: "libotherapex.map.txt",
12362 versions: ["1", "2", "3"],
12363 },
12364 stl: "none",
12365 }
12366
12367 cc_library {
12368 name: "libplatform",
12369 sdk_version: "current",
12370 srcs: ["libplatform.cpp"],
12371 stubs: {
12372 symbol_file: "libplatform.map.txt",
12373 versions: ["1", "2", "3"],
12374 },
12375 stl: "none",
12376 system_shared_libs: [],
12377 }
12378 `
12379
12380 testCases := []struct {
12381 name string
12382 bpModifier func(bp *bpmodify.Blueprint)
12383 dependencyPath []string
12384 }{
12385 {
12386 name: "library dependency in other apex",
12387 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12388 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12389 },
12390 {
12391 name: "transitive library dependency in other apex",
12392 bpModifier: func(bp *bpmodify.Blueprint) {
12393 addToSharedLibs("mylib", "libbar")(bp)
12394 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12395 },
12396 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12397 },
12398 {
12399 name: "library dependency in platform",
12400 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12401 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12402 },
12403 {
12404 name: "jni library dependency in other apex",
12405 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12406 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12407 },
12408 {
12409 name: "transitive jni library dependency in other apex",
12410 bpModifier: func(bp *bpmodify.Blueprint) {
12411 addToSharedLibs("libjni", "libbar")(bp)
12412 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12413 },
12414 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12415 },
12416 {
12417 name: "jni library dependency in platform",
12418 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12419 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12420 },
12421 {
12422 name: "transitive jni library dependency in platform",
12423 bpModifier: func(bp *bpmodify.Blueprint) {
12424 addToSharedLibs("libjni", "libbar")(bp)
12425 addToSharedLibs("libbar", "libplatform#impl")(bp)
12426 },
12427 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12428 },
Spandan Das10c41362024-12-03 01:33:09 +000012429 {
12430 name: "app jni library dependency in other apex",
12431 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12432 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12433 },
12434 {
12435 name: "transitive app jni library dependency in other apex",
12436 bpModifier: func(bp *bpmodify.Blueprint) {
12437 addToSharedLibs("libembeddedjni", "libbar")(bp)
12438 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12439 },
12440 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12441 },
12442 {
12443 name: "app jni library dependency in platform",
12444 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12445 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12446 },
12447 {
12448 name: "transitive app jni library dependency in platform",
12449 bpModifier: func(bp *bpmodify.Blueprint) {
12450 addToSharedLibs("libembeddedjni", "libbar")(bp)
12451 addToSharedLibs("libbar", "libplatform#impl")(bp)
12452 },
12453 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12454 },
Colin Crossb614cd42024-10-11 12:52:21 -070012455 {
12456 name: "binary dependency in other apex",
12457 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12458 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12459 },
12460 {
12461 name: "transitive binary dependency in other apex",
12462 bpModifier: func(bp *bpmodify.Blueprint) {
12463 addToSharedLibs("mybin", "libbar")(bp)
12464 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12465 },
12466 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12467 },
12468 {
12469 name: "binary dependency in platform",
12470 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12471 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12472 },
12473 {
12474 name: "transitive binary dependency in platform",
12475 bpModifier: func(bp *bpmodify.Blueprint) {
12476 addToSharedLibs("mybin", "libbar")(bp)
12477 addToSharedLibs("libbar", "libplatform#impl")(bp)
12478 },
12479 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12480 },
12481
12482 {
12483 name: "rust library dependency in other apex",
12484 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12485 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12486 },
12487 {
12488 name: "transitive rust library dependency in other apex",
12489 bpModifier: func(bp *bpmodify.Blueprint) {
12490 addToSharedLibs("libmyrust", "libbar")(bp)
12491 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12492 },
12493 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12494 },
12495 {
12496 name: "rust library dependency in platform",
12497 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12498 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12499 },
12500 {
12501 name: "transitive rust library dependency in platform",
12502 bpModifier: func(bp *bpmodify.Blueprint) {
12503 addToSharedLibs("libmyrust", "libbar")(bp)
12504 addToSharedLibs("libbar", "libplatform#impl")(bp)
12505 },
12506 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12507 },
12508 {
12509 name: "transitive rust library dylib dependency in other apex",
12510 bpModifier: func(bp *bpmodify.Blueprint) {
12511 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12512 },
12513 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12514 },
12515 {
12516 name: "transitive rust library dylib dependency in platform",
12517 bpModifier: func(bp *bpmodify.Blueprint) {
12518 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12519 },
12520 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12521 },
12522 {
12523 name: "transitive rust library rlib dependency in other apex",
12524 bpModifier: func(bp *bpmodify.Blueprint) {
12525 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12526 },
12527 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12528 },
12529 {
12530 name: "transitive rust library rlib dependency in platform",
12531 bpModifier: func(bp *bpmodify.Blueprint) {
12532 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12533 },
12534 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12535 },
12536 {
12537 name: "rust binary dependency in other apex",
12538 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12539 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12540 },
12541 {
12542 name: "transitive rust binary dependency in other apex",
12543 bpModifier: func(bp *bpmodify.Blueprint) {
12544 addToSharedLibs("myrustbin", "libbar")(bp)
12545 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12546 },
12547 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12548 },
12549 {
12550 name: "rust binary dependency in platform",
12551 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12552 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12553 },
12554 {
12555 name: "transitive rust binary dependency in platform",
12556 bpModifier: func(bp *bpmodify.Blueprint) {
12557 addToSharedLibs("myrustbin", "libbar")(bp)
12558 addToSharedLibs("libbar", "libplatform#impl")(bp)
12559 },
12560 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12561 },
12562 }
12563
12564 for _, testCase := range testCases {
12565 t.Run(testCase.name, func(t *testing.T) {
12566 t.Parallel()
12567 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12568 if err != nil {
12569 t.Fatal(err)
12570 }
12571 if testCase.bpModifier != nil {
12572 func() {
12573 defer func() {
12574 if r := recover(); r != nil {
12575 t.Fatalf("panic in bpModifier: %v", r)
12576 }
12577 }()
12578 testCase.bpModifier(bp)
12579 }()
12580 }
12581 android.GroupFixturePreparers(
12582 android.PrepareForTestWithAndroidBuildComponents,
12583 cc.PrepareForTestWithCcBuildComponents,
12584 java.PrepareForTestWithDexpreopt,
12585 rust.PrepareForTestWithRustDefaultModules,
12586 PrepareForTestWithApexBuildComponents,
12587 prepareForTestWithMyapex,
12588 prepareForTestWithOtherapex,
12589 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12590 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12591 }),
12592 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12593 RunTestWithBp(t, bp.String())
12594 })
12595 }
12596}