blob: b344a2bb9d853d601d00c3477eccc4e877a38af2 [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
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002424func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002425 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002426 ctx := testApex(t, `
2427 apex {
2428 name: "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"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002454 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han4495f842023-04-25 16:39:59 +09002455 min_sdk_version: "29",
2456 apex_available: ["myapex"],
2457 }
2458
2459 cc_library {
2460 name: "libbar",
2461 stubs: { versions: ["29", "30"] },
2462 }
2463
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002464 rust_ffi {
2465 name: "libbar_rs",
2466 crate_name: "bar_rs",
2467 srcs: ["bar.rs"],
2468 stubs: { versions: ["29", "30"] },
2469 }
2470
Jooyung Han4495f842023-04-25 16:39:59 +09002471 cc_library {
2472 name: "yourlib",
2473 srcs: ["mylib.cpp"],
2474 min_sdk_version: "29",
2475 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2476 }
2477 `, withFiles(android.MockFS{
2478 "packages/modules/common/build/allowed_deps.txt": nil,
2479 }))
2480
2481 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2482 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002483 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002484 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002485 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002486 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002487
2488 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2489 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2490 myapex.Output("depsinfo/flatlist.txt")), "\n")
2491 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2492 flatlist, "libbar(minSdkVersion:(no version)) (external)")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002493 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2494 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002495 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2496 flatlist, "mylib:(minSdkVersion:29)")
2497 android.AssertStringListContains(t, "track platform-available lib",
2498 flatlist, "yourlib(minSdkVersion:29)")
Jooyung Han4495f842023-04-25 16:39:59 +09002499}
2500
2501func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002502 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002503 ctx := testApex(t, `
2504 apex {
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002505 name: "myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002506 key: "myapex.key",
2507 updatable: true,
2508 min_sdk_version: "29",
2509 }
2510
2511 apex_key {
2512 name: "myapex.key",
2513 public_key: "testkey.avbpubkey",
2514 private_key: "testkey.pem",
2515 }
Pechetty Sravani (xWF)0d02c062025-01-13 00:39:47 -08002516 `)
Jooyung Han4495f842023-04-25 16:39:59 +09002517 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2518 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2519 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2520 }
2521}
2522
Jooyung Han03b51852020-02-26 22:45:42 +09002523func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002524 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002525 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002526 apex {
2527 name: "myapex",
2528 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002529 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002530 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002531 }
2532
2533 apex_key {
2534 name: "myapex.key",
2535 public_key: "testkey.avbpubkey",
2536 private_key: "testkey.pem",
2537 }
2538
2539 cc_library {
2540 name: "libx",
2541 system_shared_libs: [],
2542 stl: "none",
2543 apex_available: [ "myapex" ],
2544 stubs: {
2545 versions: ["1", "2"],
2546 },
2547 }
2548
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002549 rust_ffi {
2550 name: "libx_rs",
2551 crate_name: "x_rs",
2552 srcs: ["x.rs"],
2553 apex_available: [ "myapex" ],
2554 stubs: {
2555 versions: ["1", "2"],
2556 },
2557 }
2558
Jooyung Han03b51852020-02-26 22:45:42 +09002559 cc_library {
2560 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002561 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002562 system_shared_libs: [],
2563 stl: "none",
2564 }
2565 `)
2566
2567 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002568 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002569 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2570 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2571 }
2572 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002573 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002574 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2575 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2576 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002577 expectLink("libz", "shared", "libx", "shared_current")
2578 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002579 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2580 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002581 expectNoLink("libz", "shared", "libz", "shared_1")
2582 expectNoLink("libz", "shared", "libz", "shared")
2583}
2584
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002585var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2586 func(variables android.FixtureProductVariables) {
2587 variables.SanitizeDevice = []string{"hwaddress"}
2588 },
2589)
2590
Jooyung Han75568392020-03-20 04:29:24 +09002591func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002592 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002593 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002594 apex {
2595 name: "myapex",
2596 key: "myapex.key",
2597 native_shared_libs: ["libx"],
2598 min_sdk_version: "29",
2599 }
2600
2601 apex_key {
2602 name: "myapex.key",
2603 public_key: "testkey.avbpubkey",
2604 private_key: "testkey.pem",
2605 }
2606
2607 cc_library {
2608 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002609 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002610 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002611 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002612 }
2613
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002614 rust_ffi {
2615 name: "libbar_rs",
2616 crate_name: "bar_rs",
2617 srcs: ["bar.rs"],
2618 stubs: { versions: ["29", "30"] },
2619 }
2620
Jooyung Han03b51852020-02-26 22:45:42 +09002621 cc_library {
2622 name: "libbar",
2623 stubs: {
2624 versions: ["29", "30"],
2625 },
2626 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002627 `,
2628 prepareForTestWithSantitizeHwaddress,
2629 )
Jooyung Han03b51852020-02-26 22:45:42 +09002630 expectLink := func(from, from_variant, to, to_variant string) {
2631 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2632 libFlags := ld.Args["libFlags"]
2633 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2634 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002635 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002636 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002637}
2638
Jooyung Han75568392020-03-20 04:29:24 +09002639func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002640 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002641 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002642 apex {
2643 name: "myapex",
2644 key: "myapex.key",
2645 native_shared_libs: ["libx"],
2646 min_sdk_version: "29",
2647 }
2648
2649 apex_key {
2650 name: "myapex.key",
2651 public_key: "testkey.avbpubkey",
2652 private_key: "testkey.pem",
2653 }
2654
2655 cc_library {
2656 name: "libx",
2657 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002658 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002659 }
Jooyung Han75568392020-03-20 04:29:24 +09002660 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002661
2662 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002663 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002664 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002665 // note that platform variant is not.
2666 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002667 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002668}
2669
Jooyung Han749dc692020-04-15 11:03:39 +09002670func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002671 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002672 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002673 apex {
2674 name: "myapex",
2675 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002676 native_shared_libs: ["mylib"],
2677 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002678 }
2679
2680 apex_key {
2681 name: "myapex.key",
2682 public_key: "testkey.avbpubkey",
2683 private_key: "testkey.pem",
2684 }
Jooyung Han749dc692020-04-15 11:03:39 +09002685
2686 cc_library {
2687 name: "mylib",
2688 srcs: ["mylib.cpp"],
2689 system_shared_libs: [],
2690 stl: "none",
2691 apex_available: [
2692 "myapex",
2693 ],
2694 min_sdk_version: "30",
2695 }
2696 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002697
2698 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2699 apex {
2700 name: "myapex",
2701 key: "myapex.key",
2702 native_shared_libs: ["libfoo.ffi"],
2703 min_sdk_version: "29",
2704 }
2705
2706 apex_key {
2707 name: "myapex.key",
2708 public_key: "testkey.avbpubkey",
2709 private_key: "testkey.pem",
2710 }
2711
2712 rust_ffi_shared {
2713 name: "libfoo.ffi",
2714 srcs: ["foo.rs"],
2715 crate_name: "foo",
2716 apex_available: [
2717 "myapex",
2718 ],
2719 min_sdk_version: "30",
2720 }
2721 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002722
2723 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2724 apex {
2725 name: "myapex",
2726 key: "myapex.key",
2727 java_libs: ["libfoo"],
2728 min_sdk_version: "29",
2729 }
2730
2731 apex_key {
2732 name: "myapex.key",
2733 public_key: "testkey.avbpubkey",
2734 private_key: "testkey.pem",
2735 }
2736
2737 java_import {
2738 name: "libfoo",
2739 jars: ["libfoo.jar"],
2740 apex_available: [
2741 "myapex",
2742 ],
2743 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002744 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002745 }
2746 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002747
2748 // Skip check for modules compiling against core API surface
2749 testApex(t, `
2750 apex {
2751 name: "myapex",
2752 key: "myapex.key",
2753 java_libs: ["libfoo"],
2754 min_sdk_version: "29",
2755 }
2756
2757 apex_key {
2758 name: "myapex.key",
2759 public_key: "testkey.avbpubkey",
2760 private_key: "testkey.pem",
2761 }
2762
2763 java_library {
2764 name: "libfoo",
2765 srcs: ["Foo.java"],
2766 apex_available: [
2767 "myapex",
2768 ],
2769 // Compile against core API surface
2770 sdk_version: "core_current",
2771 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002772 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002773 }
2774 `)
2775
Jooyung Han749dc692020-04-15 11:03:39 +09002776}
2777
2778func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002779 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002780 testApex(t, `
2781 apex {
2782 name: "myapex",
2783 key: "myapex.key",
2784 native_shared_libs: ["libfoo"],
2785 java_libs: ["libbar"],
2786 min_sdk_version: "29",
2787 }
2788
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794
2795 cc_library {
2796 name: "libfoo",
2797 srcs: ["mylib.cpp"],
2798 shared_libs: ["libfoo_dep"],
2799 apex_available: ["myapex"],
2800 min_sdk_version: "29",
2801 }
2802
2803 cc_library {
2804 name: "libfoo_dep",
2805 srcs: ["mylib.cpp"],
2806 apex_available: ["myapex"],
2807 min_sdk_version: "29",
2808 }
2809
2810 java_library {
2811 name: "libbar",
2812 sdk_version: "current",
2813 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002814 static_libs: [
2815 "libbar_dep",
2816 "libbar_import_dep",
2817 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002818 apex_available: ["myapex"],
2819 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002820 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002821 }
2822
2823 java_library {
2824 name: "libbar_dep",
2825 sdk_version: "current",
2826 srcs: ["a.java"],
2827 apex_available: ["myapex"],
2828 min_sdk_version: "29",
2829 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002830
2831 java_import {
2832 name: "libbar_import_dep",
2833 jars: ["libbar.jar"],
2834 apex_available: ["myapex"],
2835 min_sdk_version: "29",
2836 }
Jooyung Han03b51852020-02-26 22:45:42 +09002837 `)
2838}
2839
Colin Cross8ca61c12022-10-06 21:00:14 -07002840func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002841 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002842 // Tests that an apex dependency with min_sdk_version higher than the
2843 // min_sdk_version of the apex is allowed as long as the dependency's
2844 // min_sdk_version is less than or equal to the api level that the
2845 // architecture was introduced in. In this case, arm64 didn't exist
2846 // until api level 21, so the arm64 code will never need to run on
2847 // an api level 20 device, even if other architectures of the apex
2848 // will.
2849 testApex(t, `
2850 apex {
2851 name: "myapex",
2852 key: "myapex.key",
2853 native_shared_libs: ["libfoo"],
2854 min_sdk_version: "20",
2855 }
2856
2857 apex_key {
2858 name: "myapex.key",
2859 public_key: "testkey.avbpubkey",
2860 private_key: "testkey.pem",
2861 }
2862
2863 cc_library {
2864 name: "libfoo",
2865 srcs: ["mylib.cpp"],
2866 apex_available: ["myapex"],
2867 min_sdk_version: "21",
2868 stl: "none",
2869 }
2870 `)
2871}
2872
Artur Satayev8cf899a2020-04-15 17:29:42 +01002873func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002874 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002875 testCases := []struct {
2876 name string
2877 expectedError string
2878 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002879 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002880 }{
2881 {
2882 name: "Non-updatable apex with non-stable dep",
2883 bp: `
2884 apex {
2885 name: "myapex",
2886 java_libs: ["myjar"],
2887 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002888 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002889 }
2890 apex_key {
2891 name: "myapex.key",
2892 public_key: "testkey.avbpubkey",
2893 private_key: "testkey.pem",
2894 }
2895 java_library {
2896 name: "myjar",
2897 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002898 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002899 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002900 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002901 }
2902 `,
2903 },
2904 {
2905 name: "Updatable apex with stable dep",
2906 bp: `
2907 apex {
2908 name: "myapex",
2909 java_libs: ["myjar"],
2910 key: "myapex.key",
2911 updatable: true,
2912 min_sdk_version: "29",
2913 }
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919 java_library {
2920 name: "myjar",
2921 srcs: ["foo/bar/MyClass.java"],
2922 sdk_version: "current",
2923 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002924 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002925 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002926 }
2927 `,
2928 },
2929 {
2930 name: "Updatable apex with non-stable dep",
2931 expectedError: "cannot depend on \"myjar\"",
2932 bp: `
2933 apex {
2934 name: "myapex",
2935 java_libs: ["myjar"],
2936 key: "myapex.key",
2937 updatable: true,
2938 }
2939 apex_key {
2940 name: "myapex.key",
2941 public_key: "testkey.avbpubkey",
2942 private_key: "testkey.pem",
2943 }
2944 java_library {
2945 name: "myjar",
2946 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002947 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002948 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002949 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002950 }
2951 `,
2952 },
2953 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002954 name: "Updatable apex with non-stable legacy core platform dep",
2955 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2956 bp: `
2957 apex {
2958 name: "myapex",
2959 java_libs: ["myjar-uses-legacy"],
2960 key: "myapex.key",
2961 updatable: true,
2962 }
2963 apex_key {
2964 name: "myapex.key",
2965 public_key: "testkey.avbpubkey",
2966 private_key: "testkey.pem",
2967 }
2968 java_library {
2969 name: "myjar-uses-legacy",
2970 srcs: ["foo/bar/MyClass.java"],
2971 sdk_version: "core_platform",
2972 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002973 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002974 }
2975 `,
2976 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2977 },
2978 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002979 name: "Updatable apex with non-stable transitive dep",
2980 // This is not actually detecting that the transitive dependency is unstable, rather it is
2981 // detecting that the transitive dependency is building against a wider API surface than the
2982 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002983 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002984 bp: `
2985 apex {
2986 name: "myapex",
2987 java_libs: ["myjar"],
2988 key: "myapex.key",
2989 updatable: true,
2990 }
2991 apex_key {
2992 name: "myapex.key",
2993 public_key: "testkey.avbpubkey",
2994 private_key: "testkey.pem",
2995 }
2996 java_library {
2997 name: "myjar",
2998 srcs: ["foo/bar/MyClass.java"],
2999 sdk_version: "current",
3000 apex_available: ["myapex"],
3001 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003002 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003003 }
3004 java_library {
3005 name: "transitive-jar",
3006 srcs: ["foo/bar/MyClass.java"],
3007 sdk_version: "core_platform",
3008 apex_available: ["myapex"],
3009 }
3010 `,
3011 },
3012 }
3013
3014 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003015 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3016 continue
3017 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003018 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003019 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003020 errorHandler := android.FixtureExpectsNoErrors
3021 if test.expectedError != "" {
3022 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003023 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003024 android.GroupFixturePreparers(
3025 java.PrepareForTestWithJavaDefaultModules,
3026 PrepareForTestWithApexBuildComponents,
3027 prepareForTestWithMyapex,
3028 android.OptionalFixturePreparer(test.preparer),
3029 ).
3030 ExtendWithErrorHandler(errorHandler).
3031 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003032 })
3033 }
3034}
3035
Jooyung Han749dc692020-04-15 11:03:39 +09003036func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3037 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3038 apex {
3039 name: "myapex",
3040 key: "myapex.key",
3041 native_shared_libs: ["mylib"],
3042 min_sdk_version: "29",
3043 }
3044
3045 apex_key {
3046 name: "myapex.key",
3047 public_key: "testkey.avbpubkey",
3048 private_key: "testkey.pem",
3049 }
3050
3051 cc_library {
3052 name: "mylib",
3053 srcs: ["mylib.cpp"],
3054 shared_libs: ["mylib2"],
3055 system_shared_libs: [],
3056 stl: "none",
3057 apex_available: [
3058 "myapex",
3059 ],
3060 min_sdk_version: "29",
3061 }
3062
3063 // indirect part of the apex
3064 cc_library {
3065 name: "mylib2",
3066 srcs: ["mylib.cpp"],
3067 system_shared_libs: [],
3068 stl: "none",
3069 apex_available: [
3070 "myapex",
3071 ],
3072 min_sdk_version: "30",
3073 }
3074 `)
3075}
3076
3077func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003078 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003079 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3080 apex {
3081 name: "myapex",
3082 key: "myapex.key",
3083 apps: ["AppFoo"],
3084 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003085 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003086 }
3087
3088 apex_key {
3089 name: "myapex.key",
3090 public_key: "testkey.avbpubkey",
3091 private_key: "testkey.pem",
3092 }
3093
3094 android_app {
3095 name: "AppFoo",
3096 srcs: ["foo/bar/MyClass.java"],
3097 sdk_version: "current",
3098 min_sdk_version: "29",
3099 system_modules: "none",
3100 stl: "none",
3101 static_libs: ["bar"],
3102 apex_available: [ "myapex" ],
3103 }
3104
3105 java_library {
3106 name: "bar",
3107 sdk_version: "current",
3108 srcs: ["a.java"],
3109 apex_available: [ "myapex" ],
3110 }
3111 `)
3112}
3113
3114func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003115 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003116 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003117 apex {
3118 name: "myapex",
3119 key: "myapex.key",
3120 native_shared_libs: ["mylib"],
3121 min_sdk_version: "29",
3122 }
3123
3124 apex_key {
3125 name: "myapex.key",
3126 public_key: "testkey.avbpubkey",
3127 private_key: "testkey.pem",
3128 }
3129
Colin Crossea91a172024-11-05 16:14:05 -08003130 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003131 cc_library {
3132 name: "mylib",
3133 srcs: ["mylib.cpp"],
3134 shared_libs: ["mylib2"],
3135 system_shared_libs: [],
3136 stl: "none",
3137 apex_available: ["myapex", "otherapex"],
3138 min_sdk_version: "29",
3139 }
3140
3141 cc_library {
3142 name: "mylib2",
3143 srcs: ["mylib.cpp"],
3144 system_shared_libs: [],
3145 stl: "none",
3146 apex_available: ["otherapex"],
3147 stubs: { versions: ["29", "30"] },
3148 min_sdk_version: "30",
3149 }
3150
3151 apex {
3152 name: "otherapex",
3153 key: "myapex.key",
3154 native_shared_libs: ["mylib", "mylib2"],
3155 min_sdk_version: "30",
3156 }
3157 `)
3158 expectLink := func(from, from_variant, to, to_variant string) {
3159 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3160 libFlags := ld.Args["libFlags"]
3161 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3162 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003163 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003164 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003165}
3166
Jooyung Haned124c32021-01-26 11:43:46 +09003167func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003168 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003169 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3170 func(variables android.FixtureProductVariables) {
3171 variables.Platform_sdk_codename = proptools.StringPtr("S")
3172 variables.Platform_version_active_codenames = []string{"S"}
3173 },
3174 )
Jooyung Haned124c32021-01-26 11:43:46 +09003175 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3176 apex {
3177 name: "myapex",
3178 key: "myapex.key",
3179 native_shared_libs: ["libfoo"],
3180 min_sdk_version: "S",
3181 }
3182 apex_key {
3183 name: "myapex.key",
3184 public_key: "testkey.avbpubkey",
3185 private_key: "testkey.pem",
3186 }
3187 cc_library {
3188 name: "libfoo",
3189 shared_libs: ["libbar"],
3190 apex_available: ["myapex"],
3191 min_sdk_version: "29",
3192 }
3193 cc_library {
3194 name: "libbar",
3195 apex_available: ["myapex"],
3196 }
3197 `, withSAsActiveCodeNames)
3198}
3199
3200func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003201 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003202 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3203 variables.Platform_sdk_codename = proptools.StringPtr("S")
3204 variables.Platform_version_active_codenames = []string{"S", "T"}
3205 })
Colin Cross1c460562021-02-16 17:55:47 -08003206 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003207 apex {
3208 name: "myapex",
3209 key: "myapex.key",
3210 native_shared_libs: ["libfoo"],
3211 min_sdk_version: "S",
3212 }
3213 apex_key {
3214 name: "myapex.key",
3215 public_key: "testkey.avbpubkey",
3216 private_key: "testkey.pem",
3217 }
3218 cc_library {
3219 name: "libfoo",
3220 shared_libs: ["libbar"],
3221 apex_available: ["myapex"],
3222 min_sdk_version: "S",
3223 }
3224 cc_library {
3225 name: "libbar",
3226 stubs: {
3227 symbol_file: "libbar.map.txt",
3228 versions: ["30", "S", "T"],
3229 },
3230 }
3231 `, withSAsActiveCodeNames)
3232
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003233 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003234 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3235 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003236 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003237}
3238
Jiyong Park7c2ee712018-12-07 00:42:25 +09003239func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003240 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003241 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003242 apex {
3243 name: "myapex",
3244 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003245 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003246 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003247 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003248 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003249 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003250 }
3251
3252 apex_key {
3253 name: "myapex.key",
3254 public_key: "testkey.avbpubkey",
3255 private_key: "testkey.pem",
3256 }
3257
3258 prebuilt_etc {
3259 name: "myetc",
3260 src: "myprebuilt",
3261 sub_dir: "foo/bar",
3262 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003263
3264 cc_library {
3265 name: "mylib",
3266 srcs: ["mylib.cpp"],
3267 relative_install_path: "foo/bar",
3268 system_shared_libs: [],
3269 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003270 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003271 }
3272
3273 cc_binary {
3274 name: "mybin",
3275 srcs: ["mylib.cpp"],
3276 relative_install_path: "foo/bar",
3277 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003278 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003279 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003280 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003281
3282 rust_binary {
3283 name: "mybin.rust",
3284 srcs: ["foo.rs"],
3285 relative_install_path: "rust_subdir",
3286 apex_available: [ "myapex" ],
3287 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003288 `)
3289
Jooyung Hana0503a52023-08-23 13:12:50 +09003290 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003291 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003292
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003293 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003294 ensureContains(t, cmd, "/etc ")
3295 ensureContains(t, cmd, "/etc/foo ")
3296 ensureContains(t, cmd, "/etc/foo/bar ")
3297 ensureContains(t, cmd, "/lib64 ")
3298 ensureContains(t, cmd, "/lib64/foo ")
3299 ensureContains(t, cmd, "/lib64/foo/bar ")
3300 ensureContains(t, cmd, "/lib ")
3301 ensureContains(t, cmd, "/lib/foo ")
3302 ensureContains(t, cmd, "/lib/foo/bar ")
3303 ensureContains(t, cmd, "/bin ")
3304 ensureContains(t, cmd, "/bin/foo ")
3305 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003306 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003307}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003308
Jooyung Han35155c42020-02-06 17:33:20 +09003309func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003310 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003311 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003312 apex {
3313 name: "myapex",
3314 key: "myapex.key",
3315 multilib: {
3316 both: {
3317 native_shared_libs: ["mylib"],
3318 binaries: ["mybin"],
3319 },
3320 },
3321 compile_multilib: "both",
3322 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003323 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003324 }
3325
3326 apex_key {
3327 name: "myapex.key",
3328 public_key: "testkey.avbpubkey",
3329 private_key: "testkey.pem",
3330 }
3331
3332 cc_library {
3333 name: "mylib",
3334 relative_install_path: "foo/bar",
3335 system_shared_libs: [],
3336 stl: "none",
3337 apex_available: [ "myapex" ],
3338 native_bridge_supported: true,
3339 }
3340
3341 cc_binary {
3342 name: "mybin",
3343 relative_install_path: "foo/bar",
3344 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003345 stl: "none",
3346 apex_available: [ "myapex" ],
3347 native_bridge_supported: true,
3348 compile_multilib: "both", // default is "first" for binary
3349 multilib: {
3350 lib64: {
3351 suffix: "64",
3352 },
3353 },
3354 }
Spandan Das45e40012024-12-02 22:45:48 +00003355 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003356 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003357 "bin/foo/bar/mybin",
3358 "bin/foo/bar/mybin64",
3359 "bin/arm/foo/bar/mybin",
3360 "bin/arm64/foo/bar/mybin64",
3361 "lib/foo/bar/mylib.so",
3362 "lib/arm/foo/bar/mylib.so",
3363 "lib64/foo/bar/mylib.so",
3364 "lib64/arm64/foo/bar/mylib.so",
3365 })
3366}
3367
Jooyung Han85d61762020-06-24 23:50:26 +09003368func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003369 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003370 result := android.GroupFixturePreparers(
3371 prepareForApexTest,
3372 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3373 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003374 apex {
3375 name: "myapex",
3376 key: "myapex.key",
3377 binaries: ["mybin"],
3378 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003379 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003380 }
3381 apex_key {
3382 name: "myapex.key",
3383 public_key: "testkey.avbpubkey",
3384 private_key: "testkey.pem",
3385 }
3386 cc_binary {
3387 name: "mybin",
3388 vendor: true,
3389 shared_libs: ["libfoo"],
3390 }
3391 cc_library {
3392 name: "libfoo",
3393 proprietary: true,
3394 }
3395 `)
3396
Jooyung Hana0503a52023-08-23 13:12:50 +09003397 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003398 "bin/mybin",
3399 "lib64/libfoo.so",
3400 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3401 "lib64/libc++.so",
3402 })
3403
Jooyung Hana0503a52023-08-23 13:12:50 +09003404 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003405 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003406 name := apexBundle.BaseModuleName()
3407 prefix := "TARGET_"
3408 var builder strings.Builder
3409 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003410 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003411 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003412 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003413
Jooyung Hana0503a52023-08-23 13:12:50 +09003414 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003415 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3416 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003417}
3418
Justin Yun13decfb2021-03-08 19:25:55 +09003419func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003420 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003421 ctx := testApex(t, `
3422 apex {
3423 name: "myapex",
3424 key: "myapex.key",
3425 updatable: false,
3426 product_specific: true,
3427 binaries: ["foo"],
3428 }
3429
3430 apex_key {
3431 name: "myapex.key",
3432 public_key: "testkey.avbpubkey",
3433 private_key: "testkey.pem",
3434 }
3435
3436 cc_binary {
3437 name: "foo",
3438 product_available: true,
3439 apex_available: ["myapex"],
3440 srcs: ["foo.cpp"],
3441 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003442 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003443
3444 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003445 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003446 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3447 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3448 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3449 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3450}
3451
Jooyung Han8e5685d2020-09-21 11:02:57 +09003452func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003453 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003454 testCases := []struct {
3455 name string
3456 additionalProp string
3457 }{
3458 {"system apex with prebuilt_firmware", ""},
3459 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3460 }
3461 for _, tc := range testCases {
3462 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003463 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003464 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003465 apex {
3466 name: "myapex",
3467 key: "myapex.key",
3468 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003469 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003470 `+tc.additionalProp+`
3471 }
3472 apex_key {
3473 name: "myapex.key",
3474 public_key: "testkey.avbpubkey",
3475 private_key: "testkey.pem",
3476 }
3477 prebuilt_firmware {
3478 name: "myfirmware",
3479 src: "myfirmware.bin",
3480 filename_from_src: true,
3481 `+tc.additionalProp+`
3482 }
3483 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003484 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003485 "etc/firmware/myfirmware.bin",
3486 })
3487 })
3488 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003489}
3490
Jooyung Hanefb184e2020-06-25 17:14:25 +09003491func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003492 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003493 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003494 apex {
3495 name: "myapex",
3496 key: "myapex.key",
3497 vendor: true,
3498 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003499 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003500 }
3501
3502 apex_key {
3503 name: "myapex.key",
3504 public_key: "testkey.avbpubkey",
3505 private_key: "testkey.pem",
3506 }
3507
3508 cc_library {
3509 name: "mylib",
3510 vendor_available: true,
3511 }
3512 `)
3513
Jooyung Hana0503a52023-08-23 13:12:50 +09003514 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003515 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003516 name := apexBundle.BaseModuleName()
3517 prefix := "TARGET_"
3518 var builder strings.Builder
3519 data.Custom(&builder, name, prefix, "", data)
3520 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003521 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 +09003522}
3523
Jooyung Han2ed99d02020-06-24 23:26:26 +09003524func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003525 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003526 apex {
3527 name: "myapex",
3528 key: "myapex.key",
3529 vintf_fragments: ["fragment.xml"],
3530 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003531 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003532 }
3533 apex_key {
3534 name: "myapex.key",
3535 public_key: "testkey.avbpubkey",
3536 private_key: "testkey.pem",
3537 }
3538 cc_binary {
3539 name: "mybin",
3540 }
3541 `)
3542
Jooyung Hana0503a52023-08-23 13:12:50 +09003543 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003544 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003545 name := apexBundle.BaseModuleName()
3546 prefix := "TARGET_"
3547 var builder strings.Builder
3548 data.Custom(&builder, name, prefix, "", data)
3549 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003550 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003551 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003552}
3553
Jiyong Park16e91a02018-12-20 18:18:08 +09003554func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003555 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003556 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003557 apex {
3558 name: "myapex",
3559 key: "myapex.key",
3560 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003561 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003562 }
3563
3564 apex_key {
3565 name: "myapex.key",
3566 public_key: "testkey.avbpubkey",
3567 private_key: "testkey.pem",
3568 }
3569
3570 cc_library {
3571 name: "mylib",
3572 srcs: ["mylib.cpp"],
3573 system_shared_libs: [],
3574 stl: "none",
3575 stubs: {
3576 versions: ["1", "2", "3"],
3577 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003578 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003579 }
3580
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003581 rust_ffi {
3582 name: "libmylib_rs",
3583 crate_name: "mylib_rs",
3584 srcs: ["mylib.rs"],
3585 stubs: {
3586 versions: ["1", "2", "3"],
3587 },
3588 apex_available: ["myapex"],
3589 }
3590
Jiyong Park16e91a02018-12-20 18:18:08 +09003591 cc_binary {
3592 name: "not_in_apex",
3593 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003594 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003595 static_executable: true,
3596 system_shared_libs: [],
3597 stl: "none",
3598 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003599 `)
3600
Colin Cross7113d202019-11-20 16:39:12 -08003601 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003602
3603 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003604 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003605 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003606}
Jiyong Park9335a262018-12-24 11:31:58 +09003607
3608func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003609 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003610 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003611 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003612 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003613 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003614 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003615 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003616 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003617 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003618 }
3619
3620 cc_library {
3621 name: "mylib",
3622 srcs: ["mylib.cpp"],
3623 system_shared_libs: [],
3624 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003625 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003626 }
3627
3628 apex_key {
3629 name: "myapex.key",
3630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003634 android_app_certificate {
3635 name: "myapex.certificate",
3636 certificate: "testkey",
3637 }
3638
3639 android_app_certificate {
3640 name: "myapex.certificate.override",
3641 certificate: "testkey.override",
3642 }
3643
Jiyong Park9335a262018-12-24 11:31:58 +09003644 `)
3645
3646 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003647 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003648
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003649 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3650 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003651 "vendor/foo/devkeys/testkey.avbpubkey")
3652 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003653 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3654 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003655 "vendor/foo/devkeys/testkey.pem")
3656 }
3657
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003658 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003659 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003660 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003661 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003662 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003663 }
3664}
Jiyong Park58e364a2019-01-19 19:24:06 +09003665
Jooyung Hanf121a652019-12-17 14:30:11 +09003666func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003667 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003668 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003669 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003670 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003671 apex {
3672 name: "myapex",
3673 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003674 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003675 }
3676 apex_key {
3677 name: "myapex.key",
3678 public_key: "testkey.avbpubkey",
3679 private_key: "testkey.pem",
3680 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003681 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003682 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3683 if actual := rule.Args["certificates"]; actual != expected {
3684 t.Errorf("certificates should be %q, not %q", expected, actual)
3685 }
3686 })
3687 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003688 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003689 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003690 apex {
3691 name: "myapex_keytest",
3692 key: "myapex.key",
3693 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003694 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003695 }
3696 apex_key {
3697 name: "myapex.key",
3698 public_key: "testkey.avbpubkey",
3699 private_key: "testkey.pem",
3700 }
3701 android_app_certificate {
3702 name: "myapex.certificate.override",
3703 certificate: "testkey.override",
3704 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003705 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003706 expected := "testkey.override.x509.pem testkey.override.pk8"
3707 if actual := rule.Args["certificates"]; actual != expected {
3708 t.Errorf("certificates should be %q, not %q", expected, actual)
3709 }
3710 })
3711 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003712 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003713 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003714 apex {
3715 name: "myapex",
3716 key: "myapex.key",
3717 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003718 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003719 }
3720 apex_key {
3721 name: "myapex.key",
3722 public_key: "testkey.avbpubkey",
3723 private_key: "testkey.pem",
3724 }
3725 android_app_certificate {
3726 name: "myapex.certificate",
3727 certificate: "testkey",
3728 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003729 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003730 expected := "testkey.x509.pem testkey.pk8"
3731 if actual := rule.Args["certificates"]; actual != expected {
3732 t.Errorf("certificates should be %q, not %q", expected, actual)
3733 }
3734 })
3735 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003736 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003737 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003738 apex {
3739 name: "myapex_keytest",
3740 key: "myapex.key",
3741 file_contexts: ":myapex-file_contexts",
3742 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003743 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003744 }
3745 apex_key {
3746 name: "myapex.key",
3747 public_key: "testkey.avbpubkey",
3748 private_key: "testkey.pem",
3749 }
3750 android_app_certificate {
3751 name: "myapex.certificate.override",
3752 certificate: "testkey.override",
3753 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003754 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003755 expected := "testkey.override.x509.pem testkey.override.pk8"
3756 if actual := rule.Args["certificates"]; actual != expected {
3757 t.Errorf("certificates should be %q, not %q", expected, actual)
3758 }
3759 })
3760 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003761 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003762 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003763 apex {
3764 name: "myapex",
3765 key: "myapex.key",
3766 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003767 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003768 }
3769 apex_key {
3770 name: "myapex.key",
3771 public_key: "testkey.avbpubkey",
3772 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003773 }`,
3774 android.MockFS{
3775 "vendor/foo/devkeys/testkey.x509.pem": nil,
3776 }.AddToFixture(),
3777 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003778 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003779 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3780 if actual := rule.Args["certificates"]; actual != expected {
3781 t.Errorf("certificates should be %q, not %q", expected, actual)
3782 }
3783 })
3784 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003785 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003786 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003787 apex {
3788 name: "myapex_keytest",
3789 key: "myapex.key",
3790 file_contexts: ":myapex-file_contexts",
3791 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003792 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003793 }
3794 apex_key {
3795 name: "myapex.key",
3796 public_key: "testkey.avbpubkey",
3797 private_key: "testkey.pem",
3798 }
3799 android_app_certificate {
3800 name: "myapex.certificate.override",
3801 certificate: "testkey.override",
3802 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003803 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003804 expected := "testkey.override.x509.pem testkey.override.pk8"
3805 if actual := rule.Args["certificates"]; actual != expected {
3806 t.Errorf("certificates should be %q, not %q", expected, actual)
3807 }
3808 })
3809}
3810
Jiyong Park58e364a2019-01-19 19:24:06 +09003811func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003812 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003813 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003814 apex {
3815 name: "myapex",
3816 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003817 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003818 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003819 }
3820
3821 apex {
3822 name: "otherapex",
3823 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003824 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003825 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003826 }
3827
3828 apex_key {
3829 name: "myapex.key",
3830 public_key: "testkey.avbpubkey",
3831 private_key: "testkey.pem",
3832 }
3833
3834 cc_library {
3835 name: "mylib",
3836 srcs: ["mylib.cpp"],
3837 system_shared_libs: [],
3838 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003839 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003840 "myapex",
3841 "otherapex",
3842 ],
Jooyung Han24282772020-03-21 23:20:55 +09003843 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003844 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003845 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003846 cc_library {
3847 name: "mylib2",
3848 srcs: ["mylib.cpp"],
3849 system_shared_libs: [],
3850 stl: "none",
3851 apex_available: [
3852 "myapex",
3853 "otherapex",
3854 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003855 static_libs: ["mylib3"],
3856 recovery_available: true,
3857 min_sdk_version: "29",
3858 }
3859 cc_library {
3860 name: "mylib3",
3861 srcs: ["mylib.cpp"],
3862 system_shared_libs: [],
3863 stl: "none",
3864 apex_available: [
3865 "myapex",
3866 "otherapex",
3867 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003868 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003869 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003870 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003871 `)
3872
Jooyung Hanc87a0592020-03-02 17:44:33 +09003873 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003874 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003875 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003876
Vinh Tranf9754732023-01-19 22:41:46 -05003877 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003878 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003879 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003880
Vinh Tranf9754732023-01-19 22:41:46 -05003881 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003882 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003883 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003884
Colin Crossaede88c2020-08-11 12:17:01 -07003885 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3886 // each variant defines additional macros to distinguish which apex variant it is built for
3887
3888 // non-APEX variant does not have __ANDROID_APEX__ defined
3889 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3890 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3891
Vinh Tranf9754732023-01-19 22:41:46 -05003892 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003893 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3894 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003895
Jooyung Hanc87a0592020-03-02 17:44:33 +09003896 // non-APEX variant does not have __ANDROID_APEX__ defined
3897 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3898 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3899
Vinh Tranf9754732023-01-19 22:41:46 -05003900 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003901 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003902 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003903}
Jiyong Park7e636d02019-01-28 16:16:54 +09003904
3905func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003906 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003907 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003908 apex {
3909 name: "myapex",
3910 key: "myapex.key",
3911 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003912 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003913 }
3914
3915 apex_key {
3916 name: "myapex.key",
3917 public_key: "testkey.avbpubkey",
3918 private_key: "testkey.pem",
3919 }
3920
3921 cc_library_headers {
3922 name: "mylib_headers",
3923 export_include_dirs: ["my_include"],
3924 system_shared_libs: [],
3925 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003926 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003927 }
3928
3929 cc_library {
3930 name: "mylib",
3931 srcs: ["mylib.cpp"],
3932 system_shared_libs: [],
3933 stl: "none",
3934 header_libs: ["mylib_headers"],
3935 export_header_lib_headers: ["mylib_headers"],
3936 stubs: {
3937 versions: ["1", "2", "3"],
3938 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003939 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003940 }
3941
3942 cc_library {
3943 name: "otherlib",
3944 srcs: ["mylib.cpp"],
3945 system_shared_libs: [],
3946 stl: "none",
3947 shared_libs: ["mylib"],
3948 }
3949 `)
3950
Colin Cross7113d202019-11-20 16:39:12 -08003951 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003952
3953 // Ensure that the include path of the header lib is exported to 'otherlib'
3954 ensureContains(t, cFlags, "-Imy_include")
3955}
Alex Light9670d332019-01-29 18:07:33 -08003956
Jiyong Park7cd10e32020-01-14 09:22:18 +09003957type fileInApex struct {
3958 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003959 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003960 isLink bool
3961}
3962
Jooyung Han1724d582022-12-21 10:17:44 +09003963func (f fileInApex) String() string {
3964 return f.src + ":" + f.path
3965}
3966
3967func (f fileInApex) match(expectation string) bool {
3968 parts := strings.Split(expectation, ":")
3969 if len(parts) == 1 {
3970 match, _ := path.Match(parts[0], f.path)
3971 return match
3972 }
3973 if len(parts) == 2 {
3974 matchSrc, _ := path.Match(parts[0], f.src)
3975 matchDst, _ := path.Match(parts[1], f.path)
3976 return matchSrc && matchDst
3977 }
3978 panic("invalid expected file specification: " + expectation)
3979}
3980
Jooyung Hana57af4a2020-01-23 05:36:59 +00003981func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003982 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003983 module := ctx.ModuleForTests(moduleName, variant)
3984 apexRule := module.MaybeRule("apexRule")
3985 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003986 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003987 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003988 for _, cmd := range strings.Split(copyCmds, "&&") {
3989 cmd = strings.TrimSpace(cmd)
3990 if cmd == "" {
3991 continue
3992 }
3993 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003994 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003995 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003996 switch terms[0] {
3997 case "mkdir":
3998 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003999 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004000 t.Fatal("copyCmds contains invalid cp command", cmd)
4001 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004002 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004003 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004004 isLink = false
4005 case "ln":
4006 if len(terms) != 3 && len(terms) != 4 {
4007 // ln LINK TARGET or ln -s LINK TARGET
4008 t.Fatal("copyCmds contains invalid ln command", cmd)
4009 }
4010 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004011 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004012 isLink = true
4013 default:
4014 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4015 }
4016 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004017 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004018 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004019 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004020 }
Jooyung Han1724d582022-12-21 10:17:44 +09004021 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004022 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004023 }
4024 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004025 return ret
4026}
4027
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004028func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004029 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004030 var failed bool
4031 var surplus []string
4032 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004033 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004034 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004035 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004036 if file.match(expected) {
4037 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004038 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004039 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004040 }
4041 }
Jooyung Han1724d582022-12-21 10:17:44 +09004042 if !matchFound {
4043 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004044 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004045 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004046
Jooyung Han31c470b2019-10-18 16:26:59 +09004047 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004048 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004049 t.Log("surplus files", surplus)
4050 failed = true
4051 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004052
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004053 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004054 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004055 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004056 if !filesMatched[expected] {
4057 missing = append(missing, expected)
4058 }
4059 }
4060 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 t.Log("missing files", missing)
4062 failed = true
4063 }
4064 if failed {
4065 t.Fail()
4066 }
4067}
4068
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004069func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4070 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4071}
4072
4073func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004074 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004075 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4076 if deapexer.Output != nil {
4077 outputs = append(outputs, deapexer.Output.String())
4078 }
4079 for _, output := range deapexer.ImplicitOutputs {
4080 outputs = append(outputs, output.String())
4081 }
4082 actualFiles := make([]fileInApex, 0, len(outputs))
4083 for _, output := range outputs {
4084 dir := "/deapexer/"
4085 pos := strings.LastIndex(output, dir)
4086 if pos == -1 {
4087 t.Fatal("Unknown deapexer output ", output)
4088 }
4089 path := output[pos+len(dir):]
4090 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4091 }
4092 assertFileListEquals(t, files, actualFiles)
4093}
4094
Jooyung Han39edb6c2019-11-06 16:53:07 +09004095func vndkLibrariesTxtFiles(vers ...string) (result string) {
4096 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004097 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004098 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004099 prebuilt_etc {
4100 name: "` + txt + `.libraries.` + v + `.txt",
4101 src: "dummy.txt",
4102 }
4103 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004104 }
4105 }
4106 return
4107}
4108
Jooyung Han344d5432019-08-23 11:17:39 +09004109func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004110 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004111 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004112 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004113 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004114 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004115 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004116 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004117 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004118 }
4119
4120 apex_key {
4121 name: "myapex.key",
4122 public_key: "testkey.avbpubkey",
4123 private_key: "testkey.pem",
4124 }
4125
Jooyung Han31c470b2019-10-18 16:26:59 +09004126 vndk_prebuilt_shared {
4127 name: "libvndk27",
4128 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004129 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004130 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004131 vndk: {
4132 enabled: true,
4133 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004134 target_arch: "arm64",
4135 arch: {
4136 arm: {
4137 srcs: ["libvndk27_arm.so"],
4138 },
4139 arm64: {
4140 srcs: ["libvndk27_arm64.so"],
4141 },
4142 },
Colin Cross2807f002021-03-02 10:15:29 -08004143 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004144 }
4145
4146 vndk_prebuilt_shared {
4147 name: "libvndk27",
4148 version: "27",
4149 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004150 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004151 vndk: {
4152 enabled: true,
4153 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004154 target_arch: "x86_64",
4155 arch: {
4156 x86: {
4157 srcs: ["libvndk27_x86.so"],
4158 },
4159 x86_64: {
4160 srcs: ["libvndk27_x86_64.so"],
4161 },
4162 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004163 }
4164 `+vndkLibrariesTxtFiles("27"),
4165 withFiles(map[string][]byte{
4166 "libvndk27_arm.so": nil,
4167 "libvndk27_arm64.so": nil,
4168 "libvndk27_x86.so": nil,
4169 "libvndk27_x86_64.so": nil,
4170 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004171
Jooyung Hana0503a52023-08-23 13:12:50 +09004172 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004173 "lib/libvndk27_arm.so",
4174 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004175 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004176 })
Jooyung Han344d5432019-08-23 11:17:39 +09004177}
4178
Jooyung Han90eee022019-10-01 20:02:42 +09004179func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004181 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004182 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004183 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004184 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004185 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004186 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004187 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004188 }
4189 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004190 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004191 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004192 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004193 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004194 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004195 }
4196 apex_key {
4197 name: "myapex.key",
4198 public_key: "testkey.avbpubkey",
4199 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004200 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004201
4202 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004203 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004204 apexManifestRule := module.Rule("apexManifestRule")
4205 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004206 }
4207
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004208 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004209 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004210}
4211
Jooyung Han344d5432019-08-23 11:17:39 +09004212func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004213 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004214 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004215 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004216 name: "com.android.vndk.v30",
4217 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004218 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004219 native_bridge_supported: true,
4220 }
4221
4222 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004223 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004224 public_key: "testkey.avbpubkey",
4225 private_key: "testkey.pem",
4226 }
4227
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004228 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004229 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004230 version: "30",
4231 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004232 srcs: ["mylib.cpp"],
4233 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004234 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004235 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004236 vndk: {
4237 enabled: true,
4238 },
Jooyung Han344d5432019-08-23 11:17:39 +09004239 }
4240 `)
4241}
4242
Jooyung Han31c470b2019-10-18 16:26:59 +09004243func TestVndkApexWithBinder32(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 Han31c470b2019-10-18 16:26:59 +09004246 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004247 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004248 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004249 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004250 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004251 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004252 }
4253
4254 apex_key {
4255 name: "myapex.key",
4256 public_key: "testkey.avbpubkey",
4257 private_key: "testkey.pem",
4258 }
4259
4260 vndk_prebuilt_shared {
4261 name: "libvndk27",
4262 version: "27",
4263 target_arch: "arm",
4264 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004265 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004266 vndk: {
4267 enabled: true,
4268 },
4269 arch: {
4270 arm: {
4271 srcs: ["libvndk27.so"],
4272 }
4273 },
4274 }
4275
4276 vndk_prebuilt_shared {
4277 name: "libvndk27",
4278 version: "27",
4279 target_arch: "arm",
4280 binder32bit: true,
4281 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004282 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004283 vndk: {
4284 enabled: true,
4285 },
4286 arch: {
4287 arm: {
4288 srcs: ["libvndk27binder32.so"],
4289 }
4290 },
Colin Cross2807f002021-03-02 10:15:29 -08004291 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004292 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004293 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004294 withFiles(map[string][]byte{
4295 "libvndk27.so": nil,
4296 "libvndk27binder32.so": nil,
4297 }),
4298 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004299 android.FixtureModifyConfig(func(config android.Config) {
4300 target := android.Target{
4301 Os: android.Android,
4302 Arch: android.Arch{
4303 ArchType: android.Arm,
4304 ArchVariant: "armv7-a-neon",
4305 Abi: []string{"armeabi-v7a"},
4306 },
4307 NativeBridge: android.NativeBridgeDisabled,
4308 NativeBridgeHostArchName: "",
4309 NativeBridgeRelativePath: "",
4310 }
4311 config.Targets[android.Android] = []android.Target{target}
4312 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004313 }),
4314 )
4315
Jooyung Hana0503a52023-08-23 13:12:50 +09004316 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004317 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004318 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004319 })
4320}
4321
Jooyung Hane1633032019-08-01 17:41:43 +09004322func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004323 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004324 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004325 apex {
4326 name: "myapex_nodep",
4327 key: "myapex.key",
4328 native_shared_libs: ["lib_nodep"],
4329 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004330 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004331 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004332 }
4333
4334 apex {
4335 name: "myapex_dep",
4336 key: "myapex.key",
4337 native_shared_libs: ["lib_dep"],
4338 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004339 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004340 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004341 }
4342
4343 apex {
4344 name: "myapex_provider",
4345 key: "myapex.key",
4346 native_shared_libs: ["libfoo"],
4347 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004348 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004349 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004350 }
4351
4352 apex {
4353 name: "myapex_selfcontained",
4354 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004355 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004356 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004357 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004358 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004359 }
4360
4361 apex_key {
4362 name: "myapex.key",
4363 public_key: "testkey.avbpubkey",
4364 private_key: "testkey.pem",
4365 }
4366
4367 cc_library {
4368 name: "lib_nodep",
4369 srcs: ["mylib.cpp"],
4370 system_shared_libs: [],
4371 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004372 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004373 }
4374
4375 cc_library {
4376 name: "lib_dep",
4377 srcs: ["mylib.cpp"],
4378 shared_libs: ["libfoo"],
4379 system_shared_libs: [],
4380 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004381 apex_available: [
4382 "myapex_dep",
4383 "myapex_provider",
4384 "myapex_selfcontained",
4385 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004386 }
4387
4388 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004389 name: "lib_dep_on_bar",
4390 srcs: ["mylib.cpp"],
4391 shared_libs: ["libbar"],
4392 system_shared_libs: [],
4393 stl: "none",
4394 apex_available: [
4395 "myapex_selfcontained",
4396 ],
4397 }
4398
4399
4400 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004401 name: "libfoo",
4402 srcs: ["mytest.cpp"],
4403 stubs: {
4404 versions: ["1"],
4405 },
4406 system_shared_libs: [],
4407 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004408 apex_available: [
4409 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004410 ],
4411 }
4412
4413 cc_library {
4414 name: "libbar",
4415 srcs: ["mytest.cpp"],
4416 stubs: {
4417 versions: ["1"],
4418 },
4419 system_shared_libs: [],
4420 stl: "none",
4421 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004422 "myapex_selfcontained",
4423 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004424 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004425
Jooyung Hane1633032019-08-01 17:41:43 +09004426 `)
4427
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004428 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004429 var provideNativeLibs, requireNativeLibs []string
4430
Jooyung Hana0503a52023-08-23 13:12:50 +09004431 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004432 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4433 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004434 ensureListEmpty(t, provideNativeLibs)
4435 ensureListEmpty(t, requireNativeLibs)
4436
Jooyung Hana0503a52023-08-23 13:12:50 +09004437 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004438 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4439 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004440 ensureListEmpty(t, provideNativeLibs)
4441 ensureListContains(t, requireNativeLibs, "libfoo.so")
4442
Jooyung Hana0503a52023-08-23 13:12:50 +09004443 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004444 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4445 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004446 ensureListContains(t, provideNativeLibs, "libfoo.so")
4447 ensureListEmpty(t, requireNativeLibs)
4448
Jooyung Hana0503a52023-08-23 13:12:50 +09004449 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004450 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4451 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004452 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004453 ensureListEmpty(t, requireNativeLibs)
4454}
4455
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004456func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004457 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004458 ctx := testApex(t, `
4459 apex {
4460 name: "myapex",
4461 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004462 native_shared_libs: ["mylib"],
4463 updatable: false,
4464 }
4465
4466 apex_key {
4467 name: "myapex.key",
4468 public_key: "testkey.avbpubkey",
4469 private_key: "testkey.pem",
4470 }
4471
4472 cc_library {
4473 name: "mylib",
4474 srcs: ["mylib.cpp"],
4475 system_shared_libs: [],
4476 stl: "none",
4477 apex_available: [
4478 "//apex_available:platform",
4479 "myapex",
4480 ],
4481 }
4482 `, android.FixtureMergeEnv(map[string]string{
4483 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4484 }))
4485
Jooyung Hana0503a52023-08-23 13:12:50 +09004486 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004487 apexManifestRule := module.Rule("apexManifestRule")
4488 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4489}
4490
Vinh Tran8f5310f2022-10-07 18:16:47 -04004491func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004492 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004493 testCases := []struct {
4494 compileMultiLibProp string
4495 containedLibs []string
4496 notContainedLibs []string
4497 }{
4498 {
4499 containedLibs: []string{
4500 "image.apex/lib64/mylib.so",
4501 "image.apex/lib/mylib.so",
4502 },
4503 compileMultiLibProp: `compile_multilib: "both",`,
4504 },
4505 {
4506 containedLibs: []string{"image.apex/lib64/mylib.so"},
4507 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4508 compileMultiLibProp: `compile_multilib: "first",`,
4509 },
4510 {
4511 containedLibs: []string{"image.apex/lib64/mylib.so"},
4512 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4513 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4514 },
4515 {
4516 containedLibs: []string{"image.apex/lib64/mylib.so"},
4517 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4518 compileMultiLibProp: `compile_multilib: "64",`,
4519 },
4520 {
4521 containedLibs: []string{"image.apex/lib/mylib.so"},
4522 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4523 compileMultiLibProp: `compile_multilib: "32",`,
4524 },
4525 }
4526 for _, testCase := range testCases {
4527 ctx := testApex(t, fmt.Sprintf(`
4528 apex {
4529 name: "myapex",
4530 key: "myapex.key",
4531 %s
4532 native_shared_libs: ["mylib"],
4533 updatable: false,
4534 }
4535 apex_key {
4536 name: "myapex.key",
4537 public_key: "testkey.avbpubkey",
4538 private_key: "testkey.pem",
4539 }
4540 cc_library {
4541 name: "mylib",
4542 srcs: ["mylib.cpp"],
4543 apex_available: [
4544 "//apex_available:platform",
4545 "myapex",
4546 ],
4547 }
4548 `, testCase.compileMultiLibProp),
4549 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004550 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004551 apexRule := module.Rule("apexRule")
4552 copyCmds := apexRule.Args["copy_commands"]
4553 for _, containedLib := range testCase.containedLibs {
4554 ensureContains(t, copyCmds, containedLib)
4555 }
4556 for _, notContainedLib := range testCase.notContainedLibs {
4557 ensureNotContains(t, copyCmds, notContainedLib)
4558 }
4559 }
4560}
4561
Alex Light0851b882019-02-07 13:20:53 -08004562func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004563 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004564 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004565 apex {
4566 name: "myapex",
4567 key: "myapex.key",
4568 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004569 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004570 }
4571
4572 apex_key {
4573 name: "myapex.key",
4574 public_key: "testkey.avbpubkey",
4575 private_key: "testkey.pem",
4576 }
4577
4578 cc_library {
4579 name: "mylib_common",
4580 srcs: ["mylib.cpp"],
4581 system_shared_libs: [],
4582 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004583 apex_available: [
4584 "//apex_available:platform",
4585 "myapex",
4586 ],
Alex Light0851b882019-02-07 13:20:53 -08004587 }
4588 `)
4589
Jooyung Hana0503a52023-08-23 13:12:50 +09004590 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004591 apexRule := module.Rule("apexRule")
4592 copyCmds := apexRule.Args["copy_commands"]
4593
4594 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4595 t.Log("Apex was a test apex!")
4596 t.Fail()
4597 }
4598 // Ensure that main rule creates an output
4599 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4600
4601 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004602 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004603
4604 // Ensure that both direct and indirect deps are copied into apex
4605 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4606
Colin Cross7113d202019-11-20 16:39:12 -08004607 // Ensure that the platform variant ends with _shared
4608 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004609
Colin Cross56a83212020-09-15 18:30:11 -07004610 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004611 t.Log("Found mylib_common not in any apex!")
4612 t.Fail()
4613 }
4614}
4615
4616func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004617 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004618 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004619 apex_test {
4620 name: "myapex",
4621 key: "myapex.key",
4622 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004623 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004624 }
4625
4626 apex_key {
4627 name: "myapex.key",
4628 public_key: "testkey.avbpubkey",
4629 private_key: "testkey.pem",
4630 }
4631
4632 cc_library {
4633 name: "mylib_common_test",
4634 srcs: ["mylib.cpp"],
4635 system_shared_libs: [],
4636 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004637 // TODO: remove //apex_available:platform
4638 apex_available: [
4639 "//apex_available:platform",
4640 "myapex",
4641 ],
Alex Light0851b882019-02-07 13:20:53 -08004642 }
4643 `)
4644
Jooyung Hana0503a52023-08-23 13:12:50 +09004645 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004646 apexRule := module.Rule("apexRule")
4647 copyCmds := apexRule.Args["copy_commands"]
4648
4649 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4650 t.Log("Apex was not a test apex!")
4651 t.Fail()
4652 }
4653 // Ensure that main rule creates an output
4654 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4655
4656 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004657 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004658
4659 // Ensure that both direct and indirect deps are copied into apex
4660 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4661
Colin Cross7113d202019-11-20 16:39:12 -08004662 // Ensure that the platform variant ends with _shared
4663 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004664}
4665
Jooyung Han85707de2023-12-01 14:21:13 +09004666func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004667 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004668 ctx := testApex(t, `
4669 apex {
4670 name: "myapex",
4671 key: "myapex.key",
4672 updatable: false,
4673 binaries: ["mybin"],
4674 }
4675 apex {
4676 name: "myvendorapex",
4677 key: "myapex.key",
4678 file_contexts: "myvendorapex_file_contexts",
4679 vendor: true,
4680 updatable: false,
4681 binaries: ["mybin"],
4682 }
4683 apex_key {
4684 name: "myapex.key",
4685 public_key: "testkey.avbpubkey",
4686 private_key: "testkey.pem",
4687 }
4688 cc_binary {
4689 name: "mybin",
4690 vendor_available: true,
4691 system_shared_libs: [],
4692 stl: "none",
4693 shared_libs: ["libz"],
4694 apex_available: ["//apex_available:anyapex"],
4695 }
4696 cc_library {
4697 name: "libz",
4698 vendor_available: true,
4699 system_shared_libs: [],
4700 stl: "none",
4701 stubs: {
4702 versions: ["28", "30"],
4703 },
4704 target: {
4705 vendor: {
4706 no_stubs: true,
4707 },
4708 },
4709 }
4710 `, withFiles(map[string][]byte{
4711 "myvendorapex_file_contexts": nil,
4712 }))
4713
4714 // libz provides stubs for core variant.
4715 {
4716 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4717 "bin/mybin",
4718 })
4719 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4720 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4721 }
4722 // libz doesn't provide stubs for vendor variant.
4723 {
4724 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4725 "bin/mybin",
4726 "lib64/libz.so",
4727 })
4728 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4729 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4730 }
4731}
4732
Alex Light9670d332019-01-29 18:07:33 -08004733func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004734 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004735 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004736 apex {
4737 name: "myapex",
4738 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004739 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004740 multilib: {
4741 first: {
4742 native_shared_libs: ["mylib_common"],
4743 }
4744 },
4745 target: {
4746 android: {
4747 multilib: {
4748 first: {
4749 native_shared_libs: ["mylib"],
4750 }
4751 }
4752 },
4753 host: {
4754 multilib: {
4755 first: {
4756 native_shared_libs: ["mylib2"],
4757 }
4758 }
4759 }
4760 }
4761 }
4762
4763 apex_key {
4764 name: "myapex.key",
4765 public_key: "testkey.avbpubkey",
4766 private_key: "testkey.pem",
4767 }
4768
4769 cc_library {
4770 name: "mylib",
4771 srcs: ["mylib.cpp"],
4772 system_shared_libs: [],
4773 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004774 // TODO: remove //apex_available:platform
4775 apex_available: [
4776 "//apex_available:platform",
4777 "myapex",
4778 ],
Alex Light9670d332019-01-29 18:07:33 -08004779 }
4780
4781 cc_library {
4782 name: "mylib_common",
4783 srcs: ["mylib.cpp"],
4784 system_shared_libs: [],
4785 stl: "none",
4786 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004787 // TODO: remove //apex_available:platform
4788 apex_available: [
4789 "//apex_available:platform",
4790 "myapex",
4791 ],
Alex Light9670d332019-01-29 18:07:33 -08004792 }
4793
4794 cc_library {
4795 name: "mylib2",
4796 srcs: ["mylib.cpp"],
4797 system_shared_libs: [],
4798 stl: "none",
4799 compile_multilib: "first",
4800 }
4801 `)
4802
Jooyung Hana0503a52023-08-23 13:12:50 +09004803 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004804 copyCmds := apexRule.Args["copy_commands"]
4805
4806 // Ensure that main rule creates an output
4807 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4808
4809 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004810 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4811 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4812 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004813
4814 // Ensure that both direct and indirect deps are copied into apex
4815 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4816 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4817 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4818
Colin Cross7113d202019-11-20 16:39:12 -08004819 // Ensure that the platform variant ends with _shared
4820 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4821 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004823}
Jiyong Park04480cf2019-02-06 00:16:29 +09004824
Jiyong Park59140302020-12-14 18:44:04 +09004825func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004826 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004827 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004828 apex {
4829 name: "myapex",
4830 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004831 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004832 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004833 arch: {
4834 arm64: {
4835 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004836 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004837 },
4838 x86_64: {
4839 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004840 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004841 },
4842 }
4843 }
4844
4845 apex_key {
4846 name: "myapex.key",
4847 public_key: "testkey.avbpubkey",
4848 private_key: "testkey.pem",
4849 }
4850
4851 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004852 name: "mylib.generic",
4853 srcs: ["mylib.cpp"],
4854 system_shared_libs: [],
4855 stl: "none",
4856 // TODO: remove //apex_available:platform
4857 apex_available: [
4858 "//apex_available:platform",
4859 "myapex",
4860 ],
4861 }
4862
4863 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004864 name: "mylib.arm64",
4865 srcs: ["mylib.cpp"],
4866 system_shared_libs: [],
4867 stl: "none",
4868 // TODO: remove //apex_available:platform
4869 apex_available: [
4870 "//apex_available:platform",
4871 "myapex",
4872 ],
4873 }
4874
4875 cc_library {
4876 name: "mylib.x64",
4877 srcs: ["mylib.cpp"],
4878 system_shared_libs: [],
4879 stl: "none",
4880 // TODO: remove //apex_available:platform
4881 apex_available: [
4882 "//apex_available:platform",
4883 "myapex",
4884 ],
4885 }
4886 `)
4887
Jooyung Hana0503a52023-08-23 13:12:50 +09004888 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004889 copyCmds := apexRule.Args["copy_commands"]
4890
4891 // Ensure that apex variant is created for the direct dep
4892 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004893 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004894 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4895
4896 // Ensure that both direct and indirect deps are copied into apex
4897 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4898 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4899}
4900
Jiyong Park04480cf2019-02-06 00:16:29 +09004901func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004902 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004903 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004904 apex {
4905 name: "myapex",
4906 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004907 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004908 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004909 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004910 }
4911
4912 apex_key {
4913 name: "myapex.key",
4914 public_key: "testkey.avbpubkey",
4915 private_key: "testkey.pem",
4916 }
4917
4918 sh_binary {
4919 name: "myscript",
4920 src: "mylib.cpp",
4921 filename: "myscript.sh",
4922 sub_dir: "script",
4923 }
4924 `)
4925
Jooyung Hana0503a52023-08-23 13:12:50 +09004926 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004927 copyCmds := apexRule.Args["copy_commands"]
4928
4929 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4930}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004931
Jooyung Han91df2082019-11-20 01:49:42 +09004932func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004933 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004934 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004935 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004936 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004937 {"", "system"},
4938 {"product_specific: true", "product"},
4939 {"soc_specific: true", "vendor"},
4940 {"proprietary: true", "vendor"},
4941 {"vendor: true", "vendor"},
4942 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004943 }
4944 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004945 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004947 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004948 apex {
4949 name: "myapex",
4950 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004951 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004952 `+tc.propName+`
4953 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004954
Jooyung Han91df2082019-11-20 01:49:42 +09004955 apex_key {
4956 name: "myapex.key",
4957 public_key: "testkey.avbpubkey",
4958 private_key: "testkey.pem",
4959 }
4960 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004961
Jooyung Hana0503a52023-08-23 13:12:50 +09004962 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08004963 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004964 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004965 if actual != expected {
4966 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4967 }
Jooyung Han91df2082019-11-20 01:49:42 +09004968 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004969 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004970}
Jiyong Park67882562019-03-21 01:11:21 +09004971
Jooyung Han580eb4f2020-06-24 19:33:06 +09004972func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004973 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004974 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004975 apex {
4976 name: "myapex",
4977 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004978 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004979 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004980
Jooyung Han580eb4f2020-06-24 19:33:06 +09004981 apex_key {
4982 name: "myapex.key",
4983 public_key: "testkey.avbpubkey",
4984 private_key: "testkey.pem",
4985 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004986 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004987 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004988 rule := module.Output("file_contexts")
4989 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4990}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004991
Jooyung Han580eb4f2020-06-24 19:33:06 +09004992func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004993 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004994 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004995 apex {
4996 name: "myapex",
4997 key: "myapex.key",
4998 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004999 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005000 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005001
Jooyung Han580eb4f2020-06-24 19:33:06 +09005002 apex_key {
5003 name: "myapex.key",
5004 public_key: "testkey.avbpubkey",
5005 private_key: "testkey.pem",
5006 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005007 `, withFiles(map[string][]byte{
5008 "my_own_file_contexts": nil,
5009 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005010}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005011
Jooyung Han580eb4f2020-06-24 19:33:06 +09005012func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005013 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005014 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005015 apex {
5016 name: "myapex",
5017 key: "myapex.key",
5018 product_specific: true,
5019 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005020 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005021 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005022
Jooyung Han580eb4f2020-06-24 19:33:06 +09005023 apex_key {
5024 name: "myapex.key",
5025 public_key: "testkey.avbpubkey",
5026 private_key: "testkey.pem",
5027 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005028 `)
5029
Colin Cross1c460562021-02-16 17:55:47 -08005030 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005031 apex {
5032 name: "myapex",
5033 key: "myapex.key",
5034 product_specific: true,
5035 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005036 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005037 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005038
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex_key {
5040 name: "myapex.key",
5041 public_key: "testkey.avbpubkey",
5042 private_key: "testkey.pem",
5043 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044 `, withFiles(map[string][]byte{
5045 "product_specific_file_contexts": nil,
5046 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005047 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005048 rule := module.Output("file_contexts")
5049 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5050}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005051
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005053 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005054 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005055 apex {
5056 name: "myapex",
5057 key: "myapex.key",
5058 product_specific: true,
5059 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005060 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005061 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005062
Jooyung Han580eb4f2020-06-24 19:33:06 +09005063 apex_key {
5064 name: "myapex.key",
5065 public_key: "testkey.avbpubkey",
5066 private_key: "testkey.pem",
5067 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005068
Jooyung Han580eb4f2020-06-24 19:33:06 +09005069 filegroup {
5070 name: "my-file-contexts",
5071 srcs: ["product_specific_file_contexts"],
5072 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005073 `, withFiles(map[string][]byte{
5074 "product_specific_file_contexts": nil,
5075 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005076 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005077 rule := module.Output("file_contexts")
5078 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005079}
5080
Jiyong Park67882562019-03-21 01:11:21 +09005081func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005082 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005083 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005084 apex_key {
5085 name: "myapex.key",
5086 public_key: ":my.avbpubkey",
5087 private_key: ":my.pem",
5088 product_specific: true,
5089 }
5090
5091 filegroup {
5092 name: "my.avbpubkey",
5093 srcs: ["testkey2.avbpubkey"],
5094 }
5095
5096 filegroup {
5097 name: "my.pem",
5098 srcs: ["testkey2.pem"],
5099 }
5100 `)
5101
5102 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5103 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005104 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005105 if actual_pubkey != expected_pubkey {
5106 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5107 }
5108 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005109 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005110 if actual_privkey != expected_privkey {
5111 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5112 }
5113}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005114
5115func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005116 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005117 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005118 prebuilt_apex {
5119 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005120 arch: {
5121 arm64: {
5122 src: "myapex-arm64.apex",
5123 },
5124 arm: {
5125 src: "myapex-arm.apex",
5126 },
5127 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005128 }
5129 `)
5130
Wei Li340ee8e2022-03-18 17:33:24 -07005131 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5132 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005133
Jiyong Parkc95714e2019-03-29 14:23:10 +09005134 expectedInput := "myapex-arm64.apex"
5135 if prebuilt.inputApex.String() != expectedInput {
5136 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5137 }
Wei Li340ee8e2022-03-18 17:33:24 -07005138 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5139 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5140 rule := testingModule.Rule("genProvenanceMetaData")
5141 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5142 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5143 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5144 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005145
5146 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5147 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005148}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005149
Paul Duffinc0609c62021-03-01 17:27:16 +00005150func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005151 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005152 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005153 prebuilt_apex {
5154 name: "myapex",
5155 }
5156 `)
5157}
5158
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005159func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005160 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005161 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005162 prebuilt_apex {
5163 name: "myapex",
5164 src: "myapex-arm.apex",
5165 filename: "notmyapex.apex",
5166 }
5167 `)
5168
Wei Li340ee8e2022-03-18 17:33:24 -07005169 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5170 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005171
5172 expected := "notmyapex.apex"
5173 if p.installFilename != expected {
5174 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5175 }
Wei Li340ee8e2022-03-18 17:33:24 -07005176 rule := testingModule.Rule("genProvenanceMetaData")
5177 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5178 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5179 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5180 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005181}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005182
Samiul Islam7c02e262021-09-08 17:48:28 +01005183func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005184 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005185 testApex(t, `
5186 apex_set {
5187 name: "com.company.android.myapex",
5188 apex_name: "com.android.myapex",
5189 set: "company-myapex.apks",
5190 filename: "com.company.android.myapex.apex"
5191 }
5192 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5193
5194 testApex(t, `
5195 apex_set {
5196 name: "com.company.android.myapex",
5197 apex_name: "com.android.myapex",
5198 set: "company-myapex.apks",
5199 filename: "com.company.android.myapex.capex"
5200 }
5201 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5202
5203 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5204 apex_set {
5205 name: "com.company.android.myapex",
5206 apex_name: "com.android.myapex",
5207 set: "company-myapex.apks",
5208 filename: "some-random-suffix"
5209 }
5210 `)
5211}
5212
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005213func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005214 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005215 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005216 prebuilt_apex {
5217 name: "myapex.prebuilt",
5218 src: "myapex-arm.apex",
5219 overrides: [
5220 "myapex",
5221 ],
5222 }
5223 `)
5224
Wei Li340ee8e2022-03-18 17:33:24 -07005225 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5226 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005227
5228 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005229 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005230 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005231 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005232 }
Wei Li340ee8e2022-03-18 17:33:24 -07005233 rule := testingModule.Rule("genProvenanceMetaData")
5234 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5235 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5236 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5237 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005238}
5239
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005240func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005241 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005242 testApex(t, `
5243 prebuilt_apex {
5244 name: "com.company.android.myapex",
5245 apex_name: "com.android.myapex",
5246 src: "company-myapex-arm.apex",
5247 }
5248 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5249
5250 testApex(t, `
5251 apex_set {
5252 name: "com.company.android.myapex",
5253 apex_name: "com.android.myapex",
5254 set: "company-myapex.apks",
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257}
5258
5259func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005260 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005261 _ = android.GroupFixturePreparers(
5262 java.PrepareForTestWithJavaDefaultModules,
5263 PrepareForTestWithApexBuildComponents,
5264 android.FixtureWithRootAndroidBp(`
5265 platform_bootclasspath {
5266 name: "platform-bootclasspath",
5267 fragments: [
5268 {
5269 apex: "com.android.art",
5270 module: "art-bootclasspath-fragment",
5271 },
5272 ],
5273 }
5274
5275 prebuilt_apex {
5276 name: "com.company.android.art",
5277 apex_name: "com.android.art",
5278 src: "com.company.android.art-arm.apex",
5279 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5280 }
5281
5282 prebuilt_bootclasspath_fragment {
5283 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005284 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005285 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005286 hidden_api: {
5287 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5288 metadata: "my-bootclasspath-fragment/metadata.csv",
5289 index: "my-bootclasspath-fragment/index.csv",
5290 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5291 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5292 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005293 }
5294
5295 java_import {
5296 name: "core-oj",
5297 jars: ["prebuilt.jar"],
5298 }
5299 `),
5300 ).RunTest(t)
5301}
5302
Spandan Das59a4a2b2024-01-09 21:35:56 +00005303// A minimal context object for use with DexJarBuildPath
5304type moduleErrorfTestCtx struct {
5305}
5306
5307func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5308}
5309
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005310func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005311 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005312 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005313 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005314 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5315 // is disabled.
5316 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005317
5318 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5319 // file creation.
5320 java.FixtureConfigureBootJars("platform:foo"),
5321 android.FixtureModifyMockFS(func(fs android.MockFS) {
5322 fs["platform/Android.bp"] = []byte(`
5323 java_library {
5324 name: "foo",
5325 srcs: ["Test.java"],
5326 compile_dex: true,
5327 }
5328 `)
5329 fs["platform/Test.java"] = nil
5330 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005331 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005332
Paul Duffin40a3f652021-07-19 13:11:24 +01005333 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005334 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005335 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005336 var rule android.TestingBuildParams
5337
5338 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5339 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005340 }
5341
Paul Duffin40a3f652021-07-19 13:11:24 +01005342 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5343 t.Helper()
5344 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5345 var rule android.TestingBuildParams
5346
5347 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5348 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5349 }
5350
Paul Duffin89f570a2021-06-16 01:42:33 +01005351 fragment := java.ApexVariantReference{
5352 Apex: proptools.StringPtr("myapex"),
5353 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5354 }
5355
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005356 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005357 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005358 bp := `
5359 prebuilt_apex {
5360 name: "myapex",
5361 arch: {
5362 arm64: {
5363 src: "myapex-arm64.apex",
5364 },
5365 arm: {
5366 src: "myapex-arm.apex",
5367 },
5368 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5370 }
5371
5372 prebuilt_bootclasspath_fragment {
5373 name: "my-bootclasspath-fragment",
5374 contents: ["libfoo", "libbar"],
5375 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005376 hidden_api: {
5377 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5378 metadata: "my-bootclasspath-fragment/metadata.csv",
5379 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005380 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5381 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5382 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005383 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005384 }
5385
Spandan Das52c01a12024-09-20 01:09:48 +00005386 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005387 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005388 public: {
5389 jars: ["libfoo.jar"],
5390 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005391 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005392 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005393 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005394 }
Paul Duffin37856732021-02-26 14:24:15 +00005395
5396 java_sdk_library_import {
5397 name: "libbar",
5398 public: {
5399 jars: ["libbar.jar"],
5400 },
5401 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005402 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005403 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005404 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005405 `
5406
Paul Duffin89f570a2021-06-16 01:42:33 +01005407 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005408
Paul Duffin537ea3d2021-05-14 10:38:00 +01005409 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005410 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005411 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005412 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005413 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005414 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 +01005415 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005416 })
5417
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005418 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005419 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005420 bp := `
5421 apex_set {
5422 name: "myapex",
5423 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005424 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005425 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5426 }
5427
Paul Duffin89f570a2021-06-16 01:42:33 +01005428 prebuilt_bootclasspath_fragment {
5429 name: "my-bootclasspath-fragment",
5430 contents: ["libfoo", "libbar"],
5431 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005432 hidden_api: {
5433 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5434 metadata: "my-bootclasspath-fragment/metadata.csv",
5435 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005436 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5437 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5438 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005439 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005440 }
5441
Liz Kammer2dc72442023-04-20 10:10:48 -04005442 prebuilt_systemserverclasspath_fragment {
5443 name: "my-systemserverclasspath-fragment",
5444 contents: ["libbaz"],
5445 apex_available: ["myapex"],
5446 }
5447
Spandan Das52c01a12024-09-20 01:09:48 +00005448 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005449 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005450 public: {
5451 jars: ["libfoo.jar"],
5452 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005453 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005454 shared_library: false,
5455 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005456 }
5457
Spandan Das52c01a12024-09-20 01:09:48 +00005458
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005459 java_sdk_library_import {
5460 name: "libbar",
5461 public: {
5462 jars: ["libbar.jar"],
5463 },
5464 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005465 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005466 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005467 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005468
5469 java_sdk_library_import {
5470 name: "libbaz",
5471 public: {
5472 jars: ["libbaz.jar"],
5473 },
5474 apex_available: ["myapex"],
5475 shared_library: false,
5476 permitted_packages: ["baz"],
5477 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005478 `
5479
Paul Duffin89f570a2021-06-16 01:42:33 +01005480 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005481
Paul Duffin537ea3d2021-05-14 10:38:00 +01005482 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005483 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005484 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005485 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005486 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005487 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 +01005488 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005489
5490 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5491
5492 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005493 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005494 "myjavalib.myapex",
5495 "libfoo.myapex",
5496 "libbar.myapex",
5497 "libbaz.myapex",
5498 }
5499 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5500 for i, e := range mkEntries {
5501 g := e.OverrideName
5502 if w := overrideNames[i]; w != g {
5503 t.Errorf("Expected override name %q, got %q", w, g)
5504 }
5505 }
5506
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005507 })
5508
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005509 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005510 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005511 bp := `
5512 prebuilt_apex {
5513 name: "myapex",
5514 arch: {
5515 arm64: {
5516 src: "myapex-arm64.apex",
5517 },
5518 arm: {
5519 src: "myapex-arm.apex",
5520 },
5521 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005522 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5523 }
5524
5525 prebuilt_bootclasspath_fragment {
5526 name: "my-bootclasspath-fragment",
5527 contents: ["libfoo", "libbar"],
5528 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005529 hidden_api: {
5530 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5531 metadata: "my-bootclasspath-fragment/metadata.csv",
5532 index: "my-bootclasspath-fragment/index.csv",
5533 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5534 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5535 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005536 }
5537
5538 java_import {
5539 name: "libfoo",
5540 jars: ["libfoo.jar"],
5541 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005542 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005543 }
5544
5545 java_library {
5546 name: "libfoo",
5547 srcs: ["foo/bar/MyClass.java"],
5548 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005549 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005550 }
Paul Duffin37856732021-02-26 14:24:15 +00005551
5552 java_sdk_library_import {
5553 name: "libbar",
5554 public: {
5555 jars: ["libbar.jar"],
5556 },
5557 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005558 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005559 }
5560
5561 java_sdk_library {
5562 name: "libbar",
5563 srcs: ["foo/bar/MyClass.java"],
5564 unsafe_ignore_missing_latest_api: true,
5565 apex_available: ["myapex"],
5566 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005567 `
5568
5569 // In this test the source (java_library) libfoo is active since the
5570 // prebuilt (java_import) defaults to prefer:false. However the
5571 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5572 // find the dex boot jar in it. We either need to disable the source libfoo
5573 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005574 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005575 // dexbootjar check is skipped if AllowMissingDependencies is true
5576 preparerAllowMissingDeps := android.GroupFixturePreparers(
5577 preparer,
5578 android.PrepareForTestWithAllowMissingDependencies,
5579 )
5580 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 })
5582
5583 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005584 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005585 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005586 apex {
5587 name: "myapex",
5588 key: "myapex.key",
5589 updatable: false,
5590 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5591 }
5592
5593 apex_key {
5594 name: "myapex.key",
5595 public_key: "testkey.avbpubkey",
5596 private_key: "testkey.pem",
5597 }
5598
5599 bootclasspath_fragment {
5600 name: "my-bootclasspath-fragment",
5601 contents: ["libfoo", "libbar"],
5602 apex_available: ["myapex"],
5603 hidden_api: {
5604 split_packages: ["*"],
5605 },
5606 }
5607
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005608 prebuilt_apex {
5609 name: "myapex",
5610 arch: {
5611 arm64: {
5612 src: "myapex-arm64.apex",
5613 },
5614 arm: {
5615 src: "myapex-arm.apex",
5616 },
5617 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005618 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5619 }
5620
5621 prebuilt_bootclasspath_fragment {
5622 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005623 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005624 contents: ["libfoo", "libbar"],
5625 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005626 hidden_api: {
5627 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5628 metadata: "my-bootclasspath-fragment/metadata.csv",
5629 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005630 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5631 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5632 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005633 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005634 }
5635
Spandan Das52c01a12024-09-20 01:09:48 +00005636 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005637 name: "libfoo",
5638 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005639 public: {
5640 jars: ["libfoo.jar"],
5641 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005642 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005643 shared_library: false,
5644 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 }
5646
5647 java_library {
5648 name: "libfoo",
5649 srcs: ["foo/bar/MyClass.java"],
5650 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005651 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005652 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005653 }
Paul Duffin37856732021-02-26 14:24:15 +00005654
5655 java_sdk_library_import {
5656 name: "libbar",
5657 prefer: true,
5658 public: {
5659 jars: ["libbar.jar"],
5660 },
5661 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005662 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005663 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005664 }
5665
5666 java_sdk_library {
5667 name: "libbar",
5668 srcs: ["foo/bar/MyClass.java"],
5669 unsafe_ignore_missing_latest_api: true,
5670 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005671 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005672 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005673 `
5674
Paul Duffin89f570a2021-06-16 01:42:33 +01005675 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005676
Paul Duffin537ea3d2021-05-14 10:38:00 +01005677 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005678 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005679 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005680 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005681 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005682 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 +01005683 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005684 })
5685
5686 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005687 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005688 bp := `
5689 apex {
5690 name: "myapex",
5691 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005692 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005693 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005694 }
5695
5696 apex_key {
5697 name: "myapex.key",
5698 public_key: "testkey.avbpubkey",
5699 private_key: "testkey.pem",
5700 }
5701
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005702 bootclasspath_fragment {
5703 name: "my-bootclasspath-fragment",
5704 contents: ["libfoo", "libbar"],
5705 apex_available: ["myapex"],
5706 hidden_api: {
5707 split_packages: ["*"],
5708 },
5709 }
5710
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005711 prebuilt_apex {
5712 name: "myapex",
5713 arch: {
5714 arm64: {
5715 src: "myapex-arm64.apex",
5716 },
5717 arm: {
5718 src: "myapex-arm.apex",
5719 },
5720 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005721 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5722 }
5723
5724 prebuilt_bootclasspath_fragment {
5725 name: "my-bootclasspath-fragment",
5726 contents: ["libfoo", "libbar"],
5727 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005728 hidden_api: {
5729 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5730 metadata: "my-bootclasspath-fragment/metadata.csv",
5731 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005732 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5733 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5734 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005735 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005736 }
5737
5738 java_import {
5739 name: "libfoo",
5740 jars: ["libfoo.jar"],
5741 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005742 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005743 }
5744
5745 java_library {
5746 name: "libfoo",
5747 srcs: ["foo/bar/MyClass.java"],
5748 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005749 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005750 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005751 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005752 }
Paul Duffin37856732021-02-26 14:24:15 +00005753
5754 java_sdk_library_import {
5755 name: "libbar",
5756 public: {
5757 jars: ["libbar.jar"],
5758 },
5759 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005760 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005761 }
5762
5763 java_sdk_library {
5764 name: "libbar",
5765 srcs: ["foo/bar/MyClass.java"],
5766 unsafe_ignore_missing_latest_api: true,
5767 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005768 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005769 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005770 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005771 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005772 `
5773
Paul Duffin89f570a2021-06-16 01:42:33 +01005774 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005775
Paul Duffin537ea3d2021-05-14 10:38:00 +01005776 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005777 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005778 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5779 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005780 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5781 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 +01005782 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005783 })
5784
5785 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005786 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005787 bp := `
5788 apex {
5789 name: "myapex",
5790 enabled: false,
5791 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005792 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005793 }
5794
5795 apex_key {
5796 name: "myapex.key",
5797 public_key: "testkey.avbpubkey",
5798 private_key: "testkey.pem",
5799 }
5800
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005801 bootclasspath_fragment {
5802 name: "my-bootclasspath-fragment",
5803 enabled: false,
5804 contents: ["libfoo", "libbar"],
5805 apex_available: ["myapex"],
5806 hidden_api: {
5807 split_packages: ["*"],
5808 },
5809 }
5810
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005811 prebuilt_apex {
5812 name: "myapex",
5813 arch: {
5814 arm64: {
5815 src: "myapex-arm64.apex",
5816 },
5817 arm: {
5818 src: "myapex-arm.apex",
5819 },
5820 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005821 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5822 }
5823
5824 prebuilt_bootclasspath_fragment {
5825 name: "my-bootclasspath-fragment",
5826 contents: ["libfoo", "libbar"],
5827 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005828 hidden_api: {
5829 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5830 metadata: "my-bootclasspath-fragment/metadata.csv",
5831 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005832 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5833 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5834 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005835 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005836 }
5837
5838 java_import {
5839 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005840 jars: ["libfoo.jar"],
5841 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005842 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005843 }
5844
5845 java_library {
5846 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005847 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005848 srcs: ["foo/bar/MyClass.java"],
5849 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005850 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 }
Paul Duffin37856732021-02-26 14:24:15 +00005852
5853 java_sdk_library_import {
5854 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005855 public: {
5856 jars: ["libbar.jar"],
5857 },
5858 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005859 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005860 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005861 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005862 }
5863
5864 java_sdk_library {
5865 name: "libbar",
5866 srcs: ["foo/bar/MyClass.java"],
5867 unsafe_ignore_missing_latest_api: true,
5868 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005869 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005870 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005871 `
Cole Fausta963b942024-04-11 17:43:00 -07005872 // This test disables libbar, which causes the ComponentDepsMutator to add
5873 // deps on libbar.stubs and other sub-modules that don't exist. We can
5874 // enable AllowMissingDependencies to work around that, but enabling that
5875 // causes extra checks for missing source files to dex_bootjars, so add those
5876 // to the mock fs as well.
5877 preparer2 := android.GroupFixturePreparers(
5878 preparer,
5879 android.PrepareForTestWithAllowMissingDependencies,
5880 android.FixtureMergeMockFs(map[string][]byte{
5881 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005882 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005883 }),
5884 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005885
Cole Fausta963b942024-04-11 17:43:00 -07005886 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005887
Paul Duffin537ea3d2021-05-14 10:38:00 +01005888 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005889 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005890 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005891 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005892 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005893 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 +01005894 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005895 })
Spandan Das3a392012024-01-17 18:26:27 +00005896
Spandan Dasf2c10572024-02-27 04:49:52 +00005897 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005898 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005899 bp := `
5900 // Source
5901 apex {
5902 name: "myapex",
5903 enabled: false,
5904 key: "myapex.key",
5905 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5906 }
5907
5908 apex_key {
5909 name: "myapex.key",
5910 public_key: "testkey.avbpubkey",
5911 private_key: "testkey.pem",
5912 }
5913
5914 // Prebuilt
5915 prebuilt_apex {
5916 name: "myapex.v1",
5917 source_apex_name: "myapex",
5918 arch: {
5919 arm64: {
5920 src: "myapex-arm64.apex",
5921 },
5922 arm: {
5923 src: "myapex-arm.apex",
5924 },
5925 },
5926 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5927 prefer: true,
5928 }
5929 prebuilt_apex {
5930 name: "myapex.v2",
5931 source_apex_name: "myapex",
5932 arch: {
5933 arm64: {
5934 src: "myapex-arm64.apex",
5935 },
5936 arm: {
5937 src: "myapex-arm.apex",
5938 },
5939 },
5940 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5941 prefer: true,
5942 }
5943
5944 prebuilt_bootclasspath_fragment {
5945 name: "my-bootclasspath-fragment",
5946 contents: ["libfoo", "libbar"],
5947 apex_available: ["myapex"],
5948 hidden_api: {
5949 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5950 metadata: "my-bootclasspath-fragment/metadata.csv",
5951 index: "my-bootclasspath-fragment/index.csv",
5952 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5953 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5954 },
5955 prefer: true,
5956 }
5957
5958 java_import {
5959 name: "libfoo",
5960 jars: ["libfoo.jar"],
5961 apex_available: ["myapex"],
5962 prefer: true,
5963 }
5964 java_import {
5965 name: "libbar",
5966 jars: ["libbar.jar"],
5967 apex_available: ["myapex"],
5968 prefer: true,
5969 }
5970 `
5971
Spandan Dasf2c10572024-02-27 04:49:52 +00005972 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 +00005973 })
5974
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005975}
5976
Roland Levillain630846d2019-06-26 12:48:34 +01005977func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005978 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005979 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005980 apex_test {
5981 name: "myapex",
5982 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005983 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005984 tests: [
5985 "mytest",
5986 ],
5987 }
5988
5989 apex_key {
5990 name: "myapex.key",
5991 public_key: "testkey.avbpubkey",
5992 private_key: "testkey.pem",
5993 }
5994
Liz Kammer1c14a212020-05-12 15:26:55 -07005995 filegroup {
5996 name: "fg",
5997 srcs: [
5998 "baz",
5999 "bar/baz"
6000 ],
6001 }
6002
Roland Levillain630846d2019-06-26 12:48:34 +01006003 cc_test {
6004 name: "mytest",
6005 gtest: false,
6006 srcs: ["mytest.cpp"],
6007 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006008 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006009 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006010 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006011 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006012 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006013
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006014 cc_library {
6015 name: "mylib",
6016 srcs: ["mylib.cpp"],
6017 system_shared_libs: [],
6018 stl: "none",
6019 }
6020
Liz Kammer5bd365f2020-05-27 15:15:11 -07006021 filegroup {
6022 name: "fg2",
6023 srcs: [
6024 "testdata/baz"
6025 ],
6026 }
Roland Levillain630846d2019-06-26 12:48:34 +01006027 `)
6028
Jooyung Hana0503a52023-08-23 13:12:50 +09006029 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006030 copyCmds := apexRule.Args["copy_commands"]
6031
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006032 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006033 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006034 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006035
Liz Kammer1c14a212020-05-12 15:26:55 -07006036 //Ensure that test data are copied into apex.
6037 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6038 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6039
Roland Levillainf89cd092019-07-29 16:22:59 +01006040 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006041 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006042 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006043 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006044 prefix := "TARGET_"
6045 var builder strings.Builder
6046 data.Custom(&builder, name, prefix, "", data)
6047 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006048 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006049 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006050}
6051
Jooyung Hand48f3c32019-08-23 11:18:57 +09006052func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006053 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006054 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6055 apex {
6056 name: "myapex",
6057 key: "myapex.key",
6058 native_shared_libs: ["libfoo"],
6059 }
6060
6061 apex_key {
6062 name: "myapex.key",
6063 public_key: "testkey.avbpubkey",
6064 private_key: "testkey.pem",
6065 }
6066
6067 cc_library {
6068 name: "libfoo",
6069 stl: "none",
6070 system_shared_libs: [],
6071 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006072 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006073 }
6074 `)
6075 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6076 apex {
6077 name: "myapex",
6078 key: "myapex.key",
6079 java_libs: ["myjar"],
6080 }
6081
6082 apex_key {
6083 name: "myapex.key",
6084 public_key: "testkey.avbpubkey",
6085 private_key: "testkey.pem",
6086 }
6087
6088 java_library {
6089 name: "myjar",
6090 srcs: ["foo/bar/MyClass.java"],
6091 sdk_version: "none",
6092 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006093 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006094 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006095 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006096 }
6097 `)
6098}
6099
Bill Peckhama41a6962021-01-11 10:58:54 -08006100func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006101 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006102 apex {
6103 name: "myapex",
6104 key: "myapex.key",
6105 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006106 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006107 }
6108
6109 apex_key {
6110 name: "myapex.key",
6111 public_key: "testkey.avbpubkey",
6112 private_key: "testkey.pem",
6113 }
6114
6115 java_import {
6116 name: "myjavaimport",
6117 apex_available: ["myapex"],
6118 jars: ["my.jar"],
6119 compile_dex: true,
6120 }
6121 `)
6122
Jooyung Hana0503a52023-08-23 13:12:50 +09006123 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006124 apexRule := module.Rule("apexRule")
6125 copyCmds := apexRule.Args["copy_commands"]
6126 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6127}
6128
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006129func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006130 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006131 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006132 apex {
6133 name: "myapex",
6134 key: "myapex.key",
6135 apps: [
6136 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006137 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006138 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006139 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006140 }
6141
6142 apex_key {
6143 name: "myapex.key",
6144 public_key: "testkey.avbpubkey",
6145 private_key: "testkey.pem",
6146 }
6147
6148 android_app {
6149 name: "AppFoo",
6150 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006151 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006152 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006153 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006154 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006155 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006156 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006157 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006158
6159 android_app {
6160 name: "AppFooPriv",
6161 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006162 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006163 system_modules: "none",
6164 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006165 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006166 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006167 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006168 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006169
6170 cc_library_shared {
6171 name: "libjni",
6172 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006173 shared_libs: ["libfoo"],
6174 stl: "none",
6175 system_shared_libs: [],
6176 apex_available: [ "myapex" ],
6177 sdk_version: "current",
6178 }
6179
6180 cc_library_shared {
6181 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006182 stl: "none",
6183 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006184 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006185 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006186 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006187 `)
6188
Jooyung Hana0503a52023-08-23 13:12:50 +09006189 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006190 apexRule := module.Rule("apexRule")
6191 copyCmds := apexRule.Args["copy_commands"]
6192
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006193 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6194 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006195 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006196
Colin Crossaede88c2020-08-11 12:17:01 -07006197 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006198 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006199 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006200 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006201 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006202 // JNI libraries including transitive deps are
6203 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006204 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006205 // ... embedded inside APK (jnilibs.zip)
6206 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6207 // ... and not directly inside the APEX
6208 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6209 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006210
6211 apexBundle := module.Module().(*apexBundle)
6212 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6213 var builder strings.Builder
6214 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6215 androidMk := builder.String()
6216 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6217 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6218 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6219 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6220 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6221 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 +01006222}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006223
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006224func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006225 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006226 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6227 for _, id := range invalidBuildIds {
6228 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6229 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6230 variables.BuildId = proptools.StringPtr(id)
6231 })
6232 testApexError(t, message, `apex {
6233 name: "myapex",
6234 key: "myapex.key",
6235 apps: ["AppFooPrebuilt"],
6236 updatable: false,
6237 }
6238
6239 apex_key {
6240 name: "myapex.key",
6241 public_key: "testkey.avbpubkey",
6242 private_key: "testkey.pem",
6243 }
6244
6245 android_app_import {
6246 name: "AppFooPrebuilt",
6247 apk: "PrebuiltAppFoo.apk",
6248 presigned: true,
6249 apex_available: ["myapex"],
6250 }
6251 `, fixture)
6252 }
6253}
6254
Dario Frenicde2a032019-10-27 00:29:22 +01006255func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006256 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006257 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006258 apex {
6259 name: "myapex",
6260 key: "myapex.key",
6261 apps: [
6262 "AppFooPrebuilt",
6263 "AppFooPrivPrebuilt",
6264 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006265 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006266 }
6267
6268 apex_key {
6269 name: "myapex.key",
6270 public_key: "testkey.avbpubkey",
6271 private_key: "testkey.pem",
6272 }
6273
6274 android_app_import {
6275 name: "AppFooPrebuilt",
6276 apk: "PrebuiltAppFoo.apk",
6277 presigned: true,
6278 dex_preopt: {
6279 enabled: false,
6280 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006281 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006282 }
6283
6284 android_app_import {
6285 name: "AppFooPrivPrebuilt",
6286 apk: "PrebuiltAppFooPriv.apk",
6287 privileged: true,
6288 presigned: true,
6289 dex_preopt: {
6290 enabled: false,
6291 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006292 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006293 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006294 }
6295 `)
6296
Jooyung Hana0503a52023-08-23 13:12:50 +09006297 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006298 apexRule := module.Rule("apexRule")
6299 copyCmds := apexRule.Args["copy_commands"]
6300
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006301 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6302 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006303}
6304
6305func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006306 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006307 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006308 apex {
6309 name: "myapex",
6310 key: "myapex.key",
6311 apps: [
6312 "AppFoo",
6313 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006314 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006315 }
6316
6317 apex_key {
6318 name: "myapex.key",
6319 public_key: "testkey.avbpubkey",
6320 private_key: "testkey.pem",
6321 }
6322
6323 android_app {
6324 name: "AppFoo",
6325 srcs: ["foo/bar/MyClass.java"],
6326 sdk_version: "none",
6327 system_modules: "none",
6328 apex_available: [ "myapex" ],
6329 }
6330
6331 android_app_import {
6332 name: "AppFoo",
6333 apk: "AppFooPrebuilt.apk",
6334 filename: "AppFooPrebuilt.apk",
6335 presigned: true,
6336 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006337 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006338 }
6339 `, withFiles(map[string][]byte{
6340 "AppFooPrebuilt.apk": nil,
6341 }))
6342
Jooyung Hana0503a52023-08-23 13:12:50 +09006343 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006344 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006345 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006346}
6347
Dario Freni6f3937c2019-12-20 22:58:03 +00006348func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006349 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006350 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006351 apex {
6352 name: "myapex",
6353 key: "myapex.key",
6354 apps: [
6355 "TesterHelpAppFoo",
6356 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006357 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006358 }
6359
6360 apex_key {
6361 name: "myapex.key",
6362 public_key: "testkey.avbpubkey",
6363 private_key: "testkey.pem",
6364 }
6365
6366 android_test_helper_app {
6367 name: "TesterHelpAppFoo",
6368 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006369 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006370 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006371 }
6372
6373 `)
6374
Jooyung Hana0503a52023-08-23 13:12:50 +09006375 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006376 apexRule := module.Rule("apexRule")
6377 copyCmds := apexRule.Args["copy_commands"]
6378
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006379 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006380}
6381
Jooyung Han18020ea2019-11-13 10:50:48 +09006382func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006383 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006384 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006385 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006386 apex {
6387 name: "myapex",
6388 key: "myapex.key",
6389 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006390 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006391 }
6392
6393 apex_key {
6394 name: "myapex.key",
6395 public_key: "testkey.avbpubkey",
6396 private_key: "testkey.pem",
6397 }
6398
6399 apex {
6400 name: "otherapex",
6401 key: "myapex.key",
6402 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006403 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006404 }
6405
6406 cc_defaults {
6407 name: "libfoo-defaults",
6408 apex_available: ["otherapex"],
6409 }
6410
6411 cc_library {
6412 name: "libfoo",
6413 defaults: ["libfoo-defaults"],
6414 stl: "none",
6415 system_shared_libs: [],
6416 }`)
6417}
6418
Paul Duffine52e66f2020-03-30 17:54:29 +01006419func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006420 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006421 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006422 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006423 apex {
6424 name: "myapex",
6425 key: "myapex.key",
6426 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006427 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006428 }
6429
6430 apex_key {
6431 name: "myapex.key",
6432 public_key: "testkey.avbpubkey",
6433 private_key: "testkey.pem",
6434 }
6435
6436 apex {
6437 name: "otherapex",
6438 key: "otherapex.key",
6439 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006440 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006441 }
6442
6443 apex_key {
6444 name: "otherapex.key",
6445 public_key: "testkey.avbpubkey",
6446 private_key: "testkey.pem",
6447 }
6448
6449 cc_library {
6450 name: "libfoo",
6451 stl: "none",
6452 system_shared_libs: [],
6453 apex_available: ["otherapex"],
6454 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006455
6456 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6457 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6458 testApex(t, `
6459 apex {
6460 name: "com.sdv.myapex",
6461 key: "myapex.key",
6462 native_shared_libs: ["libfoo"],
6463 updatable: false,
6464 product_specific: true,
6465 }
6466
6467 apex_key {
6468 name: "myapex.key",
6469 public_key: "testkey.avbpubkey",
6470 private_key: "testkey.pem",
6471 }
6472
6473 apex {
6474 name: "com.any.otherapex",
6475 key: "otherapex.key",
6476 native_shared_libs: ["libfoo"],
6477 updatable: false,
6478 }
6479
6480 apex_key {
6481 name: "otherapex.key",
6482 public_key: "testkey.avbpubkey",
6483 private_key: "testkey.pem",
6484 }
6485
6486 cc_library {
6487 name: "libfoo",
6488 stl: "none",
6489 system_shared_libs: [],
6490 apex_available: ["com.any.otherapex"],
6491 product_specific: true,
6492 }`,
6493 android.FixtureMergeMockFs(android.MockFS{
6494 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6495 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6496 }))
6497
6498 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6499 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6500 apex {
6501 name: "com.sdv.myapex",
6502 key: "myapex.key",
6503 native_shared_libs: ["libfoo"],
6504 updatable: false,
6505 }
6506
6507 apex_key {
6508 name: "myapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512
6513 apex {
6514 name: "com.any.otherapex",
6515 key: "otherapex.key",
6516 native_shared_libs: ["libfoo"],
6517 updatable: false,
6518 }
6519
6520 apex_key {
6521 name: "otherapex.key",
6522 public_key: "testkey.avbpubkey",
6523 private_key: "testkey.pem",
6524 }
6525
6526 cc_library {
6527 name: "libfoo",
6528 stl: "none",
6529 system_shared_libs: [],
6530 apex_available: ["com.any.otherapex"],
6531 }`,
6532 android.FixtureMergeMockFs(android.MockFS{
6533 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6534 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6535 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006536}
Jiyong Park127b40b2019-09-30 16:04:35 +09006537
Paul Duffine52e66f2020-03-30 17:54:29 +01006538func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006539 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006540 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006541 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006542.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006543.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006544.*via tag cc\.dependencyTag.*
6545.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006546.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006547.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006548.*via tag cc\.dependencyTag.*
6549.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006550.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006551.*-> libbaz.*link:shared.*
6552.*via tag cc\.dependencyTag.*
6553.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006554 apex {
6555 name: "myapex",
6556 key: "myapex.key",
6557 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006558 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006559 }
6560
6561 apex_key {
6562 name: "myapex.key",
6563 public_key: "testkey.avbpubkey",
6564 private_key: "testkey.pem",
6565 }
6566
Jiyong Park127b40b2019-09-30 16:04:35 +09006567 cc_library {
6568 name: "libfoo",
6569 stl: "none",
6570 shared_libs: ["libbar"],
6571 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006572 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006573 }
6574
6575 cc_library {
6576 name: "libbar",
6577 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006578 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006579 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006580 apex_available: ["myapex"],
6581 }
6582
6583 cc_library {
6584 name: "libbaz",
6585 stl: "none",
6586 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006587 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006588
6589 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6590 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6591 testApex(t, `
6592 apex {
6593 name: "com.sdv.myapex",
6594 key: "myapex.key",
6595 native_shared_libs: ["libfoo"],
6596 updatable: false,
6597 product_specific: true,
6598 }
6599
6600 apex_key {
6601 name: "myapex.key",
6602 public_key: "testkey.avbpubkey",
6603 private_key: "testkey.pem",
6604 }
6605
6606 cc_library {
6607 name: "libfoo",
6608 stl: "none",
6609 shared_libs: ["libbar"],
6610 system_shared_libs: [],
6611 apex_available: ["com.sdv.myapex"],
6612 product_specific: true,
6613 }
6614
6615 cc_library {
6616 name: "libbar",
6617 stl: "none",
6618 shared_libs: ["libbaz"],
6619 system_shared_libs: [],
6620 apex_available: ["com.sdv.myapex"],
6621 product_specific: true,
6622 }
6623
6624 cc_library {
6625 name: "libbaz",
6626 stl: "none",
6627 system_shared_libs: [],
6628 product_specific: true,
6629 }`,
6630 android.FixtureMergeMockFs(android.MockFS{
6631 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6632 }))
6633
6634 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6635 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6636 apex {
6637 name: "com.sdv.myapex",
6638 key: "myapex.key",
6639 native_shared_libs: ["libfoo"],
6640 updatable: false,
6641 }
6642
6643 apex_key {
6644 name: "myapex.key",
6645 public_key: "testkey.avbpubkey",
6646 private_key: "testkey.pem",
6647 }
6648
6649 cc_library {
6650 name: "libfoo",
6651 stl: "none",
6652 shared_libs: ["libbar"],
6653 system_shared_libs: [],
6654 apex_available: ["com.sdv.myapex"],
6655 }
6656
6657 cc_library {
6658 name: "libbar",
6659 stl: "none",
6660 shared_libs: ["libbaz"],
6661 system_shared_libs: [],
6662 apex_available: ["com.sdv.myapex"],
6663 }
6664
6665 cc_library {
6666 name: "libbaz",
6667 stl: "none",
6668 system_shared_libs: [],
6669 }`,
6670 android.FixtureMergeMockFs(android.MockFS{
6671 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6672 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006673}
Jiyong Park127b40b2019-09-30 16:04:35 +09006674
Liz Kammer5f108fa2023-05-11 14:33:17 -04006675func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006676 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006677 testApex(t, `
6678 apex {
6679 name: "myapex",
6680 key: "myapex.key",
6681 native_shared_libs: ["libfoo"],
6682 updatable: false,
6683 }
6684
6685 apex_key {
6686 name: "myapex.key",
6687 public_key: "testkey.avbpubkey",
6688 private_key: "testkey.pem",
6689 }
6690
6691 cc_library {
6692 name: "libfoo",
6693 stl: "none",
6694 static_libs: ["libbar"],
6695 system_shared_libs: [],
6696 apex_available: ["myapex"],
6697 }
6698
6699 cc_library {
6700 name: "libbar",
6701 stl: "none",
6702 shared_libs: ["libbaz"],
6703 system_shared_libs: [],
6704 apex_available: ["myapex"],
6705 }
6706
6707 cc_library {
6708 name: "libbaz",
6709 stl: "none",
6710 system_shared_libs: [],
6711 }`)
6712
6713 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6714 apex {
6715 name: "myapex",
6716 key: "myapex.key",
6717 native_shared_libs: ["libfoo"],
6718 updatable: false,
6719 }
6720
6721 apex_key {
6722 name: "myapex.key",
6723 public_key: "testkey.avbpubkey",
6724 private_key: "testkey.pem",
6725 }
6726
6727 cc_library {
6728 name: "libfoo",
6729 stl: "none",
6730 static_libs: ["libbar"],
6731 system_shared_libs: [],
6732 apex_available: ["myapex"],
6733 }
6734
6735 cc_library {
6736 name: "libbar",
6737 stl: "none",
6738 system_shared_libs: [],
6739 }`)
6740}
6741
Paul Duffine52e66f2020-03-30 17:54:29 +01006742func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006743 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006744 testApexError(t, "\"otherapex\" is not a valid module name", `
6745 apex {
6746 name: "myapex",
6747 key: "myapex.key",
6748 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006749 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006750 }
6751
6752 apex_key {
6753 name: "myapex.key",
6754 public_key: "testkey.avbpubkey",
6755 private_key: "testkey.pem",
6756 }
6757
6758 cc_library {
6759 name: "libfoo",
6760 stl: "none",
6761 system_shared_libs: [],
6762 apex_available: ["otherapex"],
6763 }`)
6764
Paul Duffine52e66f2020-03-30 17:54:29 +01006765 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006766 apex {
6767 name: "myapex",
6768 key: "myapex.key",
6769 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006770 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006771 }
6772
6773 apex_key {
6774 name: "myapex.key",
6775 public_key: "testkey.avbpubkey",
6776 private_key: "testkey.pem",
6777 }
6778
6779 cc_library {
6780 name: "libfoo",
6781 stl: "none",
6782 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006783 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006784 apex_available: ["myapex"],
6785 }
6786
6787 cc_library {
6788 name: "libbar",
6789 stl: "none",
6790 system_shared_libs: [],
6791 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006792 }
6793
6794 cc_library {
6795 name: "libbaz",
6796 stl: "none",
6797 system_shared_libs: [],
6798 stubs: {
6799 versions: ["10", "20", "30"],
6800 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006801 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006802}
Jiyong Park127b40b2019-09-30 16:04:35 +09006803
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006804func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006805 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006806 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006807 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006808 testApexError(t, "expected an integer between 0-9; got -1", `
6809 apex {
6810 name: "myapex",
6811 key: "myapex.key",
6812 apex_available_name: "com.android.foo",
6813 variant_version: "-1",
6814 updatable: false,
6815 }
6816 apex_key {
6817 name: "myapex.key",
6818 public_key: "testkey.avbpubkey",
6819 private_key: "testkey.pem",
6820 }
6821 `)
6822 })
6823
6824 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006825 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006826 testApexError(t, "expected an integer between 0-9; got 10", `
6827 apex {
6828 name: "myapex",
6829 key: "myapex.key",
6830 apex_available_name: "com.android.foo",
6831 variant_version: "10",
6832 updatable: false,
6833 }
6834 apex_key {
6835 name: "myapex.key",
6836 public_key: "testkey.avbpubkey",
6837 private_key: "testkey.pem",
6838 }
6839 `)
6840 })
6841}
6842
6843func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006844 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006845 context := android.GroupFixturePreparers(
6846 android.PrepareForIntegrationTestWithAndroid,
6847 PrepareForTestWithApexBuildComponents,
6848 android.FixtureMergeMockFs(android.MockFS{
6849 "system/sepolicy/apex/foo-file_contexts": nil,
6850 "system/sepolicy/apex/bar-file_contexts": nil,
6851 }),
6852 )
6853 result := context.RunTestWithBp(t, `
6854 apex {
6855 name: "foo",
6856 key: "myapex.key",
6857 apex_available_name: "com.android.foo",
6858 variant_version: "0",
6859 updatable: false,
6860 }
6861 apex {
6862 name: "bar",
6863 key: "myapex.key",
6864 apex_available_name: "com.android.foo",
6865 variant_version: "3",
6866 updatable: false,
6867 }
6868 apex_key {
6869 name: "myapex.key",
6870 public_key: "testkey.avbpubkey",
6871 private_key: "testkey.pem",
6872 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006873 override_apex {
6874 name: "myoverrideapex",
6875 base: "bar",
6876 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006877 `)
6878
Jooyung Hana0503a52023-08-23 13:12:50 +09006879 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006880 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006881 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6882 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6883 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6884 }
6885
Jooyung Hana0503a52023-08-23 13:12:50 +09006886 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006887 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006888 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6889 barActualDefaultVersion := barManifestRule.Args["default_version"]
6890 if barActualDefaultVersion != barExpectedDefaultVersion {
6891 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6892 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006893
Spandan Das50801e22024-05-13 18:29:45 +00006894 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006895 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6896 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6897 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6898 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006899}
6900
Sam Delmericoca816532023-06-02 14:09:50 -04006901func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006902 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006903 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 -07006904 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006905 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6906 apex {
6907 name: "myapex_sminus",
6908 key: "myapex.key",
6909 apps: ["AppFoo"],
6910 apex_available_name: "myapex",
6911 updatable: false,
6912 }
6913 apex {
6914 name: "myapex",
6915 key: "myapex.key",
6916 apps: ["AppFoo"],
6917 updatable: false,
6918 }
6919 apex_key {
6920 name: "myapex.key",
6921 public_key: "testkey.avbpubkey",
6922 private_key: "testkey.pem",
6923 }
6924 android_app {
6925 name: "AppFoo",
6926 srcs: ["foo/bar/MyClass.java"],
6927 sdk_version: "none",
6928 system_modules: "none",
6929 apex_available: [ "myapex_sminus" ],
6930 }`,
6931 android.FixtureMergeMockFs(android.MockFS{
6932 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6933 }),
6934 )
6935 })
6936
6937 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 -07006938 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006939 testApex(t, `
6940 apex {
6941 name: "myapex_sminus",
6942 key: "myapex.key",
6943 apps: ["AppFoo"],
6944 apex_available_name: "myapex",
6945 updatable: false,
6946 }
6947 apex {
6948 name: "myapex",
6949 key: "myapex.key",
6950 apps: ["AppFoo"],
6951 updatable: false,
6952 }
6953 apex_key {
6954 name: "myapex.key",
6955 public_key: "testkey.avbpubkey",
6956 private_key: "testkey.pem",
6957 }
6958 android_app {
6959 name: "AppFoo",
6960 srcs: ["foo/bar/MyClass.java"],
6961 sdk_version: "none",
6962 system_modules: "none",
6963 apex_available: [ "myapex" ],
6964 }`,
6965 android.FixtureMergeMockFs(android.MockFS{
6966 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6967 }),
6968 )
6969 })
6970
6971 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006972 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006973 testApex(t, `
6974 override_apex {
6975 name: "myoverrideapex_sminus",
6976 base: "myapex_sminus",
6977 key: "myapex.key",
6978 apps: ["AppFooOverride"],
6979 }
6980 override_apex {
6981 name: "myoverrideapex",
6982 base: "myapex",
6983 key: "myapex.key",
6984 apps: ["AppFooOverride"],
6985 }
6986 apex {
6987 name: "myapex_sminus",
6988 key: "myapex.key",
6989 apps: ["AppFoo"],
6990 apex_available_name: "myapex",
6991 updatable: false,
6992 }
6993 apex {
6994 name: "myapex",
6995 key: "myapex.key",
6996 apps: ["AppFoo"],
6997 updatable: false,
6998 }
6999 apex_key {
7000 name: "myapex.key",
7001 public_key: "testkey.avbpubkey",
7002 private_key: "testkey.pem",
7003 }
7004 android_app {
7005 name: "AppFooOverride",
7006 srcs: ["foo/bar/MyClass.java"],
7007 sdk_version: "none",
7008 system_modules: "none",
7009 apex_available: [ "myapex" ],
7010 }
7011 android_app {
7012 name: "AppFoo",
7013 srcs: ["foo/bar/MyClass.java"],
7014 sdk_version: "none",
7015 system_modules: "none",
7016 apex_available: [ "myapex" ],
7017 }`,
7018 android.FixtureMergeMockFs(android.MockFS{
7019 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7020 }),
7021 )
7022 })
7023}
7024
7025func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007026 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007027 context := android.GroupFixturePreparers(
7028 android.PrepareForIntegrationTestWithAndroid,
7029 PrepareForTestWithApexBuildComponents,
7030 java.PrepareForTestWithDexpreopt,
7031 android.FixtureMergeMockFs(android.MockFS{
7032 "system/sepolicy/apex/myapex-file_contexts": nil,
7033 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7034 }),
7035 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7036 variables.BuildId = proptools.StringPtr("buildid")
7037 }),
7038 )
7039 context.RunTestWithBp(t, `
7040 override_apex {
7041 name: "myoverrideapex_sminus",
7042 base: "myapex_sminus",
7043 }
7044 override_apex {
7045 name: "myoverrideapex",
7046 base: "myapex",
7047 }
7048 apex {
7049 name: "myapex",
7050 key: "myapex.key",
7051 apps: ["AppFoo"],
7052 updatable: false,
7053 }
7054 apex {
7055 name: "myapex_sminus",
7056 apex_available_name: "myapex",
7057 key: "myapex.key",
7058 apps: ["AppFoo_sminus"],
7059 updatable: false,
7060 }
7061 apex_key {
7062 name: "myapex.key",
7063 public_key: "testkey.avbpubkey",
7064 private_key: "testkey.pem",
7065 }
7066 android_app {
7067 name: "AppFoo",
7068 srcs: ["foo/bar/MyClass.java"],
7069 sdk_version: "none",
7070 system_modules: "none",
7071 apex_available: [ "myapex" ],
7072 }
7073 android_app {
7074 name: "AppFoo_sminus",
7075 srcs: ["foo/bar/MyClass.java"],
7076 sdk_version: "none",
7077 min_sdk_version: "29",
7078 system_modules: "none",
7079 apex_available: [ "myapex" ],
7080 }`)
7081}
7082
Jiyong Park89e850a2020-04-07 16:37:39 +09007083func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007084 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007085 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007086 apex {
7087 name: "myapex",
7088 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007089 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007090 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007091 }
7092
7093 apex_key {
7094 name: "myapex.key",
7095 public_key: "testkey.avbpubkey",
7096 private_key: "testkey.pem",
7097 }
7098
7099 cc_library {
7100 name: "libfoo",
7101 stl: "none",
7102 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007103 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007104 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007105 }
7106
7107 cc_library {
7108 name: "libfoo2",
7109 stl: "none",
7110 system_shared_libs: [],
7111 shared_libs: ["libbaz"],
7112 apex_available: ["//apex_available:platform"],
7113 }
7114
7115 cc_library {
7116 name: "libbar",
7117 stl: "none",
7118 system_shared_libs: [],
7119 apex_available: ["myapex"],
7120 }
7121
7122 cc_library {
7123 name: "libbaz",
7124 stl: "none",
7125 system_shared_libs: [],
7126 apex_available: ["myapex"],
7127 stubs: {
7128 versions: ["1"],
7129 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007130 }`)
7131
Jiyong Park89e850a2020-04-07 16:37:39 +09007132 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7133 // because it depends on libbar which isn't available to platform
7134 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7135 if libfoo.NotAvailableForPlatform() != true {
7136 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7137 }
7138
7139 // libfoo2 however can be available to platform because it depends on libbaz which provides
7140 // stubs
7141 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7142 if libfoo2.NotAvailableForPlatform() == true {
7143 t.Errorf("%q should be available to platform", libfoo2.String())
7144 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007145}
Jiyong Parka90ca002019-10-07 15:47:24 +09007146
Paul Duffine52e66f2020-03-30 17:54:29 +01007147func TestApexAvailable_CreatedForApex(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 Parka90ca002019-10-07 15:47:24 +09007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
7153 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +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: [],
7167 apex_available: ["myapex"],
7168 static: {
7169 apex_available: ["//apex_available:platform"],
7170 },
7171 }`)
7172
Jiyong Park89e850a2020-04-07 16:37:39 +09007173 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7174 if libfooShared.NotAvailableForPlatform() != true {
7175 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7176 }
7177 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7178 if libfooStatic.NotAvailableForPlatform() != false {
7179 t.Errorf("%q should be available to platform", libfooStatic.String())
7180 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007181}
7182
Jooyung Han9a419e22024-08-16 17:14:21 +09007183func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007184 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007185
7186 for _, tc := range []struct {
7187 name string
7188 apexAvailable string
7189 expectedError string
7190 }{
7191 {
7192 name: "prefix matches correctly",
7193 apexAvailable: "com.foo.*",
7194 },
7195 {
7196 name: "prefix doesn't match",
7197 apexAvailable: "com.bar.*",
7198 expectedError: `Consider .* "com.foo\.\*"`,
7199 },
7200 {
7201 name: "short prefix",
7202 apexAvailable: "com.*",
7203 expectedError: "requires two or more components",
7204 },
7205 {
7206 name: "wildcard not in the end",
7207 apexAvailable: "com.*.foo",
7208 expectedError: "should end with .*",
7209 },
7210 {
7211 name: "wildcard in the middle",
7212 apexAvailable: "com.foo*.*",
7213 expectedError: "not allowed in the middle",
7214 },
7215 {
7216 name: "hint with prefix pattern",
7217 apexAvailable: "//apex_available:platform",
7218 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7219 },
7220 } {
7221 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007222 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007223 errorHandler := android.FixtureExpectsNoErrors
7224 if tc.expectedError != "" {
7225 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7226 }
7227 context := android.GroupFixturePreparers(
7228 prepareForApexTest,
7229 android.FixtureMergeMockFs(android.MockFS{
7230 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7231 }),
7232 ).ExtendWithErrorHandler(errorHandler)
7233
7234 context.RunTestWithBp(t, `
7235 apex {
7236 name: "com.foo.bar",
7237 key: "myapex.key",
7238 native_shared_libs: ["libfoo"],
7239 updatable: false,
7240 }
7241
7242 apex_key {
7243 name: "myapex.key",
7244 public_key: "testkey.avbpubkey",
7245 private_key: "testkey.pem",
7246 }
7247
7248 cc_library {
7249 name: "libfoo",
7250 stl: "none",
7251 system_shared_libs: [],
7252 apex_available: ["`+tc.apexAvailable+`"],
7253 }`)
7254 })
7255 }
7256 testApexError(t, `Consider adding "com.foo" to`, `
7257 apex {
7258 name: "com.foo", // too short for a partner apex
7259 key: "myapex.key",
7260 native_shared_libs: ["libfoo"],
7261 updatable: false,
7262 }
7263
7264 apex_key {
7265 name: "myapex.key",
7266 public_key: "testkey.avbpubkey",
7267 private_key: "testkey.pem",
7268 }
7269
7270 cc_library {
7271 name: "libfoo",
7272 stl: "none",
7273 system_shared_libs: [],
7274 }
7275 `)
7276}
7277
Jooyung Han5f7fa502025-01-14 16:52:14 +09007278func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7279 t.Parallel()
7280 ctx := testApex(t, `
7281 apex {
7282 name: "myapex",
7283 key: "myapex.key",
7284 updatable: false,
7285 vendor: true,
7286 }
7287 apex_key {
7288 name: "myapex.key",
7289 public_key: "testkey.avbpubkey",
7290 private_key: "testkey.pem",
7291 }
7292 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7293 // vendor path should not affect "partition tag"
7294 variables.VendorPath = proptools.StringPtr("system/vendor")
7295 }))
7296
7297 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7298 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7299 "vendor",
7300 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7301 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7302 "vendor",
7303 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7304}
7305
Jooyung Hanb9518072024-11-22 14:05:20 +09007306func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7307 t.Parallel()
7308 ctx := testApex(t, `
7309 apex_test {
7310 name: "myapex",
7311 key: "myapex.key",
7312 skip_validations: {
7313 host_apex_verifier: true,
7314 },
7315 updatable: false,
7316 }
7317 apex_key {
7318 name: "myapex.key",
7319 public_key: "testkey.avbpubkey",
7320 private_key: "testkey.pem",
7321 }
7322 `)
7323
7324 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7325 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7326 t.Error("should not run host_apex_verifier")
7327 }
7328}
7329
7330func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7331 t.Parallel()
7332 ctx := testApex(t, `
7333 apex_test {
7334 name: "myapex",
7335 key: "myapex.key",
7336 updatable: false,
7337 }
7338 apex_key {
7339 name: "myapex.key",
7340 public_key: "testkey.avbpubkey",
7341 private_key: "testkey.pem",
7342 }
7343 `)
7344
7345 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7346 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7347 t.Error("should run host_apex_verifier")
7348 }
7349}
7350
Jiyong Park5d790c32019-11-15 18:40:32 +09007351func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007352 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007353 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007354 apex {
7355 name: "myapex",
7356 key: "myapex.key",
7357 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007358 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007359 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007360 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007361 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007362 }
7363
7364 override_apex {
7365 name: "override_myapex",
7366 base: "myapex",
7367 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007368 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007369 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007370 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007371 compile_multilib: "first",
7372 multilib: {
7373 lib32: {
7374 native_shared_libs: ["mylib32"],
7375 },
7376 lib64: {
7377 native_shared_libs: ["mylib64"],
7378 },
7379 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007380 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007381 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007382 key: "mynewapex.key",
7383 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007384 }
7385
7386 apex_key {
7387 name: "myapex.key",
7388 public_key: "testkey.avbpubkey",
7389 private_key: "testkey.pem",
7390 }
7391
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007392 apex_key {
7393 name: "mynewapex.key",
7394 public_key: "testkey2.avbpubkey",
7395 private_key: "testkey2.pem",
7396 }
7397
7398 android_app_certificate {
7399 name: "myapex.certificate",
7400 certificate: "testkey",
7401 }
7402
Jiyong Park5d790c32019-11-15 18:40:32 +09007403 android_app {
7404 name: "app",
7405 srcs: ["foo/bar/MyClass.java"],
7406 package_name: "foo",
7407 sdk_version: "none",
7408 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007409 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007410 }
7411
7412 override_android_app {
7413 name: "override_app",
7414 base: "app",
7415 package_name: "bar",
7416 }
markchien7c803b82021-08-26 22:10:06 +08007417
7418 bpf {
7419 name: "bpf",
7420 srcs: ["bpf.c"],
7421 }
7422
7423 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007424 name: "overrideBpf",
7425 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007426 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007427
7428 prebuilt_etc {
7429 name: "myetc",
7430 src: "myprebuilt",
7431 }
7432
7433 prebuilt_etc {
7434 name: "override_myetc",
7435 src: "override_myprebuilt",
7436 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007437
7438 cc_library {
7439 name: "mylib32",
7440 apex_available: [ "myapex" ],
7441 }
7442
7443 cc_library {
7444 name: "mylib64",
7445 apex_available: [ "myapex" ],
7446 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007447 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007448
Jooyung Hana0503a52023-08-23 13:12:50 +09007449 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007450 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007451 if originalVariant.GetOverriddenBy() != "" {
7452 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7453 }
7454 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7455 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7456 }
7457
Spandan Das50801e22024-05-13 18:29:45 +00007458 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007459 apexRule := module.Rule("apexRule")
7460 copyCmds := apexRule.Args["copy_commands"]
7461
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007462 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7463 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007464
markchien7c803b82021-08-26 22:10:06 +08007465 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007466 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007467
Daniel Norman5a3ce132021-08-26 15:44:43 -07007468 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7469 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7470
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007471 apexBundle := module.Module().(*apexBundle)
7472 name := apexBundle.Name()
7473 if name != "override_myapex" {
7474 t.Errorf("name should be \"override_myapex\", but was %q", name)
7475 }
7476
Baligh Uddin004d7172020-02-19 21:29:28 -08007477 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7478 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7479 }
7480
Jiyong Park20bacab2020-03-03 11:45:41 +09007481 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007482 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007483 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7484
7485 signApkRule := module.Rule("signapk")
7486 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007487
Colin Crossaa255532020-07-03 13:18:24 -07007488 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007489 var builder strings.Builder
7490 data.Custom(&builder, name, "TARGET_", "", data)
7491 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007492 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7493 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007494 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007495 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007496 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007497 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007498 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007499 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007500}
7501
Albert Martineefabcf2022-03-21 20:11:16 +00007502func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007503 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007504 // Override from 29 to 31
7505 minSdkOverride31 := "31"
7506 ctx := testApex(t, `
7507 apex {
7508 name: "myapex",
7509 key: "myapex.key",
7510 native_shared_libs: ["mylib"],
7511 updatable: true,
7512 min_sdk_version: "29"
7513 }
7514
7515 override_apex {
7516 name: "override_myapex",
7517 base: "myapex",
7518 logging_parent: "com.foo.bar",
7519 package_name: "test.overridden.package"
7520 }
7521
7522 apex_key {
7523 name: "myapex.key",
7524 public_key: "testkey.avbpubkey",
7525 private_key: "testkey.pem",
7526 }
7527
7528 cc_library {
7529 name: "mylib",
7530 srcs: ["mylib.cpp"],
7531 runtime_libs: ["libbar"],
7532 system_shared_libs: [],
7533 stl: "none",
7534 apex_available: [ "myapex" ],
7535 min_sdk_version: "apex_inherit"
7536 }
7537
7538 cc_library {
7539 name: "libbar",
7540 srcs: ["mylib.cpp"],
7541 system_shared_libs: [],
7542 stl: "none",
7543 apex_available: [ "myapex" ],
7544 min_sdk_version: "apex_inherit"
7545 }
7546
7547 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7548
Jooyung Hana0503a52023-08-23 13:12:50 +09007549 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007550 copyCmds := apexRule.Args["copy_commands"]
7551
7552 // Ensure that direct non-stubs dep is always included
7553 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7554
7555 // Ensure that runtime_libs dep in included
7556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7557
7558 // Ensure libraries target overridden min_sdk_version value
7559 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7560}
7561
7562func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007563 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007564 // Attempt to override from 31 to 29, should be a NOOP
7565 minSdkOverride29 := "29"
7566 ctx := testApex(t, `
7567 apex {
7568 name: "myapex",
7569 key: "myapex.key",
7570 native_shared_libs: ["mylib"],
7571 updatable: true,
7572 min_sdk_version: "31"
7573 }
7574
7575 override_apex {
7576 name: "override_myapex",
7577 base: "myapex",
7578 logging_parent: "com.foo.bar",
7579 package_name: "test.overridden.package"
7580 }
7581
7582 apex_key {
7583 name: "myapex.key",
7584 public_key: "testkey.avbpubkey",
7585 private_key: "testkey.pem",
7586 }
7587
7588 cc_library {
7589 name: "mylib",
7590 srcs: ["mylib.cpp"],
7591 runtime_libs: ["libbar"],
7592 system_shared_libs: [],
7593 stl: "none",
7594 apex_available: [ "myapex" ],
7595 min_sdk_version: "apex_inherit"
7596 }
7597
7598 cc_library {
7599 name: "libbar",
7600 srcs: ["mylib.cpp"],
7601 system_shared_libs: [],
7602 stl: "none",
7603 apex_available: [ "myapex" ],
7604 min_sdk_version: "apex_inherit"
7605 }
7606
7607 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7608
Jooyung Hana0503a52023-08-23 13:12:50 +09007609 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007610 copyCmds := apexRule.Args["copy_commands"]
7611
7612 // Ensure that direct non-stubs dep is always included
7613 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7614
7615 // Ensure that runtime_libs dep in included
7616 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7617
7618 // Ensure libraries target the original min_sdk_version value rather than the overridden
7619 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7620}
7621
Jooyung Han214bf372019-11-12 13:03:50 +09007622func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007623 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007624 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007625 apex {
7626 name: "myapex",
7627 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007628 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007629 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007630 }
7631
7632 apex_key {
7633 name: "myapex.key",
7634 public_key: "testkey.avbpubkey",
7635 private_key: "testkey.pem",
7636 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007637
7638 cc_library {
7639 name: "mylib",
7640 srcs: ["mylib.cpp"],
7641 stl: "libc++",
7642 system_shared_libs: [],
7643 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007644 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007645 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007646 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007647
Jooyung Hana0503a52023-08-23 13:12:50 +09007648 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007649 args := module.Rule("apexRule").Args
7650 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007651
7652 // The copies of the libraries in the apex should have one more dependency than
7653 // the ones outside the apex, namely the unwinder. Ideally we should check
7654 // the dependency names directly here but for some reason the names are blank in
7655 // this test.
7656 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007657 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007658 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7659 if len(apexImplicits) != len(nonApexImplicits)+1 {
7660 t.Errorf("%q missing unwinder dep", lib)
7661 }
7662 }
Jooyung Han214bf372019-11-12 13:03:50 +09007663}
7664
Paul Duffine05480a2021-03-08 15:07:14 +00007665var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007666 "api/current.txt": nil,
7667 "api/removed.txt": nil,
7668 "api/system-current.txt": nil,
7669 "api/system-removed.txt": nil,
7670 "api/test-current.txt": nil,
7671 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007672
Anton Hanssondff2c782020-12-21 17:10:01 +00007673 "100/public/api/foo.txt": nil,
7674 "100/public/api/foo-removed.txt": nil,
7675 "100/system/api/foo.txt": nil,
7676 "100/system/api/foo-removed.txt": nil,
7677
Paul Duffineedc5d52020-06-12 17:46:39 +01007678 // For java_sdk_library_import
7679 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007680}
7681
Jooyung Han58f26ab2019-12-18 15:34:32 +09007682func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007683 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007684 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007685 apex {
7686 name: "myapex",
7687 key: "myapex.key",
7688 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007689 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007690 }
7691
7692 apex_key {
7693 name: "myapex.key",
7694 public_key: "testkey.avbpubkey",
7695 private_key: "testkey.pem",
7696 }
7697
7698 java_sdk_library {
7699 name: "foo",
7700 srcs: ["a.java"],
7701 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007702 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007703 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007704
7705 prebuilt_apis {
7706 name: "sdk",
7707 api_dirs: ["100"],
7708 }
Paul Duffin9b879592020-05-26 13:21:35 +01007709 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007710
7711 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007712 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007713 "javalib/foo.jar",
7714 "etc/permissions/foo.xml",
7715 })
7716 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007717 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7718 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7719 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007720}
7721
Spandan Das3ee19692024-06-19 04:47:40 +00007722func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007723 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007724 ctx := testApex(t, `
7725 override_apex {
7726 name: "mycompanyapex",
7727 base: "myapex",
7728 }
7729 apex {
7730 name: "myapex",
7731 key: "myapex.key",
7732 java_libs: ["foo"],
7733 updatable: false,
7734 }
7735
7736 apex_key {
7737 name: "myapex.key",
7738 public_key: "testkey.avbpubkey",
7739 private_key: "testkey.pem",
7740 }
7741
7742 java_sdk_library {
7743 name: "foo",
7744 srcs: ["a.java"],
7745 api_packages: ["foo"],
7746 apex_available: [ "myapex" ],
7747 }
7748
7749 prebuilt_apis {
7750 name: "sdk",
7751 api_dirs: ["100"],
7752 }
7753 `, withFiles(filesForSdkLibrary))
7754
7755 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7756 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7757 // (com.android.foo), the filepath should not contain override apex name.
7758 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7759 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7760 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7761}
7762
Paul Duffin9b879592020-05-26 13:21:35 +01007763func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007765 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007766 apex {
7767 name: "myapex",
7768 key: "myapex.key",
7769 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007770 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007771 }
7772
7773 apex_key {
7774 name: "myapex.key",
7775 public_key: "testkey.avbpubkey",
7776 private_key: "testkey.pem",
7777 }
7778
7779 java_sdk_library {
7780 name: "foo",
7781 srcs: ["a.java"],
7782 api_packages: ["foo"],
7783 apex_available: ["myapex"],
7784 sdk_version: "none",
7785 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007786 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007787 }
7788
7789 java_library {
7790 name: "bar",
7791 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007792 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007793 apex_available: ["myapex"],
7794 sdk_version: "none",
7795 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007796 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007797 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007798
7799 prebuilt_apis {
7800 name: "sdk",
7801 api_dirs: ["100"],
7802 }
Paul Duffin9b879592020-05-26 13:21:35 +01007803 `, withFiles(filesForSdkLibrary))
7804
7805 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007806 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007807 "javalib/bar.jar",
7808 "javalib/foo.jar",
7809 "etc/permissions/foo.xml",
7810 })
7811
7812 // The bar library should depend on the implementation jar.
7813 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007814 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007815 t.Errorf("expected %q, found %#q", expected, actual)
7816 }
7817}
7818
7819func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007820 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007821 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007822 apex {
7823 name: "myapex",
7824 key: "myapex.key",
7825 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007826 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007827 }
7828
7829 apex_key {
7830 name: "myapex.key",
7831 public_key: "testkey.avbpubkey",
7832 private_key: "testkey.pem",
7833 }
7834
7835 java_sdk_library {
7836 name: "foo",
7837 srcs: ["a.java"],
7838 api_packages: ["foo"],
7839 apex_available: ["myapex"],
7840 sdk_version: "none",
7841 system_modules: "none",
7842 }
7843
7844 java_library {
7845 name: "bar",
7846 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007847 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007848 sdk_version: "none",
7849 system_modules: "none",
7850 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007851
7852 prebuilt_apis {
7853 name: "sdk",
7854 api_dirs: ["100"],
7855 }
Paul Duffin9b879592020-05-26 13:21:35 +01007856 `, withFiles(filesForSdkLibrary))
7857
7858 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007859 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007860 "javalib/foo.jar",
7861 "etc/permissions/foo.xml",
7862 })
7863
7864 // The bar library should depend on the stubs jar.
7865 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007866 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007867 t.Errorf("expected %q, found %#q", expected, actual)
7868 }
7869}
7870
Paul Duffineedc5d52020-06-12 17:46:39 +01007871func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007872 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007873 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007874 prebuilt_apis {
7875 name: "sdk",
7876 api_dirs: ["100"],
7877 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007878 withFiles(map[string][]byte{
7879 "apex/a.java": nil,
7880 "apex/apex_manifest.json": nil,
7881 "apex/Android.bp": []byte(`
7882 package {
7883 default_visibility: ["//visibility:private"],
7884 }
7885
7886 apex {
7887 name: "myapex",
7888 key: "myapex.key",
7889 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007890 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007891 }
7892
7893 apex_key {
7894 name: "myapex.key",
7895 public_key: "testkey.avbpubkey",
7896 private_key: "testkey.pem",
7897 }
7898
7899 java_library {
7900 name: "bar",
7901 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007902 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007903 apex_available: ["myapex"],
7904 sdk_version: "none",
7905 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007906 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007907 }
7908`),
7909 "source/a.java": nil,
7910 "source/api/current.txt": nil,
7911 "source/api/removed.txt": nil,
7912 "source/Android.bp": []byte(`
7913 package {
7914 default_visibility: ["//visibility:private"],
7915 }
7916
7917 java_sdk_library {
7918 name: "foo",
7919 visibility: ["//apex"],
7920 srcs: ["a.java"],
7921 api_packages: ["foo"],
7922 apex_available: ["myapex"],
7923 sdk_version: "none",
7924 system_modules: "none",
7925 public: {
7926 enabled: true,
7927 },
Colin Crosse4f34882024-11-14 12:26:00 -08007928 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007929 }
7930`),
7931 "prebuilt/a.jar": nil,
7932 "prebuilt/Android.bp": []byte(`
7933 package {
7934 default_visibility: ["//visibility:private"],
7935 }
7936
7937 java_sdk_library_import {
7938 name: "foo",
7939 visibility: ["//apex", "//source"],
7940 apex_available: ["myapex"],
7941 prefer: true,
7942 public: {
7943 jars: ["a.jar"],
7944 },
Colin Crosse4f34882024-11-14 12:26:00 -08007945 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007946 }
7947`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007948 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007949 )
7950
7951 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007952 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007953 "javalib/bar.jar",
7954 "javalib/foo.jar",
7955 "etc/permissions/foo.xml",
7956 })
7957
7958 // The bar library should depend on the implementation jar.
7959 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007960 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007961 t.Errorf("expected %q, found %#q", expected, actual)
7962 }
7963}
7964
7965func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007966 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007967 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7968 apex {
7969 name: "myapex",
7970 key: "myapex.key",
7971 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007972 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007973 }
7974
7975 apex_key {
7976 name: "myapex.key",
7977 public_key: "testkey.avbpubkey",
7978 private_key: "testkey.pem",
7979 }
7980
7981 java_sdk_library_import {
7982 name: "foo",
7983 apex_available: ["myapex"],
7984 prefer: true,
7985 public: {
7986 jars: ["a.jar"],
7987 },
7988 }
7989
7990 `, withFiles(filesForSdkLibrary))
7991}
7992
atrost6e126252020-01-27 17:01:16 +00007993func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007994 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007995 result := android.GroupFixturePreparers(
7996 prepareForApexTest,
7997 java.PrepareForTestWithPlatformCompatConfig,
7998 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007999 apex {
8000 name: "myapex",
8001 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008002 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008003 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008004 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008005 }
8006
8007 apex_key {
8008 name: "myapex.key",
8009 public_key: "testkey.avbpubkey",
8010 private_key: "testkey.pem",
8011 }
8012
8013 platform_compat_config {
8014 name: "myjar-platform-compat-config",
8015 src: ":myjar",
8016 }
8017
8018 java_library {
8019 name: "myjar",
8020 srcs: ["foo/bar/MyClass.java"],
8021 sdk_version: "none",
8022 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008023 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008024 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008025 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008026
8027 // Make sure that a preferred prebuilt does not affect the apex contents.
8028 prebuilt_platform_compat_config {
8029 name: "myjar-platform-compat-config",
8030 metadata: "compat-config/metadata.xml",
8031 prefer: true,
8032 }
atrost6e126252020-01-27 17:01:16 +00008033 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008034 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008035 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008036 "etc/compatconfig/myjar-platform-compat-config.xml",
8037 "javalib/myjar.jar",
8038 })
8039}
8040
Jooyung Han862c0d62022-12-21 10:15:37 +09008041func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008042 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008043 android.GroupFixturePreparers(
8044 android.PrepareForTestWithAndroidBuildComponents,
8045 PrepareForTestWithApexBuildComponents,
8046 prepareForTestWithMyapex,
8047 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8048 ).
8049 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8050 RunTestWithBp(t, `
8051 apex {
8052 name: "myapex",
8053 key: "myapex.key",
8054 prebuilts: ["foo", "bar"],
8055 updatable: false,
8056 }
8057
8058 apex_key {
8059 name: "myapex.key",
8060 public_key: "testkey.avbpubkey",
8061 private_key: "testkey.pem",
8062 }
8063
8064 prebuilt_etc {
8065 name: "foo",
8066 src: "myprebuilt",
8067 filename_from_src: true,
8068 }
8069
8070 prebuilt_etc {
8071 name: "bar",
8072 src: "myprebuilt",
8073 filename_from_src: true,
8074 }
8075 `)
8076}
8077
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008078func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008079 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008080 bp := `
8081 apex {
8082 name: "myapex",
8083 key: "myapex.key",
8084 native_shared_libs: ["libfoo"],
8085 updatable: false,
8086 unwanted_transitive_deps: ["libbar"],
8087 }
8088
8089 apex_key {
8090 name: "myapex.key",
8091 public_key: "testkey.avbpubkey",
8092 private_key: "testkey.pem",
8093 }
8094
8095 cc_library {
8096 name: "libfoo",
8097 srcs: ["foo.cpp"],
8098 shared_libs: ["libbar"],
8099 apex_available: ["myapex"],
8100 }
8101
8102 cc_library {
8103 name: "libbar",
8104 srcs: ["bar.cpp"],
8105 apex_available: ["myapex"],
8106 }`
8107 ctx := testApex(t, bp)
8108 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8109 "*/libc++.so",
8110 "*/libfoo.so",
8111 // not libbar.so
8112 })
8113}
8114
Jiyong Park479321d2019-12-16 11:47:12 +09008115func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008116 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008117 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8118 apex {
8119 name: "myapex",
8120 key: "myapex.key",
8121 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008122 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008123 }
8124
8125 apex_key {
8126 name: "myapex.key",
8127 public_key: "testkey.avbpubkey",
8128 private_key: "testkey.pem",
8129 }
8130
8131 java_library {
8132 name: "myjar",
8133 srcs: ["foo/bar/MyClass.java"],
8134 sdk_version: "none",
8135 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008136 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008137 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008138 }
8139 `)
8140}
8141
Jiyong Park7cd10e32020-01-14 09:22:18 +09008142func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008143 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008144 bp := `
8145 apex {
8146 name: "myapex",
8147 key: "myapex.key",
8148 native_shared_libs: ["mylib"],
8149 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008150 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008151 }
8152
Jiyong Park9d677202020-02-19 16:29:35 +09008153 apex {
8154 name: "myapex.updatable",
8155 key: "myapex.key",
8156 native_shared_libs: ["mylib"],
8157 java_libs: ["myjar"],
8158 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008159 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008160 }
8161
Jiyong Park7cd10e32020-01-14 09:22:18 +09008162 apex_key {
8163 name: "myapex.key",
8164 public_key: "testkey.avbpubkey",
8165 private_key: "testkey.pem",
8166 }
8167
8168 cc_library {
8169 name: "mylib",
8170 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008171 shared_libs: [
8172 "myotherlib",
8173 "myotherlib_ext",
8174 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008175 system_shared_libs: [],
8176 stl: "none",
8177 apex_available: [
8178 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008179 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008180 "//apex_available:platform",
8181 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008182 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008183 }
8184
8185 cc_library {
8186 name: "myotherlib",
8187 srcs: ["mylib.cpp"],
8188 system_shared_libs: [],
8189 stl: "none",
8190 apex_available: [
8191 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008192 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008193 "//apex_available:platform",
8194 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008195 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008196 }
8197
Jiyong Parkce243632023-02-17 18:22:25 +09008198 cc_library {
8199 name: "myotherlib_ext",
8200 srcs: ["mylib.cpp"],
8201 system_shared_libs: [],
8202 system_ext_specific: true,
8203 stl: "none",
8204 apex_available: [
8205 "myapex",
8206 "myapex.updatable",
8207 "//apex_available:platform",
8208 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008209 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008210 }
8211
Jiyong Park7cd10e32020-01-14 09:22:18 +09008212 java_library {
8213 name: "myjar",
8214 srcs: ["foo/bar/MyClass.java"],
8215 sdk_version: "none",
8216 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008217 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008218 apex_available: [
8219 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008220 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008221 "//apex_available:platform",
8222 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008223 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008224 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008225 }
8226
8227 java_library {
8228 name: "myotherjar",
8229 srcs: ["foo/bar/MyClass.java"],
8230 sdk_version: "none",
8231 system_modules: "none",
8232 apex_available: [
8233 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008234 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008235 "//apex_available:platform",
8236 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008237 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008238 }
8239 `
8240
8241 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8242 for _, f := range files {
8243 if f.path == file {
8244 if f.isLink {
8245 t.Errorf("%q is not a real file", file)
8246 }
8247 return
8248 }
8249 }
8250 t.Errorf("%q is not found", file)
8251 }
8252
Jiyong Parkce243632023-02-17 18:22:25 +09008253 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008254 for _, f := range files {
8255 if f.path == file {
8256 if !f.isLink {
8257 t.Errorf("%q is not a symlink", file)
8258 }
Jiyong Parkce243632023-02-17 18:22:25 +09008259 if f.src != target {
8260 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8261 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008262 return
8263 }
8264 }
8265 t.Errorf("%q is not found", file)
8266 }
8267
Jiyong Park9d677202020-02-19 16:29:35 +09008268 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8269 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008270 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008271 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008272 ensureRealfileExists(t, files, "javalib/myjar.jar")
8273 ensureRealfileExists(t, files, "lib64/mylib.so")
8274 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008275 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008276
Jooyung Hana0503a52023-08-23 13:12:50 +09008277 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008278 ensureRealfileExists(t, files, "javalib/myjar.jar")
8279 ensureRealfileExists(t, files, "lib64/mylib.so")
8280 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008281 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008282
8283 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008284 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008285 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008286 ensureRealfileExists(t, files, "javalib/myjar.jar")
8287 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008288 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8289 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008290
Jooyung Hana0503a52023-08-23 13:12:50 +09008291 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008292 ensureRealfileExists(t, files, "javalib/myjar.jar")
8293 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008294 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8295 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008296}
8297
Yo Chiange8128052020-07-23 20:09:18 +08008298func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008299 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008300 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008301 apex {
8302 name: "myapex",
8303 key: "myapex.key",
8304 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008305 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008306 }
8307
8308 apex_key {
8309 name: "myapex.key",
8310 public_key: "testkey.avbpubkey",
8311 private_key: "testkey.pem",
8312 }
8313
8314 cc_library_shared {
8315 name: "mylib",
8316 srcs: ["mylib.cpp"],
8317 shared_libs: ["myotherlib"],
8318 system_shared_libs: [],
8319 stl: "none",
8320 apex_available: [
8321 "myapex",
8322 "//apex_available:platform",
8323 ],
8324 }
8325
8326 cc_prebuilt_library_shared {
8327 name: "myotherlib",
8328 srcs: ["prebuilt.so"],
8329 system_shared_libs: [],
8330 stl: "none",
8331 apex_available: [
8332 "myapex",
8333 "//apex_available:platform",
8334 ],
8335 }
8336 `)
8337
Jooyung Hana0503a52023-08-23 13:12:50 +09008338 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008339 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008340 var builder strings.Builder
8341 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8342 androidMk := builder.String()
8343 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008344 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008345 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8346 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8347 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008348 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008349}
8350
Jooyung Han643adc42020-02-27 13:50:06 +09008351func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008352 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008353 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008354 apex {
8355 name: "myapex",
8356 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008357 binaries: ["mybin"],
8358 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008359 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008360 }
8361
8362 apex_key {
8363 name: "myapex.key",
8364 public_key: "testkey.avbpubkey",
8365 private_key: "testkey.pem",
8366 }
8367
8368 cc_library {
8369 name: "mylib",
8370 srcs: ["mylib.cpp"],
8371 shared_libs: ["mylib2"],
8372 system_shared_libs: [],
8373 stl: "none",
8374 apex_available: [ "myapex" ],
8375 }
8376
8377 cc_library {
8378 name: "mylib2",
8379 srcs: ["mylib.cpp"],
8380 system_shared_libs: [],
8381 stl: "none",
8382 apex_available: [ "myapex" ],
8383 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008384
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008385 // Used as both a JNI library and a regular shared library.
8386 cc_library {
8387 name: "mylib3",
8388 srcs: ["mylib.cpp"],
8389 system_shared_libs: [],
8390 stl: "none",
8391 apex_available: [ "myapex" ],
8392 }
8393
8394 cc_binary {
8395 name: "mybin",
8396 srcs: ["mybin.cpp"],
8397 shared_libs: ["mylib3"],
8398 system_shared_libs: [],
8399 stl: "none",
8400 apex_available: [ "myapex" ],
8401 }
8402
Jiyong Park34d5c332022-02-24 18:02:44 +09008403 rust_ffi_shared {
8404 name: "libfoo.rust",
8405 crate_name: "foo",
8406 srcs: ["foo.rs"],
8407 shared_libs: ["libfoo.shared_from_rust"],
8408 prefer_rlib: true,
8409 apex_available: ["myapex"],
8410 }
8411
8412 cc_library_shared {
8413 name: "libfoo.shared_from_rust",
8414 srcs: ["mylib.cpp"],
8415 system_shared_libs: [],
8416 stl: "none",
8417 stubs: {
8418 versions: ["10", "11", "12"],
8419 },
8420 }
8421
Jooyung Han643adc42020-02-27 13:50:06 +09008422 `)
8423
Jooyung Hana0503a52023-08-23 13:12:50 +09008424 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008425 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008426 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008427 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008428 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008429 "lib64/mylib.so",
8430 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008431 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008432 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008433 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008434
8435 // b/220397949
8436 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008437}
8438
Jooyung Han49f67012020-04-17 13:43:10 +09008439func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008440 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008441 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008442 apex {
8443 name: "myapex",
8444 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008445 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008446 }
8447 apex_key {
8448 name: "myapex.key",
8449 public_key: "testkey.avbpubkey",
8450 private_key: "testkey.pem",
8451 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008452 `,
8453 android.FixtureModifyConfig(func(config android.Config) {
8454 delete(config.Targets, android.Android)
8455 config.AndroidCommonTarget = android.Target{}
8456 }),
8457 )
Jooyung Han49f67012020-04-17 13:43:10 +09008458
8459 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8460 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8461 }
8462}
8463
Jiyong Parkbd159612020-02-28 15:22:21 +09008464func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008465 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008466 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008467 apex {
8468 name: "myapex",
8469 key: "myapex.key",
8470 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008471 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008472 }
8473
8474 apex_key {
8475 name: "myapex.key",
8476 public_key: "testkey.avbpubkey",
8477 private_key: "testkey.pem",
8478 }
8479
8480 android_app {
8481 name: "AppFoo",
8482 srcs: ["foo/bar/MyClass.java"],
8483 sdk_version: "none",
8484 system_modules: "none",
8485 apex_available: [ "myapex" ],
8486 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008487 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008488
Jooyung Hana0503a52023-08-23 13:12:50 +09008489 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008490 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008491
8492 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008493 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 +09008494}
8495
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008496func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008497 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008498 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008499 apex {
8500 name: "myapex",
8501 key: "myapex.key",
8502 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008503 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008504 }
8505
8506 apex_key {
8507 name: "myapex.key",
8508 public_key: "testkey.avbpubkey",
8509 private_key: "testkey.pem",
8510 }
8511
8512 android_app_set {
8513 name: "AppSet",
8514 set: "AppSet.apks",
8515 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008516 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008517 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008518 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008519 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8520 s := mod.Rule("apexRule").Args["copy_commands"]
8521 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008522 if len(copyCmds) != 4 {
8523 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008524 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008525 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8526 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008527 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8528 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008529
8530 // Ensure that canned_fs_config has an entry for the app set zip file
8531 generateFsRule := mod.Rule("generateFsConfig")
8532 cmd := generateFsRule.RuleParams.Command
8533 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008534}
8535
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008536func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008537 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008538 apex_set {
8539 name: "myapex",
8540 filename: "foo_v2.apex",
8541 sanitized: {
8542 none: { set: "myapex.apks", },
8543 hwaddress: { set: "myapex.hwasan.apks", },
8544 },
Paul Duffin24704672021-04-06 16:09:30 +01008545 }
8546 `
8547 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008548
Paul Duffin24704672021-04-06 16:09:30 +01008549 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008550 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008551
Spandan Das9d6e2092024-09-21 02:50:00 +00008552 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008553 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008554
Paul Duffin24704672021-04-06 16:09:30 +01008555 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8556
8557 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008558 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8559 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008560
8561 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008562}
8563
Pranav Guptaeba03b02022-09-27 00:27:08 +00008564func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008565 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008566 ctx := testApex(t, `
8567 apex_set {
8568 name: "myapex",
8569 set: ":myapex_apks_file",
8570 }
8571
8572 filegroup {
8573 name: "myapex_apks_file",
8574 srcs: ["myapex.apks"],
8575 }
8576 `)
8577
Spandan Das9d6e2092024-09-21 02:50:00 +00008578 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008579
8580 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008581 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008582 extractedApex := m.Output(extractorOutput)
8583
8584 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8585}
8586
Paul Duffin89f570a2021-06-16 01:42:33 +01008587func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008588 t.Helper()
8589
Paul Duffin55607122021-03-30 23:32:51 +01008590 fs := android.MockFS{
8591 "a.java": nil,
8592 "a.jar": nil,
8593 "apex_manifest.json": nil,
8594 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008595 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008596 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8597 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8598 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008599 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008600 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008601
Paul Duffin55607122021-03-30 23:32:51 +01008602 errorHandler := android.FixtureExpectsNoErrors
8603 if errmsg != "" {
8604 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008605 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008606
Paul Duffin55607122021-03-30 23:32:51 +01008607 result := android.GroupFixturePreparers(
8608 cc.PrepareForTestWithCcDefaultModules,
8609 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008610 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008611 java.PrepareForTestWithJavaSdkLibraryFiles,
8612 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008613 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008614 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008615 android.FixtureModifyMockFS(func(fs android.MockFS) {
8616 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8617 insert := ""
8618 for _, fragment := range fragments {
8619 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8620 }
8621 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8622 platform_bootclasspath {
8623 name: "platform-bootclasspath",
8624 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008625 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008626 %s
8627 ],
8628 }
8629 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008630 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008631 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008632 // Dexpreopt for boot jars requires the ART boot image profile.
8633 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8634 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008635 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008636 ).
8637 ExtendWithErrorHandler(errorHandler).
8638 RunTestWithBp(t, bp)
8639
8640 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008641}
8642
Jooyung Han548640b2020-04-27 12:10:30 +09008643func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008644 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008645 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8646 apex {
8647 name: "myapex",
8648 key: "myapex.key",
8649 updatable: true,
8650 }
8651
8652 apex_key {
8653 name: "myapex.key",
8654 public_key: "testkey.avbpubkey",
8655 private_key: "testkey.pem",
8656 }
8657 `)
8658}
8659
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008660func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008661 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008662 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8663 apex {
8664 name: "myapex",
8665 key: "myapex.key",
8666 }
8667
8668 apex_key {
8669 name: "myapex.key",
8670 public_key: "testkey.avbpubkey",
8671 private_key: "testkey.pem",
8672 }
8673 `)
8674}
8675
satayevb98371c2021-06-15 16:49:50 +01008676func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008677 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008678 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8679 apex {
8680 name: "myapex",
8681 key: "myapex.key",
8682 systemserverclasspath_fragments: [
8683 "mysystemserverclasspathfragment",
8684 ],
8685 min_sdk_version: "29",
8686 updatable: true,
8687 }
8688
8689 apex_key {
8690 name: "myapex.key",
8691 public_key: "testkey.avbpubkey",
8692 private_key: "testkey.pem",
8693 }
8694
8695 java_library {
8696 name: "foo",
8697 srcs: ["b.java"],
8698 min_sdk_version: "29",
8699 installable: true,
8700 apex_available: [
8701 "myapex",
8702 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008703 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008704 }
8705
8706 systemserverclasspath_fragment {
8707 name: "mysystemserverclasspathfragment",
8708 generate_classpaths_proto: false,
8709 contents: [
8710 "foo",
8711 ],
8712 apex_available: [
8713 "myapex",
8714 ],
8715 }
satayevabcd5972021-08-06 17:49:46 +01008716 `,
8717 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8718 )
satayevb98371c2021-06-15 16:49:50 +01008719}
8720
Paul Duffin064b70c2020-11-02 17:32:38 +00008721func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008722 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008723 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008724 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008725 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008726 fragment := java.ApexVariantReference{
8727 Apex: proptools.StringPtr("myapex"),
8728 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8729 }
8730
Paul Duffin064b70c2020-11-02 17:32:38 +00008731 testDexpreoptWithApexes(t, `
8732 prebuilt_apex {
8733 name: "myapex" ,
8734 arch: {
8735 arm64: {
8736 src: "myapex-arm64.apex",
8737 },
8738 arm: {
8739 src: "myapex-arm.apex",
8740 },
8741 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008742 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8743 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008744
Paul Duffin89f570a2021-06-16 01:42:33 +01008745 prebuilt_bootclasspath_fragment {
8746 name: "my-bootclasspath-fragment",
8747 contents: ["libfoo"],
8748 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008749 hidden_api: {
8750 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8751 metadata: "my-bootclasspath-fragment/metadata.csv",
8752 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008753 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8754 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8755 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008756 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008757 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008758
Spandan Das52c01a12024-09-20 01:09:48 +00008759 java_sdk_library_import {
8760 name: "libfoo",
8761 prefer: true,
8762 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008763 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008764 },
8765 apex_available: ["myapex"],
8766 shared_library: false,
8767 permitted_packages: ["libfoo"],
8768 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008769 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008770 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008771}
8772
Spandan Dasf14e2542021-11-12 00:01:37 +00008773func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008774 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008775 bp += `
8776 apex_key {
8777 name: "myapex.key",
8778 public_key: "testkey.avbpubkey",
8779 private_key: "testkey.pem",
8780 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008781 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008782 "lib1/src/A.java": nil,
8783 "lib2/src/B.java": nil,
8784 "system/sepolicy/apex/myapex-file_contexts": nil,
8785 }
8786
Paul Duffin45338f02021-03-30 23:07:52 +01008787 errorHandler := android.FixtureExpectsNoErrors
8788 if errmsg != "" {
8789 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008790 }
Colin Crossae8600b2020-10-29 17:09:13 -07008791
Paul Duffin45338f02021-03-30 23:07:52 +01008792 android.GroupFixturePreparers(
8793 android.PrepareForTestWithAndroidBuildComponents,
8794 java.PrepareForTestWithJavaBuildComponents,
8795 PrepareForTestWithApexBuildComponents,
8796 android.PrepareForTestWithNeverallowRules(rules),
8797 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008798 apexBootJars := make([]string, 0, len(bootJars))
8799 for _, apexBootJar := range bootJars {
8800 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008801 }
satayevd604b212021-07-21 14:23:52 +01008802 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008803 }),
8804 fs.AddToFixture(),
8805 ).
8806 ExtendWithErrorHandler(errorHandler).
8807 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008808}
8809
8810func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008811 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008812 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008813 name string
8814 expectedError string
8815 bp string
8816 bootJars []string
8817 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008818 }{
8819
8820 {
8821 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8822 expectedError: "",
8823 bp: `
8824 java_library {
8825 name: "bcp_lib1",
8826 srcs: ["lib1/src/*.java"],
8827 permitted_packages: ["foo.bar"],
8828 apex_available: ["myapex"],
8829 sdk_version: "none",
8830 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008831 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008832 }
8833 java_library {
8834 name: "nonbcp_lib2",
8835 srcs: ["lib2/src/*.java"],
8836 apex_available: ["myapex"],
8837 permitted_packages: ["a.b"],
8838 sdk_version: "none",
8839 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008840 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008841 }
8842 apex {
8843 name: "myapex",
8844 key: "myapex.key",
8845 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008846 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008847 }`,
8848 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008849 bcpPermittedPackages: map[string][]string{
8850 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008851 "foo.bar",
8852 },
8853 },
8854 },
8855 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008856 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008857 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 +01008858 bp: `
8859 java_library {
8860 name: "bcp_lib1",
8861 srcs: ["lib1/src/*.java"],
8862 apex_available: ["myapex"],
8863 permitted_packages: ["foo.bar"],
8864 sdk_version: "none",
8865 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008866 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008867 }
8868 java_library {
8869 name: "bcp_lib2",
8870 srcs: ["lib2/src/*.java"],
8871 apex_available: ["myapex"],
8872 permitted_packages: ["foo.bar", "bar.baz"],
8873 sdk_version: "none",
8874 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008875 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008876 }
8877 apex {
8878 name: "myapex",
8879 key: "myapex.key",
8880 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008881 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008882 }
8883 `,
8884 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008885 bcpPermittedPackages: map[string][]string{
8886 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008887 "foo.bar",
8888 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008889 "bcp_lib2": []string{
8890 "foo.bar",
8891 },
8892 },
8893 },
8894 {
8895 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8896 expectedError: "",
8897 bp: `
8898 java_library {
8899 name: "bcp_lib_restricted",
8900 srcs: ["lib1/src/*.java"],
8901 apex_available: ["myapex"],
8902 permitted_packages: ["foo.bar"],
8903 sdk_version: "none",
8904 min_sdk_version: "29",
8905 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008906 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008907 }
8908 java_library {
8909 name: "bcp_lib_unrestricted",
8910 srcs: ["lib2/src/*.java"],
8911 apex_available: ["myapex"],
8912 permitted_packages: ["foo.bar", "bar.baz"],
8913 sdk_version: "none",
8914 min_sdk_version: "29",
8915 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008916 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008917 }
8918 apex {
8919 name: "myapex",
8920 key: "myapex.key",
8921 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8922 updatable: true,
8923 min_sdk_version: "29",
8924 }
8925 `,
8926 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8927 bcpPermittedPackages: map[string][]string{
8928 "bcp_lib1_non_updateable": []string{
8929 "foo.bar",
8930 },
8931 // 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 +01008932 },
8933 },
8934 }
8935 for _, tc := range testcases {
8936 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008937 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008938 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8939 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008940 })
8941 }
8942}
8943
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008944// TODO(jungjw): Move this to proptools
8945func intPtr(i int) *int {
8946 return &i
8947}
8948
8949func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008950 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008951 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008952 apex_set {
8953 name: "myapex",
8954 set: "myapex.apks",
8955 filename: "foo_v2.apex",
8956 overrides: ["foo"],
8957 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008958 `,
8959 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8960 variables.Platform_sdk_version = intPtr(30)
8961 }),
8962 android.FixtureModifyConfig(func(config android.Config) {
8963 config.Targets[android.Android] = []android.Target{
8964 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8965 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8966 }
8967 }),
8968 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008969
Spandan Das9d6e2092024-09-21 02:50:00 +00008970 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008971
8972 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008973 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008974 actual := extractedApex.Args["abis"]
8975 expected := "ARMEABI_V7A,ARM64_V8A"
8976 if actual != expected {
8977 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8978 }
8979 actual = extractedApex.Args["sdk-version"]
8980 expected = "30"
8981 if actual != expected {
8982 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8983 }
8984
Paul Duffin6717d882021-06-15 19:09:41 +01008985 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008986 a := m.Module().(*ApexSet)
8987 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008988 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008989 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8990 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8991 }
8992}
8993
Anton Hansson805e0a52022-11-25 14:06:46 +00008994func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008995 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008996 ctx := testApex(t, `
8997 apex_set {
8998 name: "myapex",
8999 set: "myapex.apks",
9000 filename: "foo_v2.apex",
9001 overrides: ["foo"],
9002 }
9003 `,
9004 android.FixtureModifyConfig(func(config android.Config) {
9005 config.Targets[android.Android] = []android.Target{
9006 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9007 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9008 }
9009 }),
9010 )
9011
Spandan Das9d6e2092024-09-21 02:50:00 +00009012 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009013
9014 // Check extract_apks tool parameters. No native bridge arch expected
9015 extractedApex := m.Output("extracted/myapex.apks")
9016 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9017}
9018
Jiyong Park7d95a512020-05-10 15:16:24 +09009019func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009020 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009021 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9022 apex {
9023 name: "myapex",
9024 key: "myapex.key",
9025 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009026 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009027 }
9028
9029 apex_key {
9030 name: "myapex.key",
9031 public_key: "testkey.avbpubkey",
9032 private_key: "testkey.pem",
9033 }
9034
9035 cc_library {
9036 name: "mylib",
9037 srcs: ["mylib.cpp"],
9038 static_libs: ["otherlib"],
9039 system_shared_libs: [],
9040 stl: "none",
9041 apex_available: [ "myapex" ],
9042 }
9043
9044 cc_library {
9045 name: "otherlib",
9046 srcs: ["mylib.cpp"],
9047 system_shared_libs: [],
9048 stl: "none",
9049 stubs: {
9050 versions: ["1", "2", "3"],
9051 },
9052 apex_available: [ "myapex" ],
9053 }
9054 `)
9055}
9056
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009057func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009058 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009059 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009060 apex {
9061 name: "myapex",
9062 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009063 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009064 custom_sign_tool: "sign_myapex",
9065 }
9066
9067 apex_key {
9068 name: "myapex.key",
9069 public_key: "testkey.avbpubkey",
9070 private_key: "testkey.pem",
9071 }
9072 `)
9073
Jooyung Han286957d2023-10-30 16:17:56 +09009074 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009075 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009076 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 +09009077}
9078
9079func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009080 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009081 ctx := testApex(t, `
9082 apex {
9083 name: "myapex",
9084 key: "myapex.key",
9085 updatable: false,
9086 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009087 }
9088
9089 apex_key {
9090 name: "myapex.key",
9091 public_key: "testkey.avbpubkey",
9092 private_key: "testkey.pem",
9093 }
9094
9095 prebuilt_apex {
9096 name: "myapex",
9097 prefer: true,
9098 arch: {
9099 arm64: {
9100 src: "myapex-arm64.apex",
9101 },
9102 arm: {
9103 src: "myapex-arm.apex",
9104 },
9105 },
9106 }
9107
9108 apex_set {
9109 name: "myapex_set",
9110 set: "myapex.apks",
9111 filename: "myapex_set.apex",
9112 overrides: ["myapex"],
9113 }
9114 `)
9115
Colin Crossf61d03d2023-11-02 16:56:39 -07009116 content := android.ContentFromFileRuleForTests(t, ctx,
9117 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009118 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 -07009119 content = android.ContentFromFileRuleForTests(t, ctx,
9120 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009121 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 +09009122}
9123
Jooyung Han938b5932020-06-20 12:47:47 +09009124func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009125 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009126 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009127 apex {
9128 name: "myapex",
9129 key: "myapex.key",
9130 apps: ["app"],
9131 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009132 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009133 }
9134
9135 apex_key {
9136 name: "myapex.key",
9137 public_key: "testkey.avbpubkey",
9138 private_key: "testkey.pem",
9139 }
9140
9141 android_app {
9142 name: "app",
9143 srcs: ["foo/bar/MyClass.java"],
9144 package_name: "foo",
9145 sdk_version: "none",
9146 system_modules: "none",
9147 apex_available: [ "myapex" ],
9148 }
9149 `, withFiles(map[string][]byte{
9150 "sub/Android.bp": []byte(`
9151 override_apex {
9152 name: "override_myapex",
9153 base: "myapex",
9154 apps: ["override_app"],
9155 allowed_files: ":allowed",
9156 }
9157 // Overridable "path" property should be referenced indirectly
9158 filegroup {
9159 name: "allowed",
9160 srcs: ["allowed.txt"],
9161 }
9162 override_android_app {
9163 name: "override_app",
9164 base: "app",
9165 package_name: "bar",
9166 }
9167 `),
9168 }))
9169
Jooyung Hana0503a52023-08-23 13:12:50 +09009170 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009171 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9172 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9173 }
9174
Spandan Das50801e22024-05-13 18:29:45 +00009175 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009176 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9177 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9178 }
9179}
9180
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009181func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009182 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009183 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009184 apex {
9185 name: "myapex",
9186 key: "myapex.key",
9187 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009188 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009189 }
9190
9191 apex_key {
9192 name: "myapex.key",
9193 public_key: "testkey.avbpubkey",
9194 private_key: "testkey.pem",
9195 }
9196
9197 cc_library {
9198 name: "mylib",
9199 srcs: ["mylib.cpp"],
9200 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009201 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009202 },
9203 apex_available: ["myapex"],
9204 }
9205
9206 cc_prebuilt_library_shared {
9207 name: "mylib",
9208 prefer: false,
9209 srcs: ["prebuilt.so"],
9210 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009211 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009212 },
9213 apex_available: ["myapex"],
9214 }
9215 `)
9216}
9217
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009218func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009219 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009220 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009221 apex {
9222 name: "myapex",
9223 key: "myapex.key",
9224 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009225 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009226 }
9227 apex_key {
9228 name: "myapex.key",
9229 public_key: "testkey.avbpubkey",
9230 private_key: "testkey.pem",
9231 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009232 `,
9233 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9234 variables.CompressedApex = proptools.BoolPtr(true)
9235 }),
9236 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009237
Jooyung Hana0503a52023-08-23 13:12:50 +09009238 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009239 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9240
Jooyung Hana0503a52023-08-23 13:12:50 +09009241 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009242 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9243
9244 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009245 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009246 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9247
9248 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009249 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009250 var builder strings.Builder
9251 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9252 androidMk := builder.String()
9253 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9254}
9255
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009256func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9257 t.Parallel()
9258 ctx := testApex(t, `
9259 apex {
9260 name: "myapex",
9261 key: "myapex.key",
9262 compressible: true,
9263 updatable: false,
9264 payload_fs_type: "erofs",
9265 }
9266 apex_key {
9267 name: "myapex.key",
9268 public_key: "testkey.avbpubkey",
9269 private_key: "testkey.pem",
9270 }
9271 `,
9272 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9273 variables.CompressedApex = proptools.BoolPtr(true)
9274 }),
9275 )
9276
9277 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9278 if compressRule.Rule != nil {
9279 t.Error("erofs apex should not be compressed")
9280 }
9281}
9282
Jooyung Han26ec8482024-07-31 15:04:05 +09009283func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009284 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009285 for _, compressionEnabled := range []bool{true, false} {
9286 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009287 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009288 ctx := testApex(t, `
9289 apex_set {
9290 name: "com.company.android.myapex",
9291 apex_name: "com.android.myapex",
9292 set: "company-myapex.apks",
9293 }
9294 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9295 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9296 }),
9297 )
9298
9299 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9300 if compressionEnabled {
9301 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9302 } else {
9303 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9304 }
9305 })
9306 }
9307}
9308
Martin Stjernholm2856c662020-12-02 15:03:42 +00009309func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009310 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009311 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009312 apex {
9313 name: "myapex",
9314 key: "myapex.key",
9315 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009316 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009317 }
9318
9319 apex_key {
9320 name: "myapex.key",
9321 public_key: "testkey.avbpubkey",
9322 private_key: "testkey.pem",
9323 }
9324
9325 cc_library {
9326 name: "mylib",
9327 srcs: ["mylib.cpp"],
9328 apex_available: ["myapex"],
9329 shared_libs: ["otherlib"],
9330 system_shared_libs: [],
9331 }
9332
9333 cc_library {
9334 name: "otherlib",
9335 srcs: ["mylib.cpp"],
9336 stubs: {
9337 versions: ["current"],
9338 },
9339 }
9340
9341 cc_prebuilt_library_shared {
9342 name: "otherlib",
9343 prefer: true,
9344 srcs: ["prebuilt.so"],
9345 stubs: {
9346 versions: ["current"],
9347 },
9348 }
9349 `)
9350
Jooyung Hana0503a52023-08-23 13:12:50 +09009351 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009352 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009353 var builder strings.Builder
9354 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9355 androidMk := builder.String()
9356
9357 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9358 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009359 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009360}
9361
Jiyong Parke3867542020-12-03 17:28:25 +09009362func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009363 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009364 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009365 apex {
9366 name: "myapex",
9367 key: "myapex.key",
9368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009369 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009370 }
9371
9372 apex_key {
9373 name: "myapex.key",
9374 public_key: "testkey.avbpubkey",
9375 private_key: "testkey.pem",
9376 }
9377
9378 cc_library {
9379 name: "mylib",
9380 srcs: ["mylib.cpp"],
9381 system_shared_libs: [],
9382 stl: "none",
9383 apex_available: ["myapex"],
9384 shared_libs: ["mylib2"],
9385 target: {
9386 apex: {
9387 exclude_shared_libs: ["mylib2"],
9388 },
9389 },
9390 }
9391
9392 cc_library {
9393 name: "mylib2",
9394 srcs: ["mylib.cpp"],
9395 system_shared_libs: [],
9396 stl: "none",
9397 }
9398 `)
9399
9400 // Check if mylib is linked to mylib2 for the non-apex target
9401 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9402 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9403
9404 // Make sure that the link doesn't occur for the apex target
9405 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9406 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9407
9408 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009409 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009410 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9411}
9412
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009413func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009414 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009415 bpBase := `
9416 apex {
9417 name: "myapex",
9418 key: "myapex.key",
9419 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009420 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009421 }
9422 apex_key {
9423 name: "myapex.key",
9424 public_key: "testkey.avbpubkey",
9425 private_key: "testkey.pem",
9426 }
9427 cc_library {
9428 name: "mylib",
9429 srcs: ["mylib.cpp"],
9430 apex_available: ["myapex"],
9431 shared_libs: ["stublib"],
9432 system_shared_libs: [],
9433 }
9434 apex {
9435 name: "otherapex",
9436 enabled: %s,
9437 key: "myapex.key",
9438 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009439 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009440 }
9441 `
9442
9443 stublibSourceBp := `
9444 cc_library {
9445 name: "stublib",
9446 srcs: ["mylib.cpp"],
9447 apex_available: ["otherapex"],
9448 system_shared_libs: [],
9449 stl: "none",
9450 stubs: {
9451 versions: ["1"],
9452 },
9453 }
9454 `
9455
9456 stublibPrebuiltBp := `
9457 cc_prebuilt_library_shared {
9458 name: "stublib",
9459 srcs: ["prebuilt.so"],
9460 apex_available: ["otherapex"],
9461 stubs: {
9462 versions: ["1"],
9463 },
9464 %s
9465 }
9466 `
9467
9468 tests := []struct {
9469 name string
9470 stublibBp string
9471 usePrebuilt bool
9472 modNames []string // Modules to collect AndroidMkEntries for
9473 otherApexEnabled []string
9474 }{
9475 {
9476 name: "only_source",
9477 stublibBp: stublibSourceBp,
9478 usePrebuilt: false,
9479 modNames: []string{"stublib"},
9480 otherApexEnabled: []string{"true", "false"},
9481 },
9482 {
9483 name: "source_preferred",
9484 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9485 usePrebuilt: false,
9486 modNames: []string{"stublib", "prebuilt_stublib"},
9487 otherApexEnabled: []string{"true", "false"},
9488 },
9489 {
9490 name: "prebuilt_preferred",
9491 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9492 usePrebuilt: true,
9493 modNames: []string{"stublib", "prebuilt_stublib"},
9494 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9495 },
9496 {
9497 name: "only_prebuilt",
9498 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9499 usePrebuilt: true,
9500 modNames: []string{"stublib"},
9501 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9502 },
9503 }
9504
9505 for _, test := range tests {
9506 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009507 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009508 for _, otherApexEnabled := range test.otherApexEnabled {
9509 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009510 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009511 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009512
9513 type modAndMkEntries struct {
9514 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009515 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009516 }
9517 entries := []*modAndMkEntries{}
9518
9519 // Gather shared lib modules that are installable
9520 for _, modName := range test.modNames {
9521 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9522 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9523 continue
9524 }
9525 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009526 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009527 continue
9528 }
Yu Liue70976d2024-10-15 20:45:35 +00009529 info := android.AndroidMkInfoForTest(t, ctx, mod)
9530 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9531 ents = append(ents, info.ExtraInfo...)
9532 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009533 if ent.Disabled {
9534 continue
9535 }
9536 entries = append(entries, &modAndMkEntries{
9537 mod: mod,
9538 mkEntries: ent,
9539 })
9540 }
9541 }
9542 }
9543
9544 var entry *modAndMkEntries = nil
9545 for _, ent := range entries {
9546 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9547 if entry != nil {
9548 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9549 } else {
9550 entry = ent
9551 }
9552 }
9553 }
9554
9555 if entry == nil {
9556 t.Errorf("AndroidMk entry for \"stublib\" missing")
9557 } else {
9558 isPrebuilt := entry.mod.Prebuilt() != nil
9559 if isPrebuilt != test.usePrebuilt {
9560 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9561 }
9562 if !entry.mod.IsStubs() {
9563 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9564 }
9565 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9566 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9567 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009568 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009569 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009570 if !android.InList(expected, cflags) {
9571 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9572 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009573 }
9574 })
9575 }
9576 })
9577 }
9578}
9579
Colin Crossc33e5212021-05-25 18:16:02 -07009580func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009581 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009582 bp := `
9583 apex {
9584 name: "myapex",
9585 key: "myapex.key",
9586 java_libs: ["mylib"],
9587 bootclasspath_fragments: ["mybootclasspathfragment"],
9588 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9589 updatable: false,
9590 }
9591
9592 apex_key {
9593 name: "myapex.key",
9594 public_key: "testkey.avbpubkey",
9595 private_key: "testkey.pem",
9596 }
9597
9598 java_library {
9599 name: "mylib",
9600 srcs: ["mylib.java"],
9601 apex_available: ["myapex"],
9602 compile_dex: true,
9603 }
9604
9605 bootclasspath_fragment {
9606 name: "mybootclasspathfragment",
9607 contents: ["mybootclasspathlib"],
9608 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009609 hidden_api: {
9610 split_packages: ["*"],
9611 },
Colin Crossc33e5212021-05-25 18:16:02 -07009612 }
9613
9614 java_library {
9615 name: "mybootclasspathlib",
9616 srcs: ["mybootclasspathlib.java"],
9617 apex_available: ["myapex"],
9618 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009619 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009620 }
9621
9622 systemserverclasspath_fragment {
9623 name: "mysystemserverclasspathfragment",
9624 contents: ["mysystemserverclasspathlib"],
9625 apex_available: ["myapex"],
9626 }
9627
9628 java_library {
9629 name: "mysystemserverclasspathlib",
9630 srcs: ["mysystemserverclasspathlib.java"],
9631 apex_available: ["myapex"],
9632 compile_dex: true,
9633 }
9634 `
9635
9636 result := android.GroupFixturePreparers(
9637 PrepareForTestWithApexBuildComponents,
9638 prepareForTestWithMyapex,
9639 java.PrepareForTestWithJavaDefaultModules,
9640 android.PrepareForTestWithAndroidBuildComponents,
9641 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009642 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9643 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009644 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009645 ).RunTest(t)
9646
9647 // Make sure jacoco ran on both mylib and mybootclasspathlib
9648 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9649 t.Errorf("Failed to find jacoco rule for mylib")
9650 }
9651 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9652 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9653 }
9654 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9655 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9656 }
9657}
9658
Jiyong Park192600a2021-08-03 07:52:17 +00009659func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009660 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009661 testApexError(t, `executable mybin is static`, `
9662 apex {
9663 name: "myapex",
9664 key: "myapex.key",
9665 binaries: ["mybin"],
9666 min_sdk_version: "29",
9667 }
9668
9669 apex_key {
9670 name: "myapex.key",
9671 public_key: "testkey.avbpubkey",
9672 private_key: "testkey.pem",
9673 }
9674
9675 cc_binary {
9676 name: "mybin",
9677 srcs: ["mylib.cpp"],
9678 relative_install_path: "foo/bar",
9679 static_executable: true,
9680 system_shared_libs: [],
9681 stl: "none",
9682 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009683 min_sdk_version: "29",
9684 }
9685 `)
9686
9687 testApexError(t, `executable mybin.rust is static`, `
9688 apex {
9689 name: "myapex",
9690 key: "myapex.key",
9691 binaries: ["mybin.rust"],
9692 min_sdk_version: "29",
9693 }
9694
9695 apex_key {
9696 name: "myapex.key",
9697 public_key: "testkey.avbpubkey",
9698 private_key: "testkey.pem",
9699 }
9700
9701 rust_binary {
9702 name: "mybin.rust",
9703 srcs: ["foo.rs"],
9704 static_executable: true,
9705 apex_available: ["myapex"],
9706 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009707 }
9708 `)
9709}
9710
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009711func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009712 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009713 ctx := testApex(t, `
9714 apex {
9715 name: "myapex",
9716 key: "myapex.key",
9717 updatable: false,
9718 java_libs: ["foo"],
9719 }
9720
9721 apex_key {
9722 name: "myapex.key",
9723 public_key: "testkey.avbpubkey",
9724 private_key: "testkey.pem",
9725 }
9726
9727 java_library {
9728 name: "foo",
9729 srcs: ["foo.java"],
9730 apex_available: ["myapex"],
9731 installable: true,
9732 }
9733 `,
9734 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9735 )
9736
Jooyung Hana0503a52023-08-23 13:12:50 +09009737 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009738 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9739 var builder strings.Builder
9740 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9741 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009742 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 +00009743}
9744
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009745func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009746 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009747 ctx := testApex(t, `
9748 apex {
9749 name: "myapex",
9750 key: "myapex.key",
9751 updatable: false,
9752 java_libs: ["foo"],
9753 required: ["otherapex"],
9754 }
9755
9756 apex {
9757 name: "otherapex",
9758 key: "myapex.key",
9759 updatable: false,
9760 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009761 }
9762
9763 apex_key {
9764 name: "myapex.key",
9765 public_key: "testkey.avbpubkey",
9766 private_key: "testkey.pem",
9767 }
9768
9769 java_library {
9770 name: "foo",
9771 srcs: ["foo.java"],
9772 apex_available: ["myapex", "otherapex"],
9773 installable: true,
9774 }
9775 `)
9776
Jooyung Hana0503a52023-08-23 13:12:50 +09009777 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009778 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9779 var builder strings.Builder
9780 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9781 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009782 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009783}
9784
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009785func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009786 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009787 ctx := testApex(t, `
9788 apex {
9789 name: "myapex",
9790 key: "myapex.key",
9791 updatable: false,
9792 }
9793
9794 apex_key {
9795 name: "myapex.key",
9796 public_key: "testkey.avbpubkey",
9797 private_key: "testkey.pem",
9798 }
9799 `)
9800
Jooyung Hana0503a52023-08-23 13:12:50 +09009801 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009802 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009803 data := android.AndroidMkDataForTest(t, ctx, bundle)
9804 var builder strings.Builder
9805 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9806 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009807 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009808}
9809
Jooyung Hana6d36672022-02-24 13:58:07 +09009810func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009811 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009812 for _, tc := range []struct {
9813 name string
9814 ref string
9815 expected_data []string
9816 }{
9817 {
9818 name: "test_using_output",
9819 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009820 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009821 },
9822 {
9823 name: "test_using_apex",
9824 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009825 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009826 },
9827 } {
9828 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009829 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009830 ctx := testApex(t, `
9831 apex {
9832 name: "myapex",
9833 key: "myapex.key",
9834 compressible: true,
9835 updatable: false,
9836 }
9837
9838 apex_key {
9839 name: "myapex.key",
9840 public_key: "testkey.avbpubkey",
9841 private_key: "testkey.pem",
9842 }
9843
9844 java_test {
9845 name: "`+tc.name+`",
9846 srcs: ["a.java"],
9847 data: ["`+tc.ref+`"],
9848 }
9849 `,
9850 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9851 variables.CompressedApex = proptools.BoolPtr(true)
9852 }))
9853 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9854 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9855 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9856 })
9857 }
9858}
9859
satayev758968a2021-12-06 11:42:40 +00009860func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009861 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009862 preparer := android.GroupFixturePreparers(
9863 PrepareForTestWithApexBuildComponents,
9864 prepareForTestWithMyapex,
9865 java.PrepareForTestWithJavaSdkLibraryFiles,
9866 java.PrepareForTestWithJavaDefaultModules,
9867 android.PrepareForTestWithAndroidBuildComponents,
9868 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9869 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9870 )
9871
9872 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9873 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009874 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009875 preparer.RunTestWithBp(t, `
9876 apex {
9877 name: "myapex",
9878 key: "myapex.key",
9879 bootclasspath_fragments: ["mybootclasspathfragment"],
9880 min_sdk_version: "30",
9881 updatable: false,
9882 }
9883
9884 apex_key {
9885 name: "myapex.key",
9886 public_key: "testkey.avbpubkey",
9887 private_key: "testkey.pem",
9888 }
9889
9890 bootclasspath_fragment {
9891 name: "mybootclasspathfragment",
9892 contents: ["mybootclasspathlib"],
9893 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009894 hidden_api: {
9895 split_packages: ["*"],
9896 },
satayev758968a2021-12-06 11:42:40 +00009897 }
9898
9899 java_sdk_library {
9900 name: "mybootclasspathlib",
9901 srcs: ["mybootclasspathlib.java"],
9902 apex_available: ["myapex"],
9903 compile_dex: true,
9904 unsafe_ignore_missing_latest_api: true,
9905 min_sdk_version: "31",
9906 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009907 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009908 }
9909
9910 java_library {
9911 name: "util",
9912 srcs: ["a.java"],
9913 apex_available: ["myapex"],
9914 min_sdk_version: "31",
9915 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009916 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009917 }
9918
9919 java_library {
9920 name: "another_util",
9921 srcs: ["a.java"],
9922 min_sdk_version: "31",
9923 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009924 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009925 }
9926 `)
9927 })
9928
9929 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9930 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009931 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009932 preparer.RunTestWithBp(t, `
9933 apex {
9934 name: "myapex",
9935 key: "myapex.key",
9936 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9937 min_sdk_version: "30",
9938 updatable: false,
9939 }
9940
9941 apex_key {
9942 name: "myapex.key",
9943 public_key: "testkey.avbpubkey",
9944 private_key: "testkey.pem",
9945 }
9946
9947 systemserverclasspath_fragment {
9948 name: "mysystemserverclasspathfragment",
9949 contents: ["mysystemserverclasspathlib"],
9950 apex_available: ["myapex"],
9951 }
9952
9953 java_sdk_library {
9954 name: "mysystemserverclasspathlib",
9955 srcs: ["mysystemserverclasspathlib.java"],
9956 apex_available: ["myapex"],
9957 compile_dex: true,
9958 min_sdk_version: "32",
9959 unsafe_ignore_missing_latest_api: true,
9960 static_libs: ["util"],
9961 }
9962
9963 java_library {
9964 name: "util",
9965 srcs: ["a.java"],
9966 apex_available: ["myapex"],
9967 min_sdk_version: "31",
9968 static_libs: ["another_util"],
9969 }
9970
9971 java_library {
9972 name: "another_util",
9973 srcs: ["a.java"],
9974 min_sdk_version: "31",
9975 apex_available: ["myapex"],
9976 }
9977 `)
9978 })
9979
9980 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009981 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009982 preparer.
satayev758968a2021-12-06 11:42:40 +00009983 RunTestWithBp(t, `
9984 apex {
9985 name: "myapex",
9986 key: "myapex.key",
9987 bootclasspath_fragments: ["mybootclasspathfragment"],
9988 min_sdk_version: "30",
9989 updatable: false,
9990 }
9991
9992 apex_key {
9993 name: "myapex.key",
9994 public_key: "testkey.avbpubkey",
9995 private_key: "testkey.pem",
9996 }
9997
9998 bootclasspath_fragment {
9999 name: "mybootclasspathfragment",
10000 contents: ["mybootclasspathlib"],
10001 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010002 hidden_api: {
10003 split_packages: ["*"],
10004 },
satayev758968a2021-12-06 11:42:40 +000010005 }
10006
10007 java_sdk_library {
10008 name: "mybootclasspathlib",
10009 srcs: ["mybootclasspathlib.java"],
10010 apex_available: ["myapex"],
10011 compile_dex: true,
10012 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010013 sdk_version: "current",
10014 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010015 }
10016 `)
10017 })
10018
10019 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010020 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010021 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10022 RunTestWithBp(t, `
10023 apex {
10024 name: "myapex",
10025 key: "myapex.key",
10026 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10027 min_sdk_version: "30",
10028 updatable: false,
10029 }
10030
10031 apex_key {
10032 name: "myapex.key",
10033 public_key: "testkey.avbpubkey",
10034 private_key: "testkey.pem",
10035 }
10036
10037 systemserverclasspath_fragment {
10038 name: "mysystemserverclasspathfragment",
10039 contents: ["mysystemserverclasspathlib"],
10040 apex_available: ["myapex"],
10041 }
10042
10043 java_sdk_library {
10044 name: "mysystemserverclasspathlib",
10045 srcs: ["mysystemserverclasspathlib.java"],
10046 apex_available: ["myapex"],
10047 compile_dex: true,
10048 unsafe_ignore_missing_latest_api: true,
10049 }
10050 `)
10051 })
10052}
10053
Jiakai Zhang6decef92022-01-12 17:56:19 +000010054// Verifies that the APEX depends on all the Make modules in the list.
10055func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10056 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10057 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010058 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010059 }
10060}
10061
10062// Verifies that the APEX does not depend on any of the Make modules in the list.
10063func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10064 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10065 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010066 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010067 }
10068}
10069
Cole Faust24e25c02024-01-19 14:12:17 -080010070func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010071 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010072 bpTemplate := `
10073 apex {
10074 name: "myapex",
10075 key: "myapex.key",
10076 java_libs: ["myjavalib"],
10077 updatable: %v,
10078 min_sdk_version: "29",
10079 }
10080 apex_key {
10081 name: "myapex.key",
10082 }
10083 java_library {
10084 name: "myjavalib",
10085 srcs: ["MyClass.java"],
10086 apex_available: [ "myapex" ],
10087 lint: {
10088 strict_updatability_linting: %v,
10089 %s
10090 },
10091 sdk_version: "current",
10092 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010093 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010094 }
10095 `
10096 fs := android.MockFS{
10097 "lint-baseline.xml": nil,
10098 }
10099
10100 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010101 testCaseName string
10102 apexUpdatable bool
10103 javaStrictUpdtabilityLint bool
10104 lintFileExists bool
10105 disallowedFlagExpectedOnApex bool
10106 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010107 }{
10108 {
Colin Cross87427352024-09-25 15:41:19 -070010109 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10110 apexUpdatable: true,
10111 javaStrictUpdtabilityLint: true,
10112 lintFileExists: false,
10113 disallowedFlagExpectedOnApex: false,
10114 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010115 },
10116 {
Colin Cross87427352024-09-25 15:41:19 -070010117 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10118 apexUpdatable: false,
10119 javaStrictUpdtabilityLint: false,
10120 lintFileExists: true,
10121 disallowedFlagExpectedOnApex: false,
10122 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010123 },
10124 {
Colin Cross87427352024-09-25 15:41:19 -070010125 testCaseName: "non-updatable apex respects strict updatability of javalib",
10126 apexUpdatable: false,
10127 javaStrictUpdtabilityLint: true,
10128 lintFileExists: true,
10129 disallowedFlagExpectedOnApex: false,
10130 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010131 },
10132 {
Colin Cross87427352024-09-25 15:41:19 -070010133 testCaseName: "updatable apex checks strict updatability of javalib",
10134 apexUpdatable: true,
10135 javaStrictUpdtabilityLint: false,
10136 lintFileExists: true,
10137 disallowedFlagExpectedOnApex: true,
10138 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010139 },
10140 }
10141
10142 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010143 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010144 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010145 fixtures := []android.FixturePreparer{}
10146 baselineProperty := ""
10147 if testCase.lintFileExists {
10148 fixtures = append(fixtures, fs.AddToFixture())
10149 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10150 }
10151 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010152
Colin Cross87427352024-09-25 15:41:19 -070010153 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010154
Colin Cross87427352024-09-25 15:41:19 -070010155 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10156 if expectStrictUpdatability {
10157 if m.Rule == nil {
10158 t.Errorf("expected strict updatability check rule on %s", name)
10159 } else {
10160 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10161 m.RuleParams.Command, "--disallowed_issues NewApi")
10162 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10163 m.Inputs.Strings(), "lint-baseline.xml")
10164 }
10165 } else {
10166 if m.Rule != nil {
10167 t.Errorf("expected no strict updatability check rule on %s", name)
10168 }
10169 }
10170 }
10171
10172 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10173 apex := result.ModuleForTests("myapex", "android_common_myapex")
10174 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10175 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10176
10177 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10178 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10179 })
Cole Faust24e25c02024-01-19 14:12:17 -080010180 }
10181}
10182
Cole Faust24e25c02024-01-19 14:12:17 -080010183// checks transtive deps of an apex coming from bootclasspath_fragment
10184func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010185 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010186 bp := `
10187 apex {
10188 name: "myapex",
10189 key: "myapex.key",
10190 bootclasspath_fragments: ["mybootclasspathfragment"],
10191 updatable: true,
10192 min_sdk_version: "29",
10193 }
10194 apex_key {
10195 name: "myapex.key",
10196 }
10197 bootclasspath_fragment {
10198 name: "mybootclasspathfragment",
10199 contents: ["myjavalib"],
10200 apex_available: ["myapex"],
10201 hidden_api: {
10202 split_packages: ["*"],
10203 },
10204 }
10205 java_library {
10206 name: "myjavalib",
10207 srcs: ["MyClass.java"],
10208 apex_available: [ "myapex" ],
10209 sdk_version: "current",
10210 min_sdk_version: "29",
10211 compile_dex: true,
10212 lint: {
10213 baseline_filename: "lint-baseline.xml",
10214 }
10215 }
10216 `
10217 fs := android.MockFS{
10218 "lint-baseline.xml": nil,
10219 }
10220
10221 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010222 apex := result.ModuleForTests("myapex", "android_common_myapex")
10223 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10224 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10225 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10226 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10227 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010228}
Spandan Das66773252022-01-15 00:23:18 +000010229
Jihoon Kang784c0052024-06-25 22:15:39 +000010230func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010231 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010232 bp := `
10233 apex {
10234 name: "myapex",
10235 key: "myapex.key",
10236 bootclasspath_fragments: ["mybootclasspathfragment"],
10237 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010238 java_libs: [
10239 "jacocoagent",
10240 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010241 }
10242 apex_key {
10243 name: "myapex.key",
10244 }
10245 bootclasspath_fragment {
10246 name: "mybootclasspathfragment",
10247 contents: ["foo"],
10248 apex_available: ["myapex"],
10249 hidden_api: {
10250 split_packages: ["*"],
10251 },
10252 }
10253 java_sdk_library {
10254 name: "foo",
10255 srcs: ["MyClass.java"],
10256 apex_available: [ "myapex" ],
10257 sdk_version: "current",
10258 min_sdk_version: "29",
10259 compile_dex: true,
10260 }
10261 `
10262 fs := android.MockFS{
10263 "lint-baseline.xml": nil,
10264 }
10265
10266 result := android.GroupFixturePreparers(
10267 prepareForApexTest,
10268 java.PrepareForTestWithJavaSdkLibraryFiles,
10269 java.PrepareForTestWithJacocoInstrumentation,
10270 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010271 android.FixtureMergeMockFs(fs),
10272 ).RunTestWithBp(t, bp)
10273
10274 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10275 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10276 android.AssertStringDoesContain(t,
10277 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10278 lintReportInputs, "foo.impl")
10279}
10280
Spandan Das42e89502022-05-06 22:12:55 +000010281// updatable apexes should propagate updatable=true to its apps
10282func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010283 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010284 bp := `
10285 apex {
10286 name: "myapex",
10287 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010288 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010289 apps: [
10290 "myapp",
10291 ],
10292 min_sdk_version: "30",
10293 }
10294 apex_key {
10295 name: "myapex.key",
10296 }
10297 android_app {
10298 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010299 apex_available: [
10300 "myapex",
10301 ],
10302 sdk_version: "current",
10303 min_sdk_version: "30",
10304 }
10305 `
Colin Cross99939e92024-10-01 16:02:46 -070010306 _ = android.GroupFixturePreparers(
10307 prepareForApexTest,
10308 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10309 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010310}
10311
Jingwen Chendea7a642023-03-28 11:30:50 +000010312func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010313 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010314 ctx := testApex(t, `
10315 apex {
10316 name: "myapex",
10317 key: "myapex.key",
10318 updatable: false,
10319 }
10320
10321 apex_key {
10322 name: "myapex.key",
10323 public_key: "testkey.avbpubkey",
10324 private_key: "testkey.pem",
10325 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010326 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010327 generateFsRule := mod.Rule("generateFsConfig")
10328 cmd := generateFsRule.RuleParams.Command
10329
10330 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10331}
10332
10333func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010334 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010335 ctx := testApex(t, `
10336 apex {
10337 name: "myapex",
10338 key: "myapex.key",
10339 canned_fs_config: "my_config",
10340 updatable: false,
10341 }
10342
10343 apex_key {
10344 name: "myapex.key",
10345 public_key: "testkey.avbpubkey",
10346 private_key: "testkey.pem",
10347 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010348 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010349 generateFsRule := mod.Rule("generateFsConfig")
10350 cmd := generateFsRule.RuleParams.Command
10351
10352 // Ensure that canned_fs_config has "cat my_config" at the end
10353 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10354}
Spandan Das20fce2d2023-04-12 17:21:39 +000010355
10356func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010357 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010358 testCases := []struct {
10359 desc string
10360 hasStubs bool
10361 apexAvailable string
10362 expectedError string
10363 }{
10364 {
10365 desc: "non-stub library can have multiple apex_available",
10366 hasStubs: false,
10367 apexAvailable: `["myapex", "otherapex"]`,
10368 },
10369 {
10370 desc: "stub library should not be available to anyapex",
10371 hasStubs: true,
10372 apexAvailable: `["//apex_available:anyapex"]`,
10373 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10374 },
10375 {
10376 desc: "stub library should not be available to multiple apexes",
10377 hasStubs: true,
10378 apexAvailable: `["myapex", "otherapex"]`,
10379 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10380 },
10381 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010382 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 +000010383 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010384 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010385 },
10386 }
10387 bpTemplate := `
10388 cc_library {
10389 name: "libfoo",
10390 %v
10391 apex_available: %v,
10392 }
10393 apex {
10394 name: "myapex",
10395 key: "apex.key",
10396 updatable: false,
10397 native_shared_libs: ["libfoo"],
10398 }
10399 apex {
10400 name: "otherapex",
10401 key: "apex.key",
10402 updatable: false,
10403 }
10404 apex_test {
10405 name: "test_myapex",
10406 key: "apex.key",
10407 updatable: false,
10408 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010409 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010410 }
10411 apex_key {
10412 name: "apex.key",
10413 }
10414 `
10415 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010416 t.Run(tc.desc, func(t *testing.T) {
10417 stubs := ""
10418 if tc.hasStubs {
10419 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10420 }
10421 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10422 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10423 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10424 })
10425 if tc.expectedError == "" {
10426 testApex(t, bp, mockFsFixturePreparer)
10427 } else {
10428 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10429 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010430 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010431 }
10432}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010433
10434func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010435 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010436 context := android.GroupFixturePreparers(
10437 android.PrepareForIntegrationTestWithAndroid,
10438 cc.PrepareForIntegrationTestWithCc,
10439 PrepareForTestWithApexBuildComponents,
10440 prepareForTestWithMyapex,
10441 filesystem.PrepareForTestWithFilesystemBuildComponents,
10442 )
10443 result := context.RunTestWithBp(t, `
10444 android_system_image {
10445 name: "myfilesystem",
10446 deps: [
10447 "libfoo",
10448 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010449 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010450 gen_linker_config: true,
10451 linker_config_srcs: ["linker.config.json"],
10452 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010453 }
10454
10455 cc_library {
10456 name: "libfoo",
10457 shared_libs: [
10458 "libbar",
10459 ],
10460 stl: "none",
10461 }
10462
10463 cc_library {
10464 name: "libbar",
10465 stl: "none",
10466 apex_available: ["myapex"],
10467 }
10468
10469 apex {
10470 name: "myapex",
10471 native_shared_libs: ["libbar"],
10472 key: "myapex.key",
10473 updatable: false,
10474 }
10475
10476 apex_key {
10477 name: "myapex.key",
10478 public_key: "testkey.avbpubkey",
10479 private_key: "testkey.pem",
10480 }
10481 `)
10482
Cole Faust3b806d32024-03-11 15:15:03 -070010483 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010484 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10485 inputs.Strings(),
10486 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10487}
Yu Liueae7b362023-11-16 17:05:47 -080010488
10489var apex_default_bp = `
10490 apex_key {
10491 name: "myapex.key",
10492 public_key: "testkey.avbpubkey",
10493 private_key: "testkey.pem",
10494 }
10495
10496 filegroup {
10497 name: "myapex.manifest",
10498 srcs: ["apex_manifest.json"],
10499 }
10500
10501 filegroup {
10502 name: "myapex.androidmanifest",
10503 srcs: ["AndroidManifest.xml"],
10504 }
10505`
10506
10507func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010508 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010509 ctx := testApex(t, apex_default_bp+`
10510 apex {
10511 name: "myapex",
10512 manifest: ":myapex.manifest",
10513 androidManifest: ":myapex.androidmanifest",
10514 key: "myapex.key",
10515 java_libs: [
10516 "my_java_library_foo",
10517 "my_java_library_bar",
10518 ],
10519 updatable: false,
10520 }
10521
10522 java_library {
10523 name: "my_java_library_foo",
10524 srcs: ["foo/bar/MyClass.java"],
10525 sdk_version: "none",
10526 system_modules: "none",
10527 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010528 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010529 "myapex",
10530 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010531 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010532 }
10533
10534 java_library {
10535 name: "my_java_library_bar",
10536 srcs: ["foo/bar/MyClass.java"],
10537 sdk_version: "none",
10538 system_modules: "none",
10539 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010540 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010541 "myapex",
10542 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010543 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010544 }
10545
10546 aconfig_declarations {
10547 name: "my_aconfig_declarations_foo",
10548 package: "com.example.package",
10549 container: "myapex",
10550 srcs: ["foo.aconfig"],
10551 }
10552
10553 java_aconfig_library {
10554 name: "my_java_aconfig_library_foo",
10555 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010556 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010557 "myapex",
10558 ],
10559 }
10560
10561 aconfig_declarations {
10562 name: "my_aconfig_declarations_bar",
10563 package: "com.example.package",
10564 container: "myapex",
10565 srcs: ["bar.aconfig"],
10566 }
10567
10568 java_aconfig_library {
10569 name: "my_java_aconfig_library_bar",
10570 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010571 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010572 "myapex",
10573 ],
10574 }
10575 `)
10576
10577 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10578 s := mod.Rule("apexRule").Args["copy_commands"]
10579 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010580 if len(copyCmds) != 14 {
10581 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010582 }
10583
Jooyung Hana3fddf42024-09-03 13:22:21 +090010584 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10585 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10586 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10587 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010588 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010589
Yu Liubba555e2024-02-17 00:36:42 +000010590 inputs := []string{
10591 "my_aconfig_declarations_foo/intermediate.pb",
10592 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010593 }
Yu Liubba555e2024-02-17 00:36:42 +000010594 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10595 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10596 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10597 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010598 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010599}
10600
10601func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010602 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010603 ctx := testApex(t, apex_default_bp+`
10604 apex {
10605 name: "myapex",
10606 manifest: ":myapex.manifest",
10607 androidManifest: ":myapex.androidmanifest",
10608 key: "myapex.key",
10609 java_libs: [
10610 "my_java_library_foo",
10611 ],
10612 native_shared_libs: [
10613 "my_cc_library_bar",
10614 ],
10615 binaries: [
10616 "my_cc_binary_baz",
10617 ],
10618 updatable: false,
10619 }
10620
10621 java_library {
10622 name: "my_java_library_foo",
10623 srcs: ["foo/bar/MyClass.java"],
10624 sdk_version: "none",
10625 system_modules: "none",
10626 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010627 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010628 "myapex",
10629 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010630 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010631 }
10632
10633 cc_library {
10634 name: "my_cc_library_bar",
10635 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010636 static_libs: [
10637 "my_cc_aconfig_library_bar",
10638 "my_cc_aconfig_library_baz",
10639 ],
Yu Liueae7b362023-11-16 17:05:47 -080010640 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010641 "myapex",
10642 ],
10643 }
10644
10645 cc_binary {
10646 name: "my_cc_binary_baz",
10647 srcs: ["foo/bar/MyClass.cc"],
10648 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010649 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010650 "myapex",
10651 ],
10652 }
10653
10654 aconfig_declarations {
10655 name: "my_aconfig_declarations_foo",
10656 package: "com.example.package",
10657 container: "myapex",
10658 srcs: ["foo.aconfig"],
10659 }
10660
10661 java_aconfig_library {
10662 name: "my_java_aconfig_library_foo",
10663 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010664 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010665 "myapex",
10666 ],
10667 }
10668
10669 aconfig_declarations {
10670 name: "my_aconfig_declarations_bar",
10671 package: "com.example.package",
10672 container: "myapex",
10673 srcs: ["bar.aconfig"],
10674 }
10675
10676 cc_aconfig_library {
10677 name: "my_cc_aconfig_library_bar",
10678 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010679 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010680 "myapex",
10681 ],
10682 }
10683
10684 aconfig_declarations {
10685 name: "my_aconfig_declarations_baz",
10686 package: "com.example.package",
10687 container: "myapex",
10688 srcs: ["baz.aconfig"],
10689 }
10690
10691 cc_aconfig_library {
10692 name: "my_cc_aconfig_library_baz",
10693 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010694 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010695 "myapex",
10696 ],
10697 }
10698
10699 cc_library {
10700 name: "server_configurable_flags",
10701 srcs: ["server_configurable_flags.cc"],
10702 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010703 cc_library {
10704 name: "libbase",
10705 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010706 apex_available: [
10707 "myapex",
10708 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010709 }
10710 cc_library {
10711 name: "libaconfig_storage_read_api_cc",
10712 srcs: ["libaconfig_storage_read_api_cc.cc"],
10713 }
Yu Liueae7b362023-11-16 17:05:47 -080010714 `)
10715
10716 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10717 s := mod.Rule("apexRule").Args["copy_commands"]
10718 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010719 if len(copyCmds) != 18 {
10720 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010721 }
10722
Jooyung Hana3fddf42024-09-03 13:22:21 +090010723 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10724 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10725 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10726 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010727 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010728
Yu Liubba555e2024-02-17 00:36:42 +000010729 inputs := []string{
10730 "my_aconfig_declarations_foo/intermediate.pb",
10731 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10732 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010733 }
Yu Liubba555e2024-02-17 00:36:42 +000010734 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10735 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10736 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10737 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010738 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010739}
10740
Yu Liucec0e412023-11-30 16:45:50 -080010741func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010742 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010743 ctx := testApex(t, apex_default_bp+`
10744 apex {
10745 name: "myapex",
10746 manifest: ":myapex.manifest",
10747 androidManifest: ":myapex.androidmanifest",
10748 key: "myapex.key",
10749 native_shared_libs: [
10750 "libmy_rust_library",
10751 ],
10752 binaries: [
10753 "my_rust_binary",
10754 ],
10755 rust_dyn_libs: [
10756 "libmy_rust_dylib",
10757 ],
10758 updatable: false,
10759 }
10760
10761 rust_library {
10762 name: "libflags_rust", // test mock
10763 crate_name: "flags_rust",
10764 srcs: ["lib.rs"],
10765 apex_available: [
10766 "myapex",
10767 ],
10768 }
10769
10770 rust_library {
10771 name: "liblazy_static", // test mock
10772 crate_name: "lazy_static",
10773 srcs: ["src/lib.rs"],
10774 apex_available: [
10775 "myapex",
10776 ],
10777 }
10778
Ted Bauer02d475c2024-03-27 20:56:26 +000010779 rust_library {
10780 name: "libaconfig_storage_read_api", // test mock
10781 crate_name: "aconfig_storage_read_api",
10782 srcs: ["src/lib.rs"],
10783 apex_available: [
10784 "myapex",
10785 ],
10786 }
10787
Ted Bauer6ef40db2024-03-29 14:04:10 +000010788 rust_library {
10789 name: "liblogger", // test mock
10790 crate_name: "logger",
10791 srcs: ["src/lib.rs"],
10792 apex_available: [
10793 "myapex",
10794 ],
10795 }
10796
10797 rust_library {
10798 name: "liblog_rust", // test mock
10799 crate_name: "log_rust",
10800 srcs: ["src/lib.rs"],
10801 apex_available: [
10802 "myapex",
10803 ],
10804 }
10805
Yu Liucec0e412023-11-30 16:45:50 -080010806 rust_ffi_shared {
10807 name: "libmy_rust_library",
10808 srcs: ["src/lib.rs"],
10809 rustlibs: ["libmy_rust_aconfig_library_foo"],
10810 crate_name: "my_rust_library",
10811 apex_available: [
10812 "myapex",
10813 ],
10814 }
10815
10816 rust_library_dylib {
10817 name: "libmy_rust_dylib",
10818 srcs: ["foo/bar/MyClass.rs"],
10819 rustlibs: ["libmy_rust_aconfig_library_bar"],
10820 crate_name: "my_rust_dylib",
10821 apex_available: [
10822 "myapex",
10823 ],
10824 }
10825
10826 rust_binary {
10827 name: "my_rust_binary",
10828 srcs: ["foo/bar/MyClass.rs"],
10829 rustlibs: [
10830 "libmy_rust_aconfig_library_baz",
10831 "libmy_rust_dylib",
10832 ],
10833 apex_available: [
10834 "myapex",
10835 ],
10836 }
10837
10838 aconfig_declarations {
10839 name: "my_aconfig_declarations_foo",
10840 package: "com.example.package",
10841 container: "myapex",
10842 srcs: ["foo.aconfig"],
10843 }
10844
10845 aconfig_declarations {
10846 name: "my_aconfig_declarations_bar",
10847 package: "com.example.package",
10848 container: "myapex",
10849 srcs: ["bar.aconfig"],
10850 }
10851
10852 aconfig_declarations {
10853 name: "my_aconfig_declarations_baz",
10854 package: "com.example.package",
10855 container: "myapex",
10856 srcs: ["baz.aconfig"],
10857 }
10858
10859 rust_aconfig_library {
10860 name: "libmy_rust_aconfig_library_foo",
10861 aconfig_declarations: "my_aconfig_declarations_foo",
10862 crate_name: "my_rust_aconfig_library_foo",
10863 apex_available: [
10864 "myapex",
10865 ],
10866 }
10867
10868 rust_aconfig_library {
10869 name: "libmy_rust_aconfig_library_bar",
10870 aconfig_declarations: "my_aconfig_declarations_bar",
10871 crate_name: "my_rust_aconfig_library_bar",
10872 apex_available: [
10873 "myapex",
10874 ],
10875 }
10876
10877 rust_aconfig_library {
10878 name: "libmy_rust_aconfig_library_baz",
10879 aconfig_declarations: "my_aconfig_declarations_baz",
10880 crate_name: "my_rust_aconfig_library_baz",
10881 apex_available: [
10882 "myapex",
10883 ],
10884 }
10885 `)
10886
10887 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10888 s := mod.Rule("apexRule").Args["copy_commands"]
10889 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +000010890 if len(copyCmds) != 34 {
10891 t.Fatalf("Expected 34 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010892 }
10893
Jooyung Hana3fddf42024-09-03 13:22:21 +090010894 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10895 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10896 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10897 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010898 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010899
Yu Liubba555e2024-02-17 00:36:42 +000010900 inputs := []string{
10901 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010902 "my_aconfig_declarations_bar/intermediate.pb",
10903 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010904 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10905 }
10906 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10907 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10908 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10909 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010910 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010911}
10912
10913func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10914 aconfigRule := mod.Description(desc)
10915 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010916 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010917 if len(aconfigArgs) != len(inputs) {
10918 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010919 }
Yu Liucec0e412023-11-30 16:45:50 -080010920
Yu Liubba555e2024-02-17 00:36:42 +000010921 ensureEquals(t, container, aconfigRule.Args["container"])
10922 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10923
10924 buildParams := aconfigRule.BuildParams
10925 for _, input := range inputs {
10926 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10927 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010928 }
Yu Liubba555e2024-02-17 00:36:42 +000010929
10930 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010931}
10932
Yu Liueae7b362023-11-16 17:05:47 -080010933func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010934 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010935 ctx := testApex(t, apex_default_bp+`
10936 apex {
10937 name: "myapex",
10938 manifest: ":myapex.manifest",
10939 androidManifest: ":myapex.androidmanifest",
10940 key: "myapex.key",
10941 java_libs: [
10942 "my_java_library_foo",
10943 "other_java_library_bar",
10944 ],
10945 updatable: false,
10946 }
10947
10948 java_library {
10949 name: "my_java_library_foo",
10950 srcs: ["foo/bar/MyClass.java"],
10951 sdk_version: "none",
10952 system_modules: "none",
10953 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010954 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010955 "myapex",
10956 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010957 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010958 }
10959
10960 java_library {
10961 name: "other_java_library_bar",
10962 srcs: ["foo/bar/MyClass.java"],
10963 sdk_version: "none",
10964 system_modules: "none",
10965 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010966 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010967 "myapex",
10968 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010969 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010970 }
10971
10972 aconfig_declarations {
10973 name: "my_aconfig_declarations_foo",
10974 package: "com.example.package",
10975 container: "myapex",
10976 srcs: ["foo.aconfig"],
10977 }
10978
10979 java_aconfig_library {
10980 name: "my_java_aconfig_library_foo",
10981 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010982 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010983 "myapex",
10984 ],
10985 }
10986
10987 aconfig_declarations {
10988 name: "other_aconfig_declarations_bar",
10989 package: "com.example.package",
10990 container: "otherapex",
10991 srcs: ["bar.aconfig"],
10992 }
10993
10994 java_aconfig_library {
10995 name: "other_java_aconfig_library_bar",
10996 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010997 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010998 "myapex",
10999 ],
11000 }
11001 `)
11002
11003 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11004 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11005 s := " " + combineAconfigRule.Args["cache_files"]
11006 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11007 if len(aconfigArgs) != 1 {
11008 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11009 }
11010 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11011
11012 buildParams := combineAconfigRule.BuildParams
11013 if len(buildParams.Inputs) != 1 {
11014 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11015 }
11016 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11017 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11018}
11019
11020func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011021 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011022 ctx := testApex(t, apex_default_bp+`
11023 apex {
11024 name: "myapex",
11025 manifest: ":myapex.manifest",
11026 androidManifest: ":myapex.androidmanifest",
11027 key: "myapex.key",
11028 java_libs: [
11029 "my_java_library_foo",
11030 "my_java_library_bar",
11031 ],
11032 updatable: false,
11033 }
11034
11035 java_library {
11036 name: "my_java_library_foo",
11037 srcs: ["foo/bar/MyClass.java"],
11038 sdk_version: "none",
11039 system_modules: "none",
11040 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011041 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011042 "myapex",
11043 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011044 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011045 }
11046
11047 java_library {
11048 name: "my_java_library_bar",
11049 srcs: ["foo/bar/MyClass.java"],
11050 sdk_version: "none",
11051 system_modules: "none",
11052 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011053 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011054 "myapex",
11055 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011056 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011057 }
11058
11059 aconfig_declarations {
11060 name: "my_aconfig_declarations_foo",
11061 package: "com.example.package",
11062 container: "myapex",
11063 srcs: ["foo.aconfig"],
11064 }
11065
11066 java_aconfig_library {
11067 name: "my_java_aconfig_library_foo",
11068 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011069 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011070 "myapex",
11071 ],
11072 }
11073
11074 java_aconfig_library {
11075 name: "my_java_aconfig_library_bar",
11076 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011077 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011078 "myapex",
11079 ],
11080 }
11081 `)
11082
11083 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11084 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11085 s := " " + combineAconfigRule.Args["cache_files"]
11086 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11087 if len(aconfigArgs) != 1 {
11088 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11089 }
11090 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11091
11092 buildParams := combineAconfigRule.BuildParams
11093 if len(buildParams.Inputs) != 1 {
11094 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11095 }
11096 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11097 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11098}
Spandan Das5be63332023-12-13 00:06:32 +000011099
11100// Test that the boot jars come from the _selected_ apex prebuilt
11101// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11102func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011103 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011104 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11105 t.Helper()
11106 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11107 foundLibfooJar := false
11108 base := stem + ".jar"
11109 for _, output := range s.AllOutputs() {
11110 if filepath.Base(output) == base {
11111 foundLibfooJar = true
11112 buildRule := s.Output(output)
11113 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11114 }
11115 }
11116 if !foundLibfooJar {
11117 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11118 }
11119 }
11120
Spandan Das64c9e0c2023-12-20 20:13:34 +000011121 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11122 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11123 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11124 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11125 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11126 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)
11127 }
11128
11129 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11130 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11131 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11132 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11133 }
11134
Spandan Das5be63332023-12-13 00:06:32 +000011135 bp := `
11136 // Source APEX.
11137
11138 java_library {
11139 name: "framework-foo",
11140 srcs: ["foo.java"],
11141 installable: true,
11142 apex_available: [
11143 "com.android.foo",
11144 ],
11145 }
11146
11147 bootclasspath_fragment {
11148 name: "foo-bootclasspath-fragment",
11149 contents: ["framework-foo"],
11150 apex_available: [
11151 "com.android.foo",
11152 ],
11153 hidden_api: {
11154 split_packages: ["*"],
11155 },
11156 }
11157
11158 apex_key {
11159 name: "com.android.foo.key",
11160 public_key: "com.android.foo.avbpubkey",
11161 private_key: "com.android.foo.pem",
11162 }
11163
11164 apex {
11165 name: "com.android.foo",
11166 key: "com.android.foo.key",
11167 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11168 updatable: false,
11169 }
11170
11171 // Prebuilt APEX.
11172
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011173 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011174 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011175 public: {
11176 jars: ["foo.jar"],
11177 },
Spandan Das5be63332023-12-13 00:06:32 +000011178 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011179 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011180 }
11181
11182 prebuilt_bootclasspath_fragment {
11183 name: "foo-bootclasspath-fragment",
11184 contents: ["framework-foo"],
11185 hidden_api: {
11186 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11187 metadata: "my-bootclasspath-fragment/metadata.csv",
11188 index: "my-bootclasspath-fragment/index.csv",
11189 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11190 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11191 },
11192 apex_available: [
11193 "com.android.foo",
11194 ],
11195 }
11196
11197 prebuilt_apex {
11198 name: "com.android.foo",
11199 apex_name: "com.android.foo",
11200 src: "com.android.foo-arm.apex",
11201 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11202 }
11203
11204 // Another Prebuilt ART APEX
11205 prebuilt_apex {
11206 name: "com.android.foo.v2",
11207 apex_name: "com.android.foo", // Used to determine the API domain
11208 src: "com.android.foo-arm.apex",
11209 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11210 }
11211
11212 // APEX contribution modules
11213
11214 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011215 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011216 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011217 contents: ["com.android.foo"],
11218 }
11219
11220 apex_contributions {
11221 name: "foo.prebuilt.contributions",
11222 api_domain: "com.android.foo",
11223 contents: ["prebuilt_com.android.foo"],
11224 }
11225
11226 apex_contributions {
11227 name: "foo.prebuilt.v2.contributions",
11228 api_domain: "com.android.foo",
11229 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011230 }
11231 `
11232
11233 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011234 desc string
11235 selectedApexContributions string
11236 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011237 }{
11238 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011239 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11240 selectedApexContributions: "foo.source.contributions",
11241 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011242 },
11243 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011244 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11245 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011246 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 +000011247 },
11248 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011249 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11250 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011251 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 +000011252 },
11253 }
11254
11255 fragment := java.ApexVariantReference{
11256 Apex: proptools.StringPtr("com.android.foo"),
11257 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11258 }
11259
11260 for _, tc := range testCases {
11261 preparer := android.GroupFixturePreparers(
11262 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11263 android.FixtureMergeMockFs(map[string][]byte{
11264 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11265 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011266 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11267 // file creation.
11268 java.FixtureConfigureBootJars("platform:foo"),
11269 android.FixtureModifyMockFS(func(fs android.MockFS) {
11270 fs["platform/Android.bp"] = []byte(`
11271 java_library {
11272 name: "foo",
11273 srcs: ["Test.java"],
11274 compile_dex: true,
11275 }
11276 `)
11277 fs["platform/Test.java"] = nil
11278 }),
11279
Colin Crossa66b4632024-08-08 15:50:47 -070011280 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011281 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011282 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011283 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011284 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11285 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011286 }
11287}
Spandan Das3576e762024-01-03 18:57:03 +000011288
11289// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11290// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11291func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011292 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011293 // for a mainline module family, check that only the flagged soong module is visible to make
11294 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11295 variation := func(moduleName string) string {
11296 ret := "android_common_com.android.foo"
11297 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011298 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011299 }
11300 return ret
11301 }
11302
11303 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11304 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11305
11306 for _, hiddenModuleName := range hiddenModuleNames {
11307 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11308 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11309
11310 }
11311 }
11312
11313 bp := `
11314 apex_key {
11315 name: "com.android.foo.key",
11316 public_key: "com.android.foo.avbpubkey",
11317 private_key: "com.android.foo.pem",
11318 }
11319
11320 // AOSP source apex
11321 apex {
11322 name: "com.android.foo",
11323 key: "com.android.foo.key",
11324 updatable: false,
11325 }
11326
11327 // Google source apex
11328 override_apex {
11329 name: "com.google.android.foo",
11330 base: "com.android.foo",
11331 key: "com.android.foo.key",
11332 }
11333
11334 // Prebuilt Google APEX.
11335
11336 prebuilt_apex {
11337 name: "com.google.android.foo",
11338 apex_name: "com.android.foo",
11339 src: "com.android.foo-arm.apex",
11340 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11341 }
11342
11343 // Another Prebuilt Google APEX
11344 prebuilt_apex {
11345 name: "com.google.android.foo.v2",
11346 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011347 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011348 src: "com.android.foo-arm.apex",
11349 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11350 }
11351
11352 // APEX contribution modules
11353
11354 apex_contributions {
11355 name: "foo.source.contributions",
11356 api_domain: "com.android.foo",
11357 contents: ["com.google.android.foo"],
11358 }
11359
11360 apex_contributions {
11361 name: "foo.prebuilt.contributions",
11362 api_domain: "com.android.foo",
11363 contents: ["prebuilt_com.google.android.foo"],
11364 }
11365
11366 apex_contributions {
11367 name: "foo.prebuilt.v2.contributions",
11368 api_domain: "com.android.foo",
11369 contents: ["prebuilt_com.google.android.foo.v2"],
11370 }
11371
11372 // This is an incompatible module because it selects multiple versions of the same mainline module
11373 apex_contributions {
11374 name: "foo.prebuilt.duplicate.contributions",
11375 api_domain: "com.android.foo",
11376 contents: [
11377 "prebuilt_com.google.android.foo",
11378 "prebuilt_com.google.android.foo.v2",
11379 ],
11380 }
11381 `
11382
11383 testCases := []struct {
11384 desc string
11385 selectedApexContributions string
11386 expectedVisibleModuleName string
11387 expectedHiddenModuleNames []string
11388 expectedError string
11389 }{
11390 {
11391 desc: "Source apex is selected, prebuilts should be hidden from make",
11392 selectedApexContributions: "foo.source.contributions",
11393 expectedVisibleModuleName: "com.google.android.foo",
11394 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11395 },
11396 {
11397 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11398 selectedApexContributions: "foo.prebuilt.contributions",
11399 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11400 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11401 },
11402 {
11403 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11404 selectedApexContributions: "foo.prebuilt.v2.contributions",
11405 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11406 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11407 },
11408 {
11409 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11410 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11411 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11412 },
11413 }
11414
11415 for _, tc := range testCases {
11416 preparer := android.GroupFixturePreparers(
11417 android.FixtureMergeMockFs(map[string][]byte{
11418 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11419 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011420 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011421 )
11422 if tc.expectedError != "" {
11423 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11424 testApex(t, bp, preparer)
11425 return
11426 }
11427 ctx := testApex(t, bp, preparer)
11428
Spandan Das3576e762024-01-03 18:57:03 +000011429 // Check that
11430 // 1. The contents of the selected apex_contributions are visible to make
11431 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11432 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11433 }
11434}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011435
Spandan Das85bd4622024-08-01 00:51:20 +000011436// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11437func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011438 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011439 // for a mainline module family, check that only the flagged soong module is visible to make
11440 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11441 variation := func(moduleName string) string {
11442 ret := "android_common_com.android.adservices"
11443 if moduleName == "com.google.android.foo" {
11444 ret = "android_common_com.google.android.foo_com.google.android.foo"
11445 }
11446 return ret
11447 }
11448
11449 for _, visibleModuleName := range visibleModuleNames {
11450 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11451 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11452 }
11453
11454 for _, hiddenModuleName := range hiddenModuleNames {
11455 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11456 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11457
11458 }
11459 }
11460
11461 bp := `
11462 apex_key {
11463 name: "com.android.adservices.key",
11464 public_key: "com.android.adservices.avbpubkey",
11465 private_key: "com.android.adservices.pem",
11466 }
11467
11468 // AOSP source apex
11469 apex {
11470 name: "com.android.adservices",
11471 key: "com.android.adservices.key",
11472 updatable: false,
11473 }
11474
11475 // Prebuilt Google APEX.
11476
11477 prebuilt_apex {
11478 name: "com.google.android.adservices",
11479 apex_name: "com.android.adservices",
11480 src: "com.android.foo-arm.apex",
11481 }
11482
11483 // Another Prebuilt Google APEX
11484 prebuilt_apex {
11485 name: "com.google.android.adservices.v2",
11486 apex_name: "com.android.adservices",
11487 src: "com.android.foo-arm.apex",
11488 }
11489
11490 // APEX contribution modules
11491
11492
11493 apex_contributions {
11494 name: "adservices.prebuilt.contributions",
11495 api_domain: "com.android.adservices",
11496 contents: ["prebuilt_com.google.android.adservices"],
11497 }
11498
11499 apex_contributions {
11500 name: "adservices.prebuilt.v2.contributions",
11501 api_domain: "com.android.adservices",
11502 contents: ["prebuilt_com.google.android.adservices.v2"],
11503 }
11504 `
11505
11506 testCases := []struct {
11507 desc string
11508 selectedApexContributions string
11509 expectedVisibleModuleNames []string
11510 expectedHiddenModuleNames []string
11511 }{
11512 {
11513 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11514 selectedApexContributions: "",
11515 expectedVisibleModuleNames: []string{"com.android.adservices"},
11516 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11517 },
11518 {
11519 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11520 selectedApexContributions: "adservices.prebuilt.contributions",
11521 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11522 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11523 },
11524 {
11525 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11526 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11527 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11528 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11529 },
11530 }
11531
11532 for _, tc := range testCases {
11533 preparer := android.GroupFixturePreparers(
11534 android.FixtureMergeMockFs(map[string][]byte{
11535 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11536 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011537 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011538 )
11539 ctx := testApex(t, bp, preparer)
11540
11541 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11542 }
11543}
11544
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011545func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011546 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011547 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11548 for _, moduleName := range moduleNames {
11549 ret += fmt.Sprintf(`
11550 aconfig_declarations {
11551 name: "%[1]s",
11552 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011553 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011554 srcs: [
11555 "%[1]s.aconfig",
11556 ],
11557 }
11558 java_aconfig_library {
11559 name: "%[1]s-lib",
11560 aconfig_declarations: "%[1]s",
11561 }
11562 `, moduleName)
11563 }
11564 return ret
11565 }
11566
11567 result := android.GroupFixturePreparers(
11568 prepareForApexTest,
11569 java.PrepareForTestWithJavaSdkLibraryFiles,
11570 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011571 ).RunTestWithBp(t, `
11572 java_library {
11573 name: "baz-java-lib",
11574 static_libs: [
11575 "baz-lib",
11576 ],
11577 }
11578 filegroup {
11579 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011580 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011581 ":qux-lib{.generated_srcjars}",
11582 ],
11583 }
11584 filegroup {
11585 name: "qux-another-filegroup",
11586 srcs: [
11587 ":qux-filegroup",
11588 ],
11589 }
11590 java_library {
11591 name: "quux-java-lib",
11592 srcs: [
11593 "a.java",
11594 ],
11595 libs: [
11596 "quux-lib",
11597 ],
11598 }
11599 java_sdk_library {
11600 name: "foo",
11601 srcs: [
11602 ":qux-another-filegroup",
11603 ],
11604 api_packages: ["foo"],
11605 system: {
11606 enabled: true,
11607 },
11608 module_lib: {
11609 enabled: true,
11610 },
11611 test: {
11612 enabled: true,
11613 },
11614 static_libs: [
11615 "bar-lib",
11616 ],
11617 libs: [
11618 "baz-java-lib",
11619 "quux-java-lib",
11620 ],
11621 aconfig_declarations: [
11622 "bar",
11623 ],
11624 }
11625 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11626
11627 m := result.ModuleForTests("foo.stubs.source", "android_common")
11628 outDir := "out/soong/.intermediates"
11629
11630 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11631 // textproto files
11632 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11633
11634 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11635 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11636 // to aconfig.
11637 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11638 "passed as an input",
11639 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11640
11641 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11642 // to metalava as classpath. Thus the cache file provided by the associated
11643 // aconfig_declarations module "baz" should be passed to aconfig.
11644 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11645 "java_aconfig_library passed as an input",
11646 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11647
11648 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11649 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11650 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11651 "input",
11652 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11653
11654 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11655 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11656 // aconfig_declarations module "quux" should not be passed to aconfig.
11657 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11658 "depend on java_aconfig_library not passed as an input",
11659 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11660}
Cole Faust7c991b42024-05-15 11:17:55 -070011661
11662func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011663 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011664 ctx := testApex(t, `
11665 apex {
11666 name: "myapex",
11667 key: "myapex.key",
11668 prebuilts: ["myetc", "myetc2"],
11669 min_sdk_version: "29",
11670 }
11671 apex_key {
11672 name: "myapex.key",
11673 public_key: "testkey.avbpubkey",
11674 private_key: "testkey.pem",
11675 }
11676
11677 prebuilt_etc {
11678 name: "myetc",
11679 src: "myprebuilt",
11680 filename: "myfilename",
11681 }
11682 prebuilt_etc {
11683 name: "myetc2",
11684 sub_dir: "mysubdir",
11685 src: "myprebuilt",
11686 filename: "myfilename",
11687 }
11688 `, withFiles(android.MockFS{
11689 "packages/modules/common/build/allowed_deps.txt": nil,
11690 }))
11691
11692 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11693 data := android.AndroidMkDataForTest(t, ctx, ab)
11694 var builder strings.Builder
11695 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11696 androidMk := builder.String()
11697
11698 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11699 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11700}
Spandan Das50801e22024-05-13 18:29:45 +000011701
11702func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011703 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011704 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11705 args := module.Rule("apexRule").Args
11706 optFlags := args["opt_flags"]
11707 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11708 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11709 }
11710 }
11711
11712 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11713 t.Helper()
11714 found := false
11715 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11716 if dep == wantDep {
11717 found = true
11718 }
11719 })
11720 if !found {
11721 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11722 }
11723 }
11724
11725 ctx := testApex(t, `
11726 apex {
11727 name: "com.android.apex30",
11728 min_sdk_version: "30",
11729 key: "apex30.key",
11730 java_libs: ["javalib"],
11731 }
11732
11733 java_library {
11734 name: "javalib",
11735 srcs: ["A.java"],
11736 apex_available: ["com.android.apex30"],
11737 min_sdk_version: "30",
11738 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011739 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011740 }
11741
11742 override_apex {
11743 name: "com.mycompany.android.apex30",
11744 base: "com.android.apex30",
11745 }
11746
11747 override_apex {
11748 name: "com.mycompany.android.apex31",
11749 base: "com.android.apex30",
11750 min_sdk_version: "31",
11751 }
11752
11753 apex_key {
11754 name: "apex30.key",
11755 public_key: "testkey.avbpubkey",
11756 private_key: "testkey.pem",
11757 }
11758
11759 `, android.FixtureMergeMockFs(android.MockFS{
11760 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11761 }),
11762 )
11763
11764 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11765 checkMinSdkVersion(t, baseModule, "30")
11766
11767 // Override module, but uses same min_sdk_version
11768 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11769 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11770 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11771 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11772
11773 // Override module, uses different min_sdk_version
11774 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11775 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11776 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11777 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11778}
Spandan Das0b28fa02024-05-28 23:40:17 +000011779
11780func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011781 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011782 context := android.GroupFixturePreparers(
11783 android.PrepareForIntegrationTestWithAndroid,
11784 PrepareForTestWithApexBuildComponents,
11785 android.FixtureMergeMockFs(android.MockFS{
11786 "system/sepolicy/apex/foo-file_contexts": nil,
11787 }),
11788 )
11789 res := context.RunTestWithBp(t, `
11790 apex {
11791 name: "foo",
11792 key: "myapex.key",
11793 apex_available_name: "com.android.foo",
11794 variant_version: "0",
11795 updatable: false,
11796 }
11797 apex_key {
11798 name: "myapex.key",
11799 public_key: "testkey.avbpubkey",
11800 private_key: "testkey.pem",
11801 }
11802 prebuilt_apex {
11803 name: "foo",
11804 src: "foo.apex",
11805 prefer: true,
11806 }
11807 override_apex {
11808 name: "myoverrideapex",
11809 base: "foo",
11810 }
11811 `)
11812
11813 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11814}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011815
11816func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011817 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011818 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`, `
11819 apex {
11820 name: "myapex",
11821 key: "myapex.key",
11822 updatable: true,
11823 min_sdk_version: "current",
11824 }
11825
11826 apex_key {
11827 name: "myapex.key",
11828 public_key: "testkey.avbpubkey",
11829 private_key: "testkey.pem",
11830 }
11831 `)
11832}
Spandan Das2f68f192024-07-22 19:25:50 +000011833
11834func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011835 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011836 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11837 result := android.GroupFixturePreparers(
11838 prepareForApexTest,
11839 android.PrepareForTestWithAndroidMk,
11840 android.PrepareForTestWithMakevars,
11841 android.FixtureMergeMockFs(fs),
11842 ).RunTest(t)
11843
11844 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011845 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011846
11847 installRules := result.InstallMakeRulesForTesting(t)
11848
11849 var installedlibRule *android.InstallMakeRule
11850 for i, rule := range installRules {
11851 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11852 if installedlibRule != nil {
11853 t.Errorf("Duplicate install rules for %s", rule.Target)
11854 }
11855 installedlibRule = &installRules[i]
11856 }
11857 }
11858 if installedlibRule == nil {
11859 t.Errorf("No install rule found for installedlib")
11860 return
11861 }
11862
11863 if expectLibfooOnSystemLib {
11864 android.AssertStringListContains(t,
11865 "installedlib doesn't have install dependency on libfoo impl",
11866 installedlibRule.OrderOnlyDeps,
11867 "out/target/product/test_device/system/lib/libfoo.so")
11868 } else {
11869 android.AssertStringListDoesNotContain(t,
11870 "installedlib has install dependency on libfoo stub",
11871 installedlibRule.Deps,
11872 "out/target/product/test_device/system/lib/libfoo.so")
11873 android.AssertStringListDoesNotContain(t,
11874 "installedlib has order-only install dependency on libfoo stub",
11875 installedlibRule.OrderOnlyDeps,
11876 "out/target/product/test_device/system/lib/libfoo.so")
11877 }
11878 }
11879
11880 prebuiltLibfooBp := []byte(`
11881 cc_prebuilt_library {
11882 name: "libfoo",
11883 prefer: true,
11884 srcs: ["libfoo.so"],
11885 stubs: {
11886 versions: ["1"],
11887 },
11888 apex_available: ["apexfoo"],
11889 }
11890 `)
11891
11892 apexfooBp := []byte(`
11893 apex {
11894 name: "apexfoo",
11895 key: "apexfoo.key",
11896 native_shared_libs: ["libfoo"],
11897 updatable: false,
11898 compile_multilib: "both",
11899 }
11900 apex_key {
11901 name: "apexfoo.key",
11902 public_key: "testkey.avbpubkey",
11903 private_key: "testkey.pem",
11904 }
11905 `)
11906
11907 installedlibBp := []byte(`
11908 cc_library {
11909 name: "installedlib",
11910 shared_libs: ["libfoo"],
11911 }
11912 `)
11913
11914 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011915 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011916 testFunc(
11917 t,
11918 /*expectLibfooOnSystemLib=*/ false,
11919 android.MockFS{
11920 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11921 "apexfoo/Android.bp": apexfooBp,
11922 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11923 "Android.bp": installedlibBp,
11924 },
11925 )
11926 })
11927
11928 disabledSourceLibfooBp := []byte(`
11929 cc_library {
11930 name: "libfoo",
11931 enabled: false,
11932 stubs: {
11933 versions: ["1"],
11934 },
11935 apex_available: ["apexfoo"],
11936 }
11937 `)
11938
11939 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011940 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011941 testFunc(
11942 t,
11943 /*expectLibfooOnSystemLib=*/ false,
11944 android.MockFS{
11945 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11946 "impl/Android.bp": disabledSourceLibfooBp,
11947 "apexfoo/Android.bp": apexfooBp,
11948 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11949 "Android.bp": installedlibBp,
11950 },
11951 )
11952 })
11953}
Jihoon Kange246bb72024-09-18 22:26:22 +000011954
11955func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011956 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011957 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11958 // in libs of android_app and java_library does not lead to class loader context device/host
11959 // path mismatch errors.
11960 android.GroupFixturePreparers(
11961 prepareForApexTest,
11962 android.PrepareForIntegrationTestWithAndroid,
11963 PrepareForTestWithApexBuildComponents,
11964 android.FixtureModifyEnv(func(env map[string]string) {
11965 env["DISABLE_CONTAINER_CHECK"] = "true"
11966 }),
11967 withFiles(filesForSdkLibrary),
11968 android.FixtureMergeMockFs(android.MockFS{
11969 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11970 }),
11971 ).RunTestWithBp(t, `
11972 apex {
11973 name: "com.android.foo30",
11974 key: "myapex.key",
11975 updatable: true,
11976 bootclasspath_fragments: [
11977 "foo-bootclasspath-fragment",
11978 ],
11979 java_libs: [
11980 "bar",
11981 ],
11982 apps: [
11983 "bar-app",
11984 ],
11985 min_sdk_version: "30",
11986 }
11987 apex_key {
11988 name: "myapex.key",
11989 public_key: "testkey.avbpubkey",
11990 private_key: "testkey.pem",
11991 }
11992 bootclasspath_fragment {
11993 name: "foo-bootclasspath-fragment",
11994 contents: [
11995 "framework-foo",
11996 ],
11997 apex_available: [
11998 "com.android.foo30",
11999 ],
12000 hidden_api: {
12001 split_packages: ["*"]
12002 },
12003 }
12004
12005 java_sdk_library {
12006 name: "framework-foo",
12007 srcs: [
12008 "A.java"
12009 ],
12010 unsafe_ignore_missing_latest_api: true,
12011 apex_available: [
12012 "com.android.foo30",
12013 ],
12014 compile_dex: true,
12015 sdk_version: "core_current",
12016 shared_library: false,
12017 }
12018
12019 java_library {
12020 name: "bar",
12021 srcs: [
12022 "A.java"
12023 ],
12024 libs: [
12025 "framework-foo.impl",
12026 ],
12027 apex_available: [
12028 "com.android.foo30",
12029 ],
12030 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012031 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012032 }
12033
12034 java_library {
12035 name: "baz",
12036 srcs: [
12037 "A.java"
12038 ],
12039 libs: [
12040 "bar",
12041 ],
12042 sdk_version: "core_current",
12043 }
12044
12045 android_app {
12046 name: "bar-app",
12047 srcs: [
12048 "A.java"
12049 ],
12050 libs: [
12051 "baz",
12052 "framework-foo.impl",
12053 ],
12054 apex_available: [
12055 "com.android.foo30",
12056 ],
12057 sdk_version: "core_current",
12058 min_sdk_version: "30",
12059 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012060 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012061 }
12062 `)
12063}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012064
12065// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12066func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012067 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012068 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12069 apex {
12070 name: "myapex",
12071 key: "myapex.key",
12072 systemserverclasspath_fragments: [
12073 "mysystemserverclasspathfragment",
12074 ],
12075 min_sdk_version: "29",
12076 updatable: true,
12077 system_ext_specific: true,
12078 }
12079
12080 apex_key {
12081 name: "myapex.key",
12082 public_key: "testkey.avbpubkey",
12083 private_key: "testkey.pem",
12084 }
12085
12086 java_library {
12087 name: "foo",
12088 srcs: ["b.java"],
12089 min_sdk_version: "29",
12090 installable: true,
12091 apex_available: [
12092 "myapex",
12093 ],
12094 sdk_version: "current",
12095 }
12096
12097 systemserverclasspath_fragment {
12098 name: "mysystemserverclasspathfragment",
12099 contents: [
12100 "foo",
12101 ],
12102 apex_available: [
12103 "myapex",
12104 ],
12105 }
12106 `,
12107 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12108 )
12109}
Spandan Das72d86c62024-10-15 19:27:41 +000012110
12111// partitions should not package the artifacts that are included inside the apex.
12112func TestFilesystemWithApexDeps(t *testing.T) {
12113 t.Parallel()
12114 result := testApex(t, `
12115 android_filesystem {
12116 name: "myfilesystem",
12117 deps: ["myapex"],
12118 }
12119 apex {
12120 name: "myapex",
12121 key: "myapex.key",
12122 binaries: ["binfoo"],
12123 native_shared_libs: ["libfoo"],
12124 apps: ["appfoo"],
12125 updatable: false,
12126 }
12127 apex_key {
12128 name: "myapex.key",
12129 }
12130 cc_binary {
12131 name: "binfoo",
12132 apex_available: ["myapex"],
12133 }
12134 cc_library {
12135 name: "libfoo",
12136 apex_available: ["myapex"],
12137 }
12138 android_app {
12139 name: "appfoo",
12140 sdk_version: "current",
12141 apex_available: ["myapex"],
12142 }
12143 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12144
12145 partition := result.ModuleForTests("myfilesystem", "android_common")
12146 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12147 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12148}
Colin Crossb614cd42024-10-11 12:52:21 -070012149
12150func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12151 t.Parallel()
12152
12153 extractDepenencyPathFromErrors := func(errs []error) []string {
12154 i := slices.IndexFunc(errs, func(err error) bool {
12155 return strings.Contains(err.Error(), "dependency path:")
12156 })
12157 if i < 0 {
12158 return nil
12159 }
12160 var dependencyPath []string
12161 for _, err := range errs[i+1:] {
12162 s := err.Error()
12163 lastSpace := strings.LastIndexByte(s, ' ')
12164 if lastSpace >= 0 {
12165 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12166 }
12167 }
12168 return dependencyPath
12169 }
12170
12171 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12172 return func(t *testing.T, result *android.TestResult) {
12173 t.Helper()
12174 if len(result.Errs) == 0 {
12175 t.Fatalf("expected errors")
12176 }
12177 t.Log("found errors:")
12178 for _, err := range result.Errs {
12179 t.Log(err)
12180 }
12181 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12182 t.Fatalf("expected error %q, got %q", w, g)
12183 }
12184 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12185 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12186 t.Errorf("expected dependency path %q, got %q", w, g)
12187 }
12188 }
12189 }
12190
12191 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12192 return func(bp *bpmodify.Blueprint) {
12193 m := bp.ModulesByName(module)
12194 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12195 if err != nil {
12196 panic(err)
12197 }
12198 props.AddStringToList(lib)
12199 }
12200 }
12201
12202 bpTemplate := `
12203 apex {
12204 name: "myapex",
12205 key: "myapex.key",
12206 native_shared_libs: ["mylib"],
12207 rust_dyn_libs: ["libmyrust"],
12208 binaries: ["mybin", "myrustbin"],
12209 jni_libs: ["libjni"],
12210 apps: ["myapp"],
12211 updatable: false,
12212 }
12213
12214 apex {
12215 name: "otherapex",
12216 key: "myapex.key",
12217 native_shared_libs: ["libotherapex"],
12218 updatable: false,
12219 }
12220
12221 apex_key {
12222 name: "myapex.key",
12223 public_key: "testkey.avbpubkey",
12224 private_key: "testkey.pem",
12225 }
12226
12227 cc_library {
12228 name: "mylib",
12229 srcs: ["foo.cpp"],
12230 apex_available: ["myapex"],
12231 }
12232
12233 cc_binary {
12234 name: "mybin",
12235 srcs: ["foo.cpp"],
12236 apex_available: ["myapex"],
12237 }
12238
12239 rust_library {
12240 name: "libmyrust",
12241 crate_name: "myrust",
12242 srcs: ["src/lib.rs"],
12243 rustlibs: ["libmyrust_transitive_dylib"],
12244 rlibs: ["libmyrust_transitive_rlib"],
12245 apex_available: ["myapex"],
12246 }
12247
12248 rust_library{
12249 name: "libmyrust_transitive_dylib",
12250 crate_name: "myrust_transitive_dylib",
12251 srcs: ["src/lib.rs"],
12252 apex_available: ["myapex"],
12253 }
12254
12255 rust_library {
12256 name: "libmyrust_transitive_rlib",
12257 crate_name: "myrust_transitive_rlib",
12258 srcs: ["src/lib.rs"],
12259 apex_available: ["myapex"],
12260 }
12261
12262 rust_binary {
12263 name: "myrustbin",
12264 srcs: ["src/main.rs"],
12265 apex_available: ["myapex"],
12266 }
12267
12268 cc_library {
12269 name: "libbar",
12270 sdk_version: "current",
12271 srcs: ["bar.cpp"],
12272 apex_available: ["myapex"],
12273 stl: "none",
12274 }
12275
12276 android_app {
12277 name: "myapp",
12278 jni_libs: ["libembeddedjni"],
12279 use_embedded_native_libs: true,
12280 sdk_version: "current",
12281 apex_available: ["myapex"],
12282 }
12283
12284 cc_library {
12285 name: "libembeddedjni",
12286 sdk_version: "current",
12287 srcs: ["bar.cpp"],
12288 apex_available: ["myapex"],
12289 stl: "none",
12290 }
12291
12292 cc_library {
12293 name: "libjni",
12294 sdk_version: "current",
12295 srcs: ["bar.cpp"],
12296 apex_available: ["myapex"],
12297 stl: "none",
12298 }
12299
12300 cc_library {
12301 name: "libotherapex",
12302 sdk_version: "current",
12303 srcs: ["otherapex.cpp"],
12304 apex_available: ["otherapex"],
12305 stubs: {
12306 symbol_file: "libotherapex.map.txt",
12307 versions: ["1", "2", "3"],
12308 },
12309 stl: "none",
12310 }
12311
12312 cc_library {
12313 name: "libplatform",
12314 sdk_version: "current",
12315 srcs: ["libplatform.cpp"],
12316 stubs: {
12317 symbol_file: "libplatform.map.txt",
12318 versions: ["1", "2", "3"],
12319 },
12320 stl: "none",
12321 system_shared_libs: [],
12322 }
12323 `
12324
12325 testCases := []struct {
12326 name string
12327 bpModifier func(bp *bpmodify.Blueprint)
12328 dependencyPath []string
12329 }{
12330 {
12331 name: "library dependency in other apex",
12332 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12333 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12334 },
12335 {
12336 name: "transitive library dependency in other apex",
12337 bpModifier: func(bp *bpmodify.Blueprint) {
12338 addToSharedLibs("mylib", "libbar")(bp)
12339 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12340 },
12341 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12342 },
12343 {
12344 name: "library dependency in platform",
12345 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12346 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12347 },
12348 {
12349 name: "jni library dependency in other apex",
12350 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12351 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12352 },
12353 {
12354 name: "transitive jni library dependency in other apex",
12355 bpModifier: func(bp *bpmodify.Blueprint) {
12356 addToSharedLibs("libjni", "libbar")(bp)
12357 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12358 },
12359 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12360 },
12361 {
12362 name: "jni library dependency in platform",
12363 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12364 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12365 },
12366 {
12367 name: "transitive jni library dependency in platform",
12368 bpModifier: func(bp *bpmodify.Blueprint) {
12369 addToSharedLibs("libjni", "libbar")(bp)
12370 addToSharedLibs("libbar", "libplatform#impl")(bp)
12371 },
12372 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12373 },
Spandan Das10c41362024-12-03 01:33:09 +000012374 {
12375 name: "app jni library dependency in other apex",
12376 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12377 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12378 },
12379 {
12380 name: "transitive app jni library dependency in other apex",
12381 bpModifier: func(bp *bpmodify.Blueprint) {
12382 addToSharedLibs("libembeddedjni", "libbar")(bp)
12383 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12384 },
12385 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12386 },
12387 {
12388 name: "app jni library dependency in platform",
12389 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12390 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12391 },
12392 {
12393 name: "transitive app jni library dependency in platform",
12394 bpModifier: func(bp *bpmodify.Blueprint) {
12395 addToSharedLibs("libembeddedjni", "libbar")(bp)
12396 addToSharedLibs("libbar", "libplatform#impl")(bp)
12397 },
12398 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12399 },
Colin Crossb614cd42024-10-11 12:52:21 -070012400 {
12401 name: "binary dependency in other apex",
12402 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12403 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12404 },
12405 {
12406 name: "transitive binary dependency in other apex",
12407 bpModifier: func(bp *bpmodify.Blueprint) {
12408 addToSharedLibs("mybin", "libbar")(bp)
12409 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12410 },
12411 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12412 },
12413 {
12414 name: "binary dependency in platform",
12415 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12416 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12417 },
12418 {
12419 name: "transitive binary dependency in platform",
12420 bpModifier: func(bp *bpmodify.Blueprint) {
12421 addToSharedLibs("mybin", "libbar")(bp)
12422 addToSharedLibs("libbar", "libplatform#impl")(bp)
12423 },
12424 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12425 },
12426
12427 {
12428 name: "rust library dependency in other apex",
12429 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12430 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12431 },
12432 {
12433 name: "transitive rust library dependency in other apex",
12434 bpModifier: func(bp *bpmodify.Blueprint) {
12435 addToSharedLibs("libmyrust", "libbar")(bp)
12436 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12437 },
12438 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12439 },
12440 {
12441 name: "rust library dependency in platform",
12442 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12443 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12444 },
12445 {
12446 name: "transitive rust library dependency in platform",
12447 bpModifier: func(bp *bpmodify.Blueprint) {
12448 addToSharedLibs("libmyrust", "libbar")(bp)
12449 addToSharedLibs("libbar", "libplatform#impl")(bp)
12450 },
12451 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12452 },
12453 {
12454 name: "transitive rust library dylib dependency in other apex",
12455 bpModifier: func(bp *bpmodify.Blueprint) {
12456 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12457 },
12458 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12459 },
12460 {
12461 name: "transitive rust library dylib dependency in platform",
12462 bpModifier: func(bp *bpmodify.Blueprint) {
12463 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12464 },
12465 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12466 },
12467 {
12468 name: "transitive rust library rlib dependency in other apex",
12469 bpModifier: func(bp *bpmodify.Blueprint) {
12470 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12471 },
12472 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12473 },
12474 {
12475 name: "transitive rust library rlib dependency in platform",
12476 bpModifier: func(bp *bpmodify.Blueprint) {
12477 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12478 },
12479 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12480 },
12481 {
12482 name: "rust binary dependency in other apex",
12483 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12484 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12485 },
12486 {
12487 name: "transitive rust binary dependency in other apex",
12488 bpModifier: func(bp *bpmodify.Blueprint) {
12489 addToSharedLibs("myrustbin", "libbar")(bp)
12490 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12491 },
12492 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12493 },
12494 {
12495 name: "rust binary dependency in platform",
12496 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12497 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12498 },
12499 {
12500 name: "transitive rust binary dependency in platform",
12501 bpModifier: func(bp *bpmodify.Blueprint) {
12502 addToSharedLibs("myrustbin", "libbar")(bp)
12503 addToSharedLibs("libbar", "libplatform#impl")(bp)
12504 },
12505 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12506 },
12507 }
12508
12509 for _, testCase := range testCases {
12510 t.Run(testCase.name, func(t *testing.T) {
12511 t.Parallel()
12512 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12513 if err != nil {
12514 t.Fatal(err)
12515 }
12516 if testCase.bpModifier != nil {
12517 func() {
12518 defer func() {
12519 if r := recover(); r != nil {
12520 t.Fatalf("panic in bpModifier: %v", r)
12521 }
12522 }()
12523 testCase.bpModifier(bp)
12524 }()
12525 }
12526 android.GroupFixturePreparers(
12527 android.PrepareForTestWithAndroidBuildComponents,
12528 cc.PrepareForTestWithCcBuildComponents,
12529 java.PrepareForTestWithDexpreopt,
12530 rust.PrepareForTestWithRustDefaultModules,
12531 PrepareForTestWithApexBuildComponents,
12532 prepareForTestWithMyapex,
12533 prepareForTestWithOtherapex,
12534 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12535 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12536 }),
12537 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12538 RunTestWithBp(t, bp.String())
12539 })
12540 }
12541}