blob: 6796fca0ffb853e17edd5f32bb90d1e1bae5c3f3 [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
Jooyung Han4495f842023-04-25 16:39:59 +09002424func 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()
2483 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")
Jooyung Han4495f842023-04-25 16:39:59 +09002487
Jooyung Hana0503a52023-08-23 13:12:50 +09002488 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002489 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2490 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002491 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)")
Jooyung Han4495f842023-04-25 16:39:59 +09002495 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)")
2499}
2500
Nouby Mohamed8609a552024-09-04 22:19:51 +00002501func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002502 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002503 ctx := testApex(t, `
2504 apex {
2505 name: "myapex",
2506 key: "myapex.key",
2507 updatable: true,
2508 native_shared_libs: [
2509 "mylib",
2510 "yourlib",
2511 ],
2512 min_sdk_version: "29",
2513 }
2514
2515 apex {
2516 name: "myapex2",
2517 key: "myapex.key",
2518 updatable: false,
2519 native_shared_libs: ["yourlib"],
2520 }
2521
2522 apex_key {
2523 name: "myapex.key",
2524 public_key: "testkey.avbpubkey",
2525 private_key: "testkey.pem",
2526 }
2527
2528 cc_library {
2529 name: "mylib",
2530 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002531 shared_libs: ["libbar", "libbar_rs",],
Nouby Mohamed8609a552024-09-04 22:19:51 +00002532 min_sdk_version: "29",
2533 apex_available: ["myapex"],
2534 }
2535
2536 cc_library {
2537 name: "libbar",
2538 stubs: { versions: ["29", "30"] },
2539 }
2540
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002541 rust_ffi {
2542 name: "libbar_rs",
2543 crate_name: "bar_rs",
2544 srcs: ["bar.rs"],
2545 stubs: { versions: ["29", "30"] },
2546 }
2547
Nouby Mohamed8609a552024-09-04 22:19:51 +00002548 cc_library {
2549 name: "yourlib",
2550 srcs: ["mylib.cpp"],
2551 min_sdk_version: "29",
2552 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2553 }
2554 `, withFiles(android.MockFS{
2555 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2556 }),
2557 android.FixtureModifyProductVariables(
2558 func(variables android.FixtureProductVariables) {
2559 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2560 },
2561 ))
2562
2563 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2564 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2565 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2566 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2567 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2568 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2569
2570 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2571 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2572 myapex.Output("depsinfo/flatlist.txt")), "\n")
2573 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2574 flatlist, "libbar(minSdkVersion:(no version)) (external)")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002575 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2576 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
Nouby Mohamed8609a552024-09-04 22:19:51 +00002577 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2578 flatlist, "mylib:(minSdkVersion:29)")
2579 android.AssertStringListContains(t, "track platform-available lib",
2580 flatlist, "yourlib(minSdkVersion:29)")
2581}
2582
2583func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002584 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002585 ctx := testApex(t, `
2586 apex {
2587 name: "myapex",
2588 key: "myapex.key",
2589 updatable: true,
2590 native_shared_libs: [
2591 "mylib",
2592 "yourlib",
2593 ],
2594 min_sdk_version: "29",
2595 }
2596
2597 apex {
2598 name: "myapex2",
2599 key: "myapex.key",
2600 updatable: false,
2601 native_shared_libs: ["yourlib"],
2602 }
2603
2604 apex_key {
2605 name: "myapex.key",
2606 public_key: "testkey.avbpubkey",
2607 private_key: "testkey.pem",
2608 }
2609
2610 cc_library {
2611 name: "mylib",
2612 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002613 shared_libs: ["libbar", "libbar_rs"],
Nouby Mohamed8609a552024-09-04 22:19:51 +00002614 min_sdk_version: "29",
2615 apex_available: ["myapex"],
2616 }
2617
2618 cc_library {
2619 name: "libbar",
2620 stubs: { versions: ["29", "30"] },
2621 }
2622
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002623 rust_ffi {
2624 name: "libbar_rs",
2625 crate_name: "bar_rs",
2626 srcs: ["bar.rs"],
2627 stubs: { versions: ["29", "30"] },
2628 }
2629
Nouby Mohamed8609a552024-09-04 22:19:51 +00002630 cc_library {
2631 name: "yourlib",
2632 srcs: ["mylib.cpp"],
2633 min_sdk_version: "29",
2634 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2635 }
2636 `, withFiles(android.MockFS{
2637 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2638 "packages/modules/common/build/allowed_deps.txt": nil,
2639 }),
2640 android.FixtureModifyProductVariables(
2641 func(variables android.FixtureProductVariables) {
2642 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2643 },
2644 ))
2645
2646 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2647 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2648 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2649 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2650 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2651 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2652
2653 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2654 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2655 myapex.Output("depsinfo/flatlist.txt")), "\n")
2656 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2657 flatlist, "libbar(minSdkVersion:(no version)) (external)")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002658 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2659 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
Nouby Mohamed8609a552024-09-04 22:19:51 +00002660 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2661 flatlist, "mylib:(minSdkVersion:29)")
2662 android.AssertStringListContains(t, "track platform-available lib",
2663 flatlist, "yourlib(minSdkVersion:29)")
2664}
2665
Jooyung Han4495f842023-04-25 16:39:59 +09002666func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002667 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002668 ctx := testApex(t, `
2669 apex {
2670 name: "myapex",
2671 key: "myapex.key",
2672 updatable: true,
2673 min_sdk_version: "29",
2674 }
2675
2676 apex_key {
2677 name: "myapex.key",
2678 public_key: "testkey.avbpubkey",
2679 private_key: "testkey.pem",
2680 }
2681 `)
2682 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2683 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2684 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2685 }
2686}
2687
Jooyung Han03b51852020-02-26 22:45:42 +09002688func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002690 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002691 apex {
2692 name: "myapex",
2693 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002694 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002695 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002696 }
2697
2698 apex_key {
2699 name: "myapex.key",
2700 public_key: "testkey.avbpubkey",
2701 private_key: "testkey.pem",
2702 }
2703
2704 cc_library {
2705 name: "libx",
2706 system_shared_libs: [],
2707 stl: "none",
2708 apex_available: [ "myapex" ],
2709 stubs: {
2710 versions: ["1", "2"],
2711 },
2712 }
2713
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002714 rust_ffi {
2715 name: "libx_rs",
2716 crate_name: "x_rs",
2717 srcs: ["x.rs"],
2718 apex_available: [ "myapex" ],
2719 stubs: {
2720 versions: ["1", "2"],
2721 },
2722 }
2723
Jooyung Han03b51852020-02-26 22:45:42 +09002724 cc_library {
2725 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002726 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002727 system_shared_libs: [],
2728 stl: "none",
2729 }
2730 `)
2731
2732 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002733 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002734 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2735 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2736 }
2737 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002738 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002739 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2740 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2741 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002742 expectLink("libz", "shared", "libx", "shared_current")
2743 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002744 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2745 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002746 expectNoLink("libz", "shared", "libz", "shared_1")
2747 expectNoLink("libz", "shared", "libz", "shared")
2748}
2749
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002750var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2751 func(variables android.FixtureProductVariables) {
2752 variables.SanitizeDevice = []string{"hwaddress"}
2753 },
2754)
2755
Jooyung Han75568392020-03-20 04:29:24 +09002756func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002757 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002758 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002759 apex {
2760 name: "myapex",
2761 key: "myapex.key",
2762 native_shared_libs: ["libx"],
2763 min_sdk_version: "29",
2764 }
2765
2766 apex_key {
2767 name: "myapex.key",
2768 public_key: "testkey.avbpubkey",
2769 private_key: "testkey.pem",
2770 }
2771
2772 cc_library {
2773 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002774 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002775 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002776 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002777 }
2778
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002779 rust_ffi {
2780 name: "libbar_rs",
2781 crate_name: "bar_rs",
2782 srcs: ["bar.rs"],
2783 stubs: { versions: ["29", "30"] },
2784 }
2785
Jooyung Han03b51852020-02-26 22:45:42 +09002786 cc_library {
2787 name: "libbar",
2788 stubs: {
2789 versions: ["29", "30"],
2790 },
2791 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002792 `,
2793 prepareForTestWithSantitizeHwaddress,
2794 )
Jooyung Han03b51852020-02-26 22:45:42 +09002795 expectLink := func(from, from_variant, to, to_variant string) {
2796 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2797 libFlags := ld.Args["libFlags"]
2798 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2799 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002800 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002801 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002802}
2803
Jooyung Han75568392020-03-20 04:29:24 +09002804func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002805 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002806 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002807 apex {
2808 name: "myapex",
2809 key: "myapex.key",
2810 native_shared_libs: ["libx"],
2811 min_sdk_version: "29",
2812 }
2813
2814 apex_key {
2815 name: "myapex.key",
2816 public_key: "testkey.avbpubkey",
2817 private_key: "testkey.pem",
2818 }
2819
2820 cc_library {
2821 name: "libx",
2822 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002823 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002824 }
Jooyung Han75568392020-03-20 04:29:24 +09002825 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002826
2827 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002828 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002829 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002830 // note that platform variant is not.
2831 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002832 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002833}
2834
Jooyung Han749dc692020-04-15 11:03:39 +09002835func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002836 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002837 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002838 apex {
2839 name: "myapex",
2840 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002841 native_shared_libs: ["mylib"],
2842 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002843 }
2844
2845 apex_key {
2846 name: "myapex.key",
2847 public_key: "testkey.avbpubkey",
2848 private_key: "testkey.pem",
2849 }
Jooyung Han749dc692020-04-15 11:03:39 +09002850
2851 cc_library {
2852 name: "mylib",
2853 srcs: ["mylib.cpp"],
2854 system_shared_libs: [],
2855 stl: "none",
2856 apex_available: [
2857 "myapex",
2858 ],
2859 min_sdk_version: "30",
2860 }
2861 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002862
2863 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 native_shared_libs: ["libfoo.ffi"],
2868 min_sdk_version: "29",
2869 }
2870
2871 apex_key {
2872 name: "myapex.key",
2873 public_key: "testkey.avbpubkey",
2874 private_key: "testkey.pem",
2875 }
2876
2877 rust_ffi_shared {
2878 name: "libfoo.ffi",
2879 srcs: ["foo.rs"],
2880 crate_name: "foo",
2881 apex_available: [
2882 "myapex",
2883 ],
2884 min_sdk_version: "30",
2885 }
2886 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002887
2888 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2889 apex {
2890 name: "myapex",
2891 key: "myapex.key",
2892 java_libs: ["libfoo"],
2893 min_sdk_version: "29",
2894 }
2895
2896 apex_key {
2897 name: "myapex.key",
2898 public_key: "testkey.avbpubkey",
2899 private_key: "testkey.pem",
2900 }
2901
2902 java_import {
2903 name: "libfoo",
2904 jars: ["libfoo.jar"],
2905 apex_available: [
2906 "myapex",
2907 ],
2908 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002909 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002910 }
2911 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002912
2913 // Skip check for modules compiling against core API surface
2914 testApex(t, `
2915 apex {
2916 name: "myapex",
2917 key: "myapex.key",
2918 java_libs: ["libfoo"],
2919 min_sdk_version: "29",
2920 }
2921
2922 apex_key {
2923 name: "myapex.key",
2924 public_key: "testkey.avbpubkey",
2925 private_key: "testkey.pem",
2926 }
2927
2928 java_library {
2929 name: "libfoo",
2930 srcs: ["Foo.java"],
2931 apex_available: [
2932 "myapex",
2933 ],
2934 // Compile against core API surface
2935 sdk_version: "core_current",
2936 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002937 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002938 }
2939 `)
2940
Jooyung Han749dc692020-04-15 11:03:39 +09002941}
2942
2943func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002944 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002945 testApex(t, `
2946 apex {
2947 name: "myapex",
2948 key: "myapex.key",
2949 native_shared_libs: ["libfoo"],
2950 java_libs: ["libbar"],
2951 min_sdk_version: "29",
2952 }
2953
2954 apex_key {
2955 name: "myapex.key",
2956 public_key: "testkey.avbpubkey",
2957 private_key: "testkey.pem",
2958 }
2959
2960 cc_library {
2961 name: "libfoo",
2962 srcs: ["mylib.cpp"],
2963 shared_libs: ["libfoo_dep"],
2964 apex_available: ["myapex"],
2965 min_sdk_version: "29",
2966 }
2967
2968 cc_library {
2969 name: "libfoo_dep",
2970 srcs: ["mylib.cpp"],
2971 apex_available: ["myapex"],
2972 min_sdk_version: "29",
2973 }
2974
2975 java_library {
2976 name: "libbar",
2977 sdk_version: "current",
2978 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002979 static_libs: [
2980 "libbar_dep",
2981 "libbar_import_dep",
2982 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002983 apex_available: ["myapex"],
2984 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002985 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002986 }
2987
2988 java_library {
2989 name: "libbar_dep",
2990 sdk_version: "current",
2991 srcs: ["a.java"],
2992 apex_available: ["myapex"],
2993 min_sdk_version: "29",
2994 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002995
2996 java_import {
2997 name: "libbar_import_dep",
2998 jars: ["libbar.jar"],
2999 apex_available: ["myapex"],
3000 min_sdk_version: "29",
3001 }
Jooyung Han03b51852020-02-26 22:45:42 +09003002 `)
3003}
3004
Colin Cross8ca61c12022-10-06 21:00:14 -07003005func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003006 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07003007 // Tests that an apex dependency with min_sdk_version higher than the
3008 // min_sdk_version of the apex is allowed as long as the dependency's
3009 // min_sdk_version is less than or equal to the api level that the
3010 // architecture was introduced in. In this case, arm64 didn't exist
3011 // until api level 21, so the arm64 code will never need to run on
3012 // an api level 20 device, even if other architectures of the apex
3013 // will.
3014 testApex(t, `
3015 apex {
3016 name: "myapex",
3017 key: "myapex.key",
3018 native_shared_libs: ["libfoo"],
3019 min_sdk_version: "20",
3020 }
3021
3022 apex_key {
3023 name: "myapex.key",
3024 public_key: "testkey.avbpubkey",
3025 private_key: "testkey.pem",
3026 }
3027
3028 cc_library {
3029 name: "libfoo",
3030 srcs: ["mylib.cpp"],
3031 apex_available: ["myapex"],
3032 min_sdk_version: "21",
3033 stl: "none",
3034 }
3035 `)
3036}
3037
Artur Satayev8cf899a2020-04-15 17:29:42 +01003038func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003039 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01003040 testCases := []struct {
3041 name string
3042 expectedError string
3043 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003044 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01003045 }{
3046 {
3047 name: "Non-updatable apex with non-stable dep",
3048 bp: `
3049 apex {
3050 name: "myapex",
3051 java_libs: ["myjar"],
3052 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003053 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003054 }
3055 apex_key {
3056 name: "myapex.key",
3057 public_key: "testkey.avbpubkey",
3058 private_key: "testkey.pem",
3059 }
3060 java_library {
3061 name: "myjar",
3062 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003063 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003064 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003065 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003066 }
3067 `,
3068 },
3069 {
3070 name: "Updatable apex with stable dep",
3071 bp: `
3072 apex {
3073 name: "myapex",
3074 java_libs: ["myjar"],
3075 key: "myapex.key",
3076 updatable: true,
3077 min_sdk_version: "29",
3078 }
3079 apex_key {
3080 name: "myapex.key",
3081 public_key: "testkey.avbpubkey",
3082 private_key: "testkey.pem",
3083 }
3084 java_library {
3085 name: "myjar",
3086 srcs: ["foo/bar/MyClass.java"],
3087 sdk_version: "current",
3088 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09003089 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08003090 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003091 }
3092 `,
3093 },
3094 {
3095 name: "Updatable apex with non-stable dep",
3096 expectedError: "cannot depend on \"myjar\"",
3097 bp: `
3098 apex {
3099 name: "myapex",
3100 java_libs: ["myjar"],
3101 key: "myapex.key",
3102 updatable: true,
3103 }
3104 apex_key {
3105 name: "myapex.key",
3106 public_key: "testkey.avbpubkey",
3107 private_key: "testkey.pem",
3108 }
3109 java_library {
3110 name: "myjar",
3111 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003112 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003113 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003114 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003115 }
3116 `,
3117 },
3118 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003119 name: "Updatable apex with non-stable legacy core platform dep",
3120 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
3121 bp: `
3122 apex {
3123 name: "myapex",
3124 java_libs: ["myjar-uses-legacy"],
3125 key: "myapex.key",
3126 updatable: true,
3127 }
3128 apex_key {
3129 name: "myapex.key",
3130 public_key: "testkey.avbpubkey",
3131 private_key: "testkey.pem",
3132 }
3133 java_library {
3134 name: "myjar-uses-legacy",
3135 srcs: ["foo/bar/MyClass.java"],
3136 sdk_version: "core_platform",
3137 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003138 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003139 }
3140 `,
3141 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
3142 },
3143 {
Paul Duffin043f5e72021-03-05 00:00:01 +00003144 name: "Updatable apex with non-stable transitive dep",
3145 // This is not actually detecting that the transitive dependency is unstable, rather it is
3146 // detecting that the transitive dependency is building against a wider API surface than the
3147 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09003148 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003149 bp: `
3150 apex {
3151 name: "myapex",
3152 java_libs: ["myjar"],
3153 key: "myapex.key",
3154 updatable: true,
3155 }
3156 apex_key {
3157 name: "myapex.key",
3158 public_key: "testkey.avbpubkey",
3159 private_key: "testkey.pem",
3160 }
3161 java_library {
3162 name: "myjar",
3163 srcs: ["foo/bar/MyClass.java"],
3164 sdk_version: "current",
3165 apex_available: ["myapex"],
3166 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003167 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003168 }
3169 java_library {
3170 name: "transitive-jar",
3171 srcs: ["foo/bar/MyClass.java"],
3172 sdk_version: "core_platform",
3173 apex_available: ["myapex"],
3174 }
3175 `,
3176 },
3177 }
3178
3179 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003180 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3181 continue
3182 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003183 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003184 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003185 errorHandler := android.FixtureExpectsNoErrors
3186 if test.expectedError != "" {
3187 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003188 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003189 android.GroupFixturePreparers(
3190 java.PrepareForTestWithJavaDefaultModules,
3191 PrepareForTestWithApexBuildComponents,
3192 prepareForTestWithMyapex,
3193 android.OptionalFixturePreparer(test.preparer),
3194 ).
3195 ExtendWithErrorHandler(errorHandler).
3196 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003197 })
3198 }
3199}
3200
Jooyung Han749dc692020-04-15 11:03:39 +09003201func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3202 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3203 apex {
3204 name: "myapex",
3205 key: "myapex.key",
3206 native_shared_libs: ["mylib"],
3207 min_sdk_version: "29",
3208 }
3209
3210 apex_key {
3211 name: "myapex.key",
3212 public_key: "testkey.avbpubkey",
3213 private_key: "testkey.pem",
3214 }
3215
3216 cc_library {
3217 name: "mylib",
3218 srcs: ["mylib.cpp"],
3219 shared_libs: ["mylib2"],
3220 system_shared_libs: [],
3221 stl: "none",
3222 apex_available: [
3223 "myapex",
3224 ],
3225 min_sdk_version: "29",
3226 }
3227
3228 // indirect part of the apex
3229 cc_library {
3230 name: "mylib2",
3231 srcs: ["mylib.cpp"],
3232 system_shared_libs: [],
3233 stl: "none",
3234 apex_available: [
3235 "myapex",
3236 ],
3237 min_sdk_version: "30",
3238 }
3239 `)
3240}
3241
3242func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003243 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003244 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3245 apex {
3246 name: "myapex",
3247 key: "myapex.key",
3248 apps: ["AppFoo"],
3249 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003250 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003251 }
3252
3253 apex_key {
3254 name: "myapex.key",
3255 public_key: "testkey.avbpubkey",
3256 private_key: "testkey.pem",
3257 }
3258
3259 android_app {
3260 name: "AppFoo",
3261 srcs: ["foo/bar/MyClass.java"],
3262 sdk_version: "current",
3263 min_sdk_version: "29",
3264 system_modules: "none",
3265 stl: "none",
3266 static_libs: ["bar"],
3267 apex_available: [ "myapex" ],
3268 }
3269
3270 java_library {
3271 name: "bar",
3272 sdk_version: "current",
3273 srcs: ["a.java"],
3274 apex_available: [ "myapex" ],
3275 }
3276 `)
3277}
3278
3279func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003280 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003281 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003282 apex {
3283 name: "myapex",
3284 key: "myapex.key",
3285 native_shared_libs: ["mylib"],
3286 min_sdk_version: "29",
3287 }
3288
3289 apex_key {
3290 name: "myapex.key",
3291 public_key: "testkey.avbpubkey",
3292 private_key: "testkey.pem",
3293 }
3294
Colin Crossea91a172024-11-05 16:14:05 -08003295 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003296 cc_library {
3297 name: "mylib",
3298 srcs: ["mylib.cpp"],
3299 shared_libs: ["mylib2"],
3300 system_shared_libs: [],
3301 stl: "none",
3302 apex_available: ["myapex", "otherapex"],
3303 min_sdk_version: "29",
3304 }
3305
3306 cc_library {
3307 name: "mylib2",
3308 srcs: ["mylib.cpp"],
3309 system_shared_libs: [],
3310 stl: "none",
3311 apex_available: ["otherapex"],
3312 stubs: { versions: ["29", "30"] },
3313 min_sdk_version: "30",
3314 }
3315
3316 apex {
3317 name: "otherapex",
3318 key: "myapex.key",
3319 native_shared_libs: ["mylib", "mylib2"],
3320 min_sdk_version: "30",
3321 }
3322 `)
3323 expectLink := func(from, from_variant, to, to_variant string) {
3324 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3325 libFlags := ld.Args["libFlags"]
3326 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3327 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003328 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003329 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003330}
3331
Jooyung Haned124c32021-01-26 11:43:46 +09003332func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003333 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003334 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3335 func(variables android.FixtureProductVariables) {
3336 variables.Platform_sdk_codename = proptools.StringPtr("S")
3337 variables.Platform_version_active_codenames = []string{"S"}
3338 },
3339 )
Jooyung Haned124c32021-01-26 11:43:46 +09003340 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3341 apex {
3342 name: "myapex",
3343 key: "myapex.key",
3344 native_shared_libs: ["libfoo"],
3345 min_sdk_version: "S",
3346 }
3347 apex_key {
3348 name: "myapex.key",
3349 public_key: "testkey.avbpubkey",
3350 private_key: "testkey.pem",
3351 }
3352 cc_library {
3353 name: "libfoo",
3354 shared_libs: ["libbar"],
3355 apex_available: ["myapex"],
3356 min_sdk_version: "29",
3357 }
3358 cc_library {
3359 name: "libbar",
3360 apex_available: ["myapex"],
3361 }
3362 `, withSAsActiveCodeNames)
3363}
3364
3365func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003366 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003367 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3368 variables.Platform_sdk_codename = proptools.StringPtr("S")
3369 variables.Platform_version_active_codenames = []string{"S", "T"}
3370 })
Colin Cross1c460562021-02-16 17:55:47 -08003371 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003372 apex {
3373 name: "myapex",
3374 key: "myapex.key",
3375 native_shared_libs: ["libfoo"],
3376 min_sdk_version: "S",
3377 }
3378 apex_key {
3379 name: "myapex.key",
3380 public_key: "testkey.avbpubkey",
3381 private_key: "testkey.pem",
3382 }
3383 cc_library {
3384 name: "libfoo",
3385 shared_libs: ["libbar"],
3386 apex_available: ["myapex"],
3387 min_sdk_version: "S",
3388 }
3389 cc_library {
3390 name: "libbar",
3391 stubs: {
3392 symbol_file: "libbar.map.txt",
3393 versions: ["30", "S", "T"],
3394 },
3395 }
3396 `, withSAsActiveCodeNames)
3397
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003398 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003399 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3400 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003401 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003402}
3403
Jiyong Park7c2ee712018-12-07 00:42:25 +09003404func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003405 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003406 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003407 apex {
3408 name: "myapex",
3409 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003410 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003411 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003412 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003413 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003414 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003415 }
3416
3417 apex_key {
3418 name: "myapex.key",
3419 public_key: "testkey.avbpubkey",
3420 private_key: "testkey.pem",
3421 }
3422
3423 prebuilt_etc {
3424 name: "myetc",
3425 src: "myprebuilt",
3426 sub_dir: "foo/bar",
3427 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003428
3429 cc_library {
3430 name: "mylib",
3431 srcs: ["mylib.cpp"],
3432 relative_install_path: "foo/bar",
3433 system_shared_libs: [],
3434 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003435 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003436 }
3437
3438 cc_binary {
3439 name: "mybin",
3440 srcs: ["mylib.cpp"],
3441 relative_install_path: "foo/bar",
3442 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003443 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003444 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003445 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003446
3447 rust_binary {
3448 name: "mybin.rust",
3449 srcs: ["foo.rs"],
3450 relative_install_path: "rust_subdir",
3451 apex_available: [ "myapex" ],
3452 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003453 `)
3454
Jooyung Hana0503a52023-08-23 13:12:50 +09003455 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003456 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003457
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003458 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003459 ensureContains(t, cmd, "/etc ")
3460 ensureContains(t, cmd, "/etc/foo ")
3461 ensureContains(t, cmd, "/etc/foo/bar ")
3462 ensureContains(t, cmd, "/lib64 ")
3463 ensureContains(t, cmd, "/lib64/foo ")
3464 ensureContains(t, cmd, "/lib64/foo/bar ")
3465 ensureContains(t, cmd, "/lib ")
3466 ensureContains(t, cmd, "/lib/foo ")
3467 ensureContains(t, cmd, "/lib/foo/bar ")
3468 ensureContains(t, cmd, "/bin ")
3469 ensureContains(t, cmd, "/bin/foo ")
3470 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003471 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003472}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003473
Jooyung Han35155c42020-02-06 17:33:20 +09003474func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003475 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003476 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003477 apex {
3478 name: "myapex",
3479 key: "myapex.key",
3480 multilib: {
3481 both: {
3482 native_shared_libs: ["mylib"],
3483 binaries: ["mybin"],
3484 },
3485 },
3486 compile_multilib: "both",
3487 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003488 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003489 }
3490
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }
3496
3497 cc_library {
3498 name: "mylib",
3499 relative_install_path: "foo/bar",
3500 system_shared_libs: [],
3501 stl: "none",
3502 apex_available: [ "myapex" ],
3503 native_bridge_supported: true,
3504 }
3505
3506 cc_binary {
3507 name: "mybin",
3508 relative_install_path: "foo/bar",
3509 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003510 stl: "none",
3511 apex_available: [ "myapex" ],
3512 native_bridge_supported: true,
3513 compile_multilib: "both", // default is "first" for binary
3514 multilib: {
3515 lib64: {
3516 suffix: "64",
3517 },
3518 },
3519 }
Spandan Das45e40012024-12-02 22:45:48 +00003520 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003521 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003522 "bin/foo/bar/mybin",
3523 "bin/foo/bar/mybin64",
3524 "bin/arm/foo/bar/mybin",
3525 "bin/arm64/foo/bar/mybin64",
3526 "lib/foo/bar/mylib.so",
3527 "lib/arm/foo/bar/mylib.so",
3528 "lib64/foo/bar/mylib.so",
3529 "lib64/arm64/foo/bar/mylib.so",
3530 })
3531}
3532
Jooyung Han85d61762020-06-24 23:50:26 +09003533func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003534 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003535 result := android.GroupFixturePreparers(
3536 prepareForApexTest,
3537 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3538 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003539 apex {
3540 name: "myapex",
3541 key: "myapex.key",
3542 binaries: ["mybin"],
3543 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003544 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003545 }
3546 apex_key {
3547 name: "myapex.key",
3548 public_key: "testkey.avbpubkey",
3549 private_key: "testkey.pem",
3550 }
3551 cc_binary {
3552 name: "mybin",
3553 vendor: true,
3554 shared_libs: ["libfoo"],
3555 }
3556 cc_library {
3557 name: "libfoo",
3558 proprietary: true,
3559 }
3560 `)
3561
Jooyung Hana0503a52023-08-23 13:12:50 +09003562 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003563 "bin/mybin",
3564 "lib64/libfoo.so",
3565 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3566 "lib64/libc++.so",
3567 })
3568
Jooyung Hana0503a52023-08-23 13:12:50 +09003569 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003570 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003571 name := apexBundle.BaseModuleName()
3572 prefix := "TARGET_"
3573 var builder strings.Builder
3574 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003575 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003576 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003577 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003578
Jooyung Hana0503a52023-08-23 13:12:50 +09003579 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003580 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3581 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003582}
3583
Justin Yun13decfb2021-03-08 19:25:55 +09003584func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003585 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003586 ctx := testApex(t, `
3587 apex {
3588 name: "myapex",
3589 key: "myapex.key",
3590 updatable: false,
3591 product_specific: true,
3592 binaries: ["foo"],
3593 }
3594
3595 apex_key {
3596 name: "myapex.key",
3597 public_key: "testkey.avbpubkey",
3598 private_key: "testkey.pem",
3599 }
3600
3601 cc_binary {
3602 name: "foo",
3603 product_available: true,
3604 apex_available: ["myapex"],
3605 srcs: ["foo.cpp"],
3606 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003607 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003608
3609 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003610 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003611 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3612 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3613 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3614 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3615}
3616
Jooyung Han8e5685d2020-09-21 11:02:57 +09003617func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003618 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003619 testCases := []struct {
3620 name string
3621 additionalProp string
3622 }{
3623 {"system apex with prebuilt_firmware", ""},
3624 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3625 }
3626 for _, tc := range testCases {
3627 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003628 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003629 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003630 apex {
3631 name: "myapex",
3632 key: "myapex.key",
3633 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003634 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003635 `+tc.additionalProp+`
3636 }
3637 apex_key {
3638 name: "myapex.key",
3639 public_key: "testkey.avbpubkey",
3640 private_key: "testkey.pem",
3641 }
3642 prebuilt_firmware {
3643 name: "myfirmware",
3644 src: "myfirmware.bin",
3645 filename_from_src: true,
3646 `+tc.additionalProp+`
3647 }
3648 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003649 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003650 "etc/firmware/myfirmware.bin",
3651 })
3652 })
3653 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003654}
3655
Jooyung Hanefb184e2020-06-25 17:14:25 +09003656func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003657 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003658 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003659 apex {
3660 name: "myapex",
3661 key: "myapex.key",
3662 vendor: true,
3663 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003664 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003665 }
3666
3667 apex_key {
3668 name: "myapex.key",
3669 public_key: "testkey.avbpubkey",
3670 private_key: "testkey.pem",
3671 }
3672
3673 cc_library {
3674 name: "mylib",
3675 vendor_available: true,
3676 }
3677 `)
3678
Jooyung Hana0503a52023-08-23 13:12:50 +09003679 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003680 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003681 name := apexBundle.BaseModuleName()
3682 prefix := "TARGET_"
3683 var builder strings.Builder
3684 data.Custom(&builder, name, prefix, "", data)
3685 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003686 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 +09003687}
3688
Jooyung Han2ed99d02020-06-24 23:26:26 +09003689func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003690 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003691 apex {
3692 name: "myapex",
3693 key: "myapex.key",
3694 vintf_fragments: ["fragment.xml"],
3695 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003696 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003697 }
3698 apex_key {
3699 name: "myapex.key",
3700 public_key: "testkey.avbpubkey",
3701 private_key: "testkey.pem",
3702 }
3703 cc_binary {
3704 name: "mybin",
3705 }
3706 `)
3707
Jooyung Hana0503a52023-08-23 13:12:50 +09003708 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003709 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003710 name := apexBundle.BaseModuleName()
3711 prefix := "TARGET_"
3712 var builder strings.Builder
3713 data.Custom(&builder, name, prefix, "", data)
3714 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003715 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003716 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003717}
3718
Jiyong Park16e91a02018-12-20 18:18:08 +09003719func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003720 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003721 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003722 apex {
3723 name: "myapex",
3724 key: "myapex.key",
3725 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003726 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003727 }
3728
3729 apex_key {
3730 name: "myapex.key",
3731 public_key: "testkey.avbpubkey",
3732 private_key: "testkey.pem",
3733 }
3734
3735 cc_library {
3736 name: "mylib",
3737 srcs: ["mylib.cpp"],
3738 system_shared_libs: [],
3739 stl: "none",
3740 stubs: {
3741 versions: ["1", "2", "3"],
3742 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003743 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003744 }
3745
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003746 rust_ffi {
3747 name: "libmylib_rs",
3748 crate_name: "mylib_rs",
3749 srcs: ["mylib.rs"],
3750 stubs: {
3751 versions: ["1", "2", "3"],
3752 },
3753 apex_available: ["myapex"],
3754 }
3755
Jiyong Park16e91a02018-12-20 18:18:08 +09003756 cc_binary {
3757 name: "not_in_apex",
3758 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003759 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003760 static_executable: true,
3761 system_shared_libs: [],
3762 stl: "none",
3763 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003764 `)
3765
Colin Cross7113d202019-11-20 16:39:12 -08003766 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003767
3768 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003769 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003770 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003771}
Jiyong Park9335a262018-12-24 11:31:58 +09003772
3773func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003774 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003775 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003776 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003777 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003778 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003779 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003780 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003781 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003783 }
3784
3785 cc_library {
3786 name: "mylib",
3787 srcs: ["mylib.cpp"],
3788 system_shared_libs: [],
3789 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003790 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003791 }
3792
3793 apex_key {
3794 name: "myapex.key",
3795 public_key: "testkey.avbpubkey",
3796 private_key: "testkey.pem",
3797 }
3798
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003799 android_app_certificate {
3800 name: "myapex.certificate",
3801 certificate: "testkey",
3802 }
3803
3804 android_app_certificate {
3805 name: "myapex.certificate.override",
3806 certificate: "testkey.override",
3807 }
3808
Jiyong Park9335a262018-12-24 11:31:58 +09003809 `)
3810
3811 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003812 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003813
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003814 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3815 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003816 "vendor/foo/devkeys/testkey.avbpubkey")
3817 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003818 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3819 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003820 "vendor/foo/devkeys/testkey.pem")
3821 }
3822
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003823 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003824 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003825 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003826 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003827 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003828 }
3829}
Jiyong Park58e364a2019-01-19 19:24:06 +09003830
Jooyung Hanf121a652019-12-17 14:30:11 +09003831func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003832 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003833 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003834 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003835 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003836 apex {
3837 name: "myapex",
3838 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003839 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003840 }
3841 apex_key {
3842 name: "myapex.key",
3843 public_key: "testkey.avbpubkey",
3844 private_key: "testkey.pem",
3845 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003846 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003847 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3848 if actual := rule.Args["certificates"]; actual != expected {
3849 t.Errorf("certificates should be %q, not %q", expected, actual)
3850 }
3851 })
3852 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003853 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003854 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003855 apex {
3856 name: "myapex_keytest",
3857 key: "myapex.key",
3858 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003859 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003860 }
3861 apex_key {
3862 name: "myapex.key",
3863 public_key: "testkey.avbpubkey",
3864 private_key: "testkey.pem",
3865 }
3866 android_app_certificate {
3867 name: "myapex.certificate.override",
3868 certificate: "testkey.override",
3869 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003870 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003871 expected := "testkey.override.x509.pem testkey.override.pk8"
3872 if actual := rule.Args["certificates"]; actual != expected {
3873 t.Errorf("certificates should be %q, not %q", expected, actual)
3874 }
3875 })
3876 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003877 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003878 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003879 apex {
3880 name: "myapex",
3881 key: "myapex.key",
3882 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003883 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003884 }
3885 apex_key {
3886 name: "myapex.key",
3887 public_key: "testkey.avbpubkey",
3888 private_key: "testkey.pem",
3889 }
3890 android_app_certificate {
3891 name: "myapex.certificate",
3892 certificate: "testkey",
3893 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003894 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003895 expected := "testkey.x509.pem testkey.pk8"
3896 if actual := rule.Args["certificates"]; actual != expected {
3897 t.Errorf("certificates should be %q, not %q", expected, actual)
3898 }
3899 })
3900 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003901 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003902 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003903 apex {
3904 name: "myapex_keytest",
3905 key: "myapex.key",
3906 file_contexts: ":myapex-file_contexts",
3907 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003908 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003909 }
3910 apex_key {
3911 name: "myapex.key",
3912 public_key: "testkey.avbpubkey",
3913 private_key: "testkey.pem",
3914 }
3915 android_app_certificate {
3916 name: "myapex.certificate.override",
3917 certificate: "testkey.override",
3918 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003919 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003920 expected := "testkey.override.x509.pem testkey.override.pk8"
3921 if actual := rule.Args["certificates"]; actual != expected {
3922 t.Errorf("certificates should be %q, not %q", expected, actual)
3923 }
3924 })
3925 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003926 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003927 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003928 apex {
3929 name: "myapex",
3930 key: "myapex.key",
3931 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003932 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003933 }
3934 apex_key {
3935 name: "myapex.key",
3936 public_key: "testkey.avbpubkey",
3937 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003938 }`,
3939 android.MockFS{
3940 "vendor/foo/devkeys/testkey.x509.pem": nil,
3941 }.AddToFixture(),
3942 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003943 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003944 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3945 if actual := rule.Args["certificates"]; actual != expected {
3946 t.Errorf("certificates should be %q, not %q", expected, actual)
3947 }
3948 })
3949 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003950 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003951 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003952 apex {
3953 name: "myapex_keytest",
3954 key: "myapex.key",
3955 file_contexts: ":myapex-file_contexts",
3956 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003957 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003958 }
3959 apex_key {
3960 name: "myapex.key",
3961 public_key: "testkey.avbpubkey",
3962 private_key: "testkey.pem",
3963 }
3964 android_app_certificate {
3965 name: "myapex.certificate.override",
3966 certificate: "testkey.override",
3967 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003968 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003969 expected := "testkey.override.x509.pem testkey.override.pk8"
3970 if actual := rule.Args["certificates"]; actual != expected {
3971 t.Errorf("certificates should be %q, not %q", expected, actual)
3972 }
3973 })
3974}
3975
Jiyong Park58e364a2019-01-19 19:24:06 +09003976func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003977 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003978 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003979 apex {
3980 name: "myapex",
3981 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003982 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003983 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003984 }
3985
3986 apex {
3987 name: "otherapex",
3988 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003989 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003990 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003991 }
3992
3993 apex_key {
3994 name: "myapex.key",
3995 public_key: "testkey.avbpubkey",
3996 private_key: "testkey.pem",
3997 }
3998
3999 cc_library {
4000 name: "mylib",
4001 srcs: ["mylib.cpp"],
4002 system_shared_libs: [],
4003 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004004 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004005 "myapex",
4006 "otherapex",
4007 ],
Jooyung Han24282772020-03-21 23:20:55 +09004008 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09004009 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09004010 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09004011 cc_library {
4012 name: "mylib2",
4013 srcs: ["mylib.cpp"],
4014 system_shared_libs: [],
4015 stl: "none",
4016 apex_available: [
4017 "myapex",
4018 "otherapex",
4019 ],
Colin Crossaede88c2020-08-11 12:17:01 -07004020 static_libs: ["mylib3"],
4021 recovery_available: true,
4022 min_sdk_version: "29",
4023 }
4024 cc_library {
4025 name: "mylib3",
4026 srcs: ["mylib.cpp"],
4027 system_shared_libs: [],
4028 stl: "none",
4029 apex_available: [
4030 "myapex",
4031 "otherapex",
4032 ],
Colin Crossaede88c2020-08-11 12:17:01 -07004033 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09004034 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09004035 }
Jiyong Park58e364a2019-01-19 19:24:06 +09004036 `)
4037
Jooyung Hanc87a0592020-03-02 17:44:33 +09004038 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08004039 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09004040 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09004041
Vinh Tranf9754732023-01-19 22:41:46 -05004042 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07004043 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09004044 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09004045
Vinh Tranf9754732023-01-19 22:41:46 -05004046 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07004047 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09004048 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09004049
Colin Crossaede88c2020-08-11 12:17:01 -07004050 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
4051 // each variant defines additional macros to distinguish which apex variant it is built for
4052
4053 // non-APEX variant does not have __ANDROID_APEX__ defined
4054 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
4055 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
4056
Vinh Tranf9754732023-01-19 22:41:46 -05004057 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07004058 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
4059 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07004060
Jooyung Hanc87a0592020-03-02 17:44:33 +09004061 // non-APEX variant does not have __ANDROID_APEX__ defined
4062 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
4063 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
4064
Vinh Tranf9754732023-01-19 22:41:46 -05004065 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07004066 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09004067 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09004068}
Jiyong Park7e636d02019-01-28 16:16:54 +09004069
4070func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004071 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004072 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09004073 apex {
4074 name: "myapex",
4075 key: "myapex.key",
4076 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004077 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09004078 }
4079
4080 apex_key {
4081 name: "myapex.key",
4082 public_key: "testkey.avbpubkey",
4083 private_key: "testkey.pem",
4084 }
4085
4086 cc_library_headers {
4087 name: "mylib_headers",
4088 export_include_dirs: ["my_include"],
4089 system_shared_libs: [],
4090 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09004091 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004092 }
4093
4094 cc_library {
4095 name: "mylib",
4096 srcs: ["mylib.cpp"],
4097 system_shared_libs: [],
4098 stl: "none",
4099 header_libs: ["mylib_headers"],
4100 export_header_lib_headers: ["mylib_headers"],
4101 stubs: {
4102 versions: ["1", "2", "3"],
4103 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004104 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004105 }
4106
4107 cc_library {
4108 name: "otherlib",
4109 srcs: ["mylib.cpp"],
4110 system_shared_libs: [],
4111 stl: "none",
4112 shared_libs: ["mylib"],
4113 }
4114 `)
4115
Colin Cross7113d202019-11-20 16:39:12 -08004116 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09004117
4118 // Ensure that the include path of the header lib is exported to 'otherlib'
4119 ensureContains(t, cFlags, "-Imy_include")
4120}
Alex Light9670d332019-01-29 18:07:33 -08004121
Jiyong Park7cd10e32020-01-14 09:22:18 +09004122type fileInApex struct {
4123 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00004124 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09004125 isLink bool
4126}
4127
Jooyung Han1724d582022-12-21 10:17:44 +09004128func (f fileInApex) String() string {
4129 return f.src + ":" + f.path
4130}
4131
4132func (f fileInApex) match(expectation string) bool {
4133 parts := strings.Split(expectation, ":")
4134 if len(parts) == 1 {
4135 match, _ := path.Match(parts[0], f.path)
4136 return match
4137 }
4138 if len(parts) == 2 {
4139 matchSrc, _ := path.Match(parts[0], f.src)
4140 matchDst, _ := path.Match(parts[1], f.path)
4141 return matchSrc && matchDst
4142 }
4143 panic("invalid expected file specification: " + expectation)
4144}
4145
Jooyung Hana57af4a2020-01-23 05:36:59 +00004146func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09004147 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09004148 module := ctx.ModuleForTests(moduleName, variant)
4149 apexRule := module.MaybeRule("apexRule")
4150 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09004151 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004152 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09004153 for _, cmd := range strings.Split(copyCmds, "&&") {
4154 cmd = strings.TrimSpace(cmd)
4155 if cmd == "" {
4156 continue
4157 }
4158 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00004159 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09004160 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09004161 switch terms[0] {
4162 case "mkdir":
4163 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09004164 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004165 t.Fatal("copyCmds contains invalid cp command", cmd)
4166 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004167 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004168 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004169 isLink = false
4170 case "ln":
4171 if len(terms) != 3 && len(terms) != 4 {
4172 // ln LINK TARGET or ln -s LINK TARGET
4173 t.Fatal("copyCmds contains invalid ln command", cmd)
4174 }
4175 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004176 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004177 isLink = true
4178 default:
4179 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4180 }
4181 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004182 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004183 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004184 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004185 }
Jooyung Han1724d582022-12-21 10:17:44 +09004186 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004187 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004188 }
4189 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004190 return ret
4191}
4192
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004193func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004194 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004195 var failed bool
4196 var surplus []string
4197 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004198 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004199 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004200 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004201 if file.match(expected) {
4202 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004203 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004204 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004205 }
4206 }
Jooyung Han1724d582022-12-21 10:17:44 +09004207 if !matchFound {
4208 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004209 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004210 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004211
Jooyung Han31c470b2019-10-18 16:26:59 +09004212 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004213 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004214 t.Log("surplus files", surplus)
4215 failed = true
4216 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004217
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004218 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004219 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004220 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004221 if !filesMatched[expected] {
4222 missing = append(missing, expected)
4223 }
4224 }
4225 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004226 t.Log("missing files", missing)
4227 failed = true
4228 }
4229 if failed {
4230 t.Fail()
4231 }
4232}
4233
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004234func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4235 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4236}
4237
4238func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004239 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004240 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4241 if deapexer.Output != nil {
4242 outputs = append(outputs, deapexer.Output.String())
4243 }
4244 for _, output := range deapexer.ImplicitOutputs {
4245 outputs = append(outputs, output.String())
4246 }
4247 actualFiles := make([]fileInApex, 0, len(outputs))
4248 for _, output := range outputs {
4249 dir := "/deapexer/"
4250 pos := strings.LastIndex(output, dir)
4251 if pos == -1 {
4252 t.Fatal("Unknown deapexer output ", output)
4253 }
4254 path := output[pos+len(dir):]
4255 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4256 }
4257 assertFileListEquals(t, files, actualFiles)
4258}
4259
Jooyung Han39edb6c2019-11-06 16:53:07 +09004260func vndkLibrariesTxtFiles(vers ...string) (result string) {
4261 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004262 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004263 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004264 prebuilt_etc {
4265 name: "` + txt + `.libraries.` + v + `.txt",
4266 src: "dummy.txt",
4267 }
4268 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004269 }
4270 }
4271 return
4272}
4273
Jooyung Han344d5432019-08-23 11:17:39 +09004274func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004275 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004276 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004277 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004278 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004279 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004280 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004281 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004282 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004283 }
4284
4285 apex_key {
4286 name: "myapex.key",
4287 public_key: "testkey.avbpubkey",
4288 private_key: "testkey.pem",
4289 }
4290
Jooyung Han31c470b2019-10-18 16:26:59 +09004291 vndk_prebuilt_shared {
4292 name: "libvndk27",
4293 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004294 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004295 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004296 vndk: {
4297 enabled: true,
4298 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004299 target_arch: "arm64",
4300 arch: {
4301 arm: {
4302 srcs: ["libvndk27_arm.so"],
4303 },
4304 arm64: {
4305 srcs: ["libvndk27_arm64.so"],
4306 },
4307 },
Colin Cross2807f002021-03-02 10:15:29 -08004308 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004309 }
4310
4311 vndk_prebuilt_shared {
4312 name: "libvndk27",
4313 version: "27",
4314 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004315 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004316 vndk: {
4317 enabled: true,
4318 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004319 target_arch: "x86_64",
4320 arch: {
4321 x86: {
4322 srcs: ["libvndk27_x86.so"],
4323 },
4324 x86_64: {
4325 srcs: ["libvndk27_x86_64.so"],
4326 },
4327 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004328 }
4329 `+vndkLibrariesTxtFiles("27"),
4330 withFiles(map[string][]byte{
4331 "libvndk27_arm.so": nil,
4332 "libvndk27_arm64.so": nil,
4333 "libvndk27_x86.so": nil,
4334 "libvndk27_x86_64.so": nil,
4335 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004336
Jooyung Hana0503a52023-08-23 13:12:50 +09004337 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004338 "lib/libvndk27_arm.so",
4339 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004340 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004341 })
Jooyung Han344d5432019-08-23 11:17:39 +09004342}
4343
Jooyung Han90eee022019-10-01 20:02:42 +09004344func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004346 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004347 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004348 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004349 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004350 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004351 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004352 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004353 }
4354 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004355 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004356 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004357 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004358 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004359 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004360 }
4361 apex_key {
4362 name: "myapex.key",
4363 public_key: "testkey.avbpubkey",
4364 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004365 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004366
4367 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004368 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004369 apexManifestRule := module.Rule("apexManifestRule")
4370 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004371 }
4372
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004373 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004374 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004375}
4376
Jooyung Han344d5432019-08-23 11:17:39 +09004377func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004378 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004379 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004380 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004381 name: "com.android.vndk.v30",
4382 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004383 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004384 native_bridge_supported: true,
4385 }
4386
4387 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004388 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004389 public_key: "testkey.avbpubkey",
4390 private_key: "testkey.pem",
4391 }
4392
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004393 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004394 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004395 version: "30",
4396 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004397 srcs: ["mylib.cpp"],
4398 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004399 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004400 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004401 vndk: {
4402 enabled: true,
4403 },
Jooyung Han344d5432019-08-23 11:17:39 +09004404 }
4405 `)
4406}
4407
Jooyung Han31c470b2019-10-18 16:26:59 +09004408func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004409 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004410 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004411 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004412 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004413 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004414 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004415 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004416 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004417 }
4418
4419 apex_key {
4420 name: "myapex.key",
4421 public_key: "testkey.avbpubkey",
4422 private_key: "testkey.pem",
4423 }
4424
4425 vndk_prebuilt_shared {
4426 name: "libvndk27",
4427 version: "27",
4428 target_arch: "arm",
4429 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004430 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004431 vndk: {
4432 enabled: true,
4433 },
4434 arch: {
4435 arm: {
4436 srcs: ["libvndk27.so"],
4437 }
4438 },
4439 }
4440
4441 vndk_prebuilt_shared {
4442 name: "libvndk27",
4443 version: "27",
4444 target_arch: "arm",
4445 binder32bit: true,
4446 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004447 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004448 vndk: {
4449 enabled: true,
4450 },
4451 arch: {
4452 arm: {
4453 srcs: ["libvndk27binder32.so"],
4454 }
4455 },
Colin Cross2807f002021-03-02 10:15:29 -08004456 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004457 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004458 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004459 withFiles(map[string][]byte{
4460 "libvndk27.so": nil,
4461 "libvndk27binder32.so": nil,
4462 }),
4463 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004464 android.FixtureModifyConfig(func(config android.Config) {
4465 target := android.Target{
4466 Os: android.Android,
4467 Arch: android.Arch{
4468 ArchType: android.Arm,
4469 ArchVariant: "armv7-a-neon",
4470 Abi: []string{"armeabi-v7a"},
4471 },
4472 NativeBridge: android.NativeBridgeDisabled,
4473 NativeBridgeHostArchName: "",
4474 NativeBridgeRelativePath: "",
4475 }
4476 config.Targets[android.Android] = []android.Target{target}
4477 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004478 }),
4479 )
4480
Jooyung Hana0503a52023-08-23 13:12:50 +09004481 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004482 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004483 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004484 })
4485}
4486
Jooyung Hane1633032019-08-01 17:41:43 +09004487func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004488 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004489 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004490 apex {
4491 name: "myapex_nodep",
4492 key: "myapex.key",
4493 native_shared_libs: ["lib_nodep"],
4494 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004495 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004496 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004497 }
4498
4499 apex {
4500 name: "myapex_dep",
4501 key: "myapex.key",
4502 native_shared_libs: ["lib_dep"],
4503 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004504 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004505 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004506 }
4507
4508 apex {
4509 name: "myapex_provider",
4510 key: "myapex.key",
4511 native_shared_libs: ["libfoo"],
4512 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004513 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004514 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004515 }
4516
4517 apex {
4518 name: "myapex_selfcontained",
4519 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004520 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004521 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004522 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004523 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004524 }
4525
4526 apex_key {
4527 name: "myapex.key",
4528 public_key: "testkey.avbpubkey",
4529 private_key: "testkey.pem",
4530 }
4531
4532 cc_library {
4533 name: "lib_nodep",
4534 srcs: ["mylib.cpp"],
4535 system_shared_libs: [],
4536 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004537 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004538 }
4539
4540 cc_library {
4541 name: "lib_dep",
4542 srcs: ["mylib.cpp"],
4543 shared_libs: ["libfoo"],
4544 system_shared_libs: [],
4545 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004546 apex_available: [
4547 "myapex_dep",
4548 "myapex_provider",
4549 "myapex_selfcontained",
4550 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004551 }
4552
4553 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004554 name: "lib_dep_on_bar",
4555 srcs: ["mylib.cpp"],
4556 shared_libs: ["libbar"],
4557 system_shared_libs: [],
4558 stl: "none",
4559 apex_available: [
4560 "myapex_selfcontained",
4561 ],
4562 }
4563
4564
4565 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004566 name: "libfoo",
4567 srcs: ["mytest.cpp"],
4568 stubs: {
4569 versions: ["1"],
4570 },
4571 system_shared_libs: [],
4572 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004573 apex_available: [
4574 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004575 ],
4576 }
4577
4578 cc_library {
4579 name: "libbar",
4580 srcs: ["mytest.cpp"],
4581 stubs: {
4582 versions: ["1"],
4583 },
4584 system_shared_libs: [],
4585 stl: "none",
4586 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004587 "myapex_selfcontained",
4588 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004589 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004590
Jooyung Hane1633032019-08-01 17:41:43 +09004591 `)
4592
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004593 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004594 var provideNativeLibs, requireNativeLibs []string
4595
Jooyung Hana0503a52023-08-23 13:12:50 +09004596 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004597 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4598 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004599 ensureListEmpty(t, provideNativeLibs)
4600 ensureListEmpty(t, requireNativeLibs)
4601
Jooyung Hana0503a52023-08-23 13:12:50 +09004602 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004603 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4604 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004605 ensureListEmpty(t, provideNativeLibs)
4606 ensureListContains(t, requireNativeLibs, "libfoo.so")
4607
Jooyung Hana0503a52023-08-23 13:12:50 +09004608 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004609 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4610 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004611 ensureListContains(t, provideNativeLibs, "libfoo.so")
4612 ensureListEmpty(t, requireNativeLibs)
4613
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004615 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4616 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004617 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004618 ensureListEmpty(t, requireNativeLibs)
4619}
4620
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004621func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004622 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004623 ctx := testApex(t, `
4624 apex {
4625 name: "myapex",
4626 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004627 native_shared_libs: ["mylib"],
4628 updatable: false,
4629 }
4630
4631 apex_key {
4632 name: "myapex.key",
4633 public_key: "testkey.avbpubkey",
4634 private_key: "testkey.pem",
4635 }
4636
4637 cc_library {
4638 name: "mylib",
4639 srcs: ["mylib.cpp"],
4640 system_shared_libs: [],
4641 stl: "none",
4642 apex_available: [
4643 "//apex_available:platform",
4644 "myapex",
4645 ],
4646 }
4647 `, android.FixtureMergeEnv(map[string]string{
4648 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4649 }))
4650
Jooyung Hana0503a52023-08-23 13:12:50 +09004651 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004652 apexManifestRule := module.Rule("apexManifestRule")
4653 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4654}
4655
Vinh Tran8f5310f2022-10-07 18:16:47 -04004656func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004657 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004658 testCases := []struct {
4659 compileMultiLibProp string
4660 containedLibs []string
4661 notContainedLibs []string
4662 }{
4663 {
4664 containedLibs: []string{
4665 "image.apex/lib64/mylib.so",
4666 "image.apex/lib/mylib.so",
4667 },
4668 compileMultiLibProp: `compile_multilib: "both",`,
4669 },
4670 {
4671 containedLibs: []string{"image.apex/lib64/mylib.so"},
4672 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4673 compileMultiLibProp: `compile_multilib: "first",`,
4674 },
4675 {
4676 containedLibs: []string{"image.apex/lib64/mylib.so"},
4677 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4678 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4679 },
4680 {
4681 containedLibs: []string{"image.apex/lib64/mylib.so"},
4682 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4683 compileMultiLibProp: `compile_multilib: "64",`,
4684 },
4685 {
4686 containedLibs: []string{"image.apex/lib/mylib.so"},
4687 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4688 compileMultiLibProp: `compile_multilib: "32",`,
4689 },
4690 }
4691 for _, testCase := range testCases {
4692 ctx := testApex(t, fmt.Sprintf(`
4693 apex {
4694 name: "myapex",
4695 key: "myapex.key",
4696 %s
4697 native_shared_libs: ["mylib"],
4698 updatable: false,
4699 }
4700 apex_key {
4701 name: "myapex.key",
4702 public_key: "testkey.avbpubkey",
4703 private_key: "testkey.pem",
4704 }
4705 cc_library {
4706 name: "mylib",
4707 srcs: ["mylib.cpp"],
4708 apex_available: [
4709 "//apex_available:platform",
4710 "myapex",
4711 ],
4712 }
4713 `, testCase.compileMultiLibProp),
4714 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004715 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004716 apexRule := module.Rule("apexRule")
4717 copyCmds := apexRule.Args["copy_commands"]
4718 for _, containedLib := range testCase.containedLibs {
4719 ensureContains(t, copyCmds, containedLib)
4720 }
4721 for _, notContainedLib := range testCase.notContainedLibs {
4722 ensureNotContains(t, copyCmds, notContainedLib)
4723 }
4724 }
4725}
4726
Alex Light0851b882019-02-07 13:20:53 -08004727func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004728 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004729 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004730 apex {
4731 name: "myapex",
4732 key: "myapex.key",
4733 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004734 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004735 }
4736
4737 apex_key {
4738 name: "myapex.key",
4739 public_key: "testkey.avbpubkey",
4740 private_key: "testkey.pem",
4741 }
4742
4743 cc_library {
4744 name: "mylib_common",
4745 srcs: ["mylib.cpp"],
4746 system_shared_libs: [],
4747 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004748 apex_available: [
4749 "//apex_available:platform",
4750 "myapex",
4751 ],
Alex Light0851b882019-02-07 13:20:53 -08004752 }
4753 `)
4754
Jooyung Hana0503a52023-08-23 13:12:50 +09004755 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004756 apexRule := module.Rule("apexRule")
4757 copyCmds := apexRule.Args["copy_commands"]
4758
4759 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4760 t.Log("Apex was a test apex!")
4761 t.Fail()
4762 }
4763 // Ensure that main rule creates an output
4764 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4765
4766 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004767 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004768
4769 // Ensure that both direct and indirect deps are copied into apex
4770 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4771
Colin Cross7113d202019-11-20 16:39:12 -08004772 // Ensure that the platform variant ends with _shared
4773 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004774
Colin Cross56a83212020-09-15 18:30:11 -07004775 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004776 t.Log("Found mylib_common not in any apex!")
4777 t.Fail()
4778 }
4779}
4780
4781func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004782 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004783 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004784 apex_test {
4785 name: "myapex",
4786 key: "myapex.key",
4787 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004788 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004789 }
4790
4791 apex_key {
4792 name: "myapex.key",
4793 public_key: "testkey.avbpubkey",
4794 private_key: "testkey.pem",
4795 }
4796
4797 cc_library {
4798 name: "mylib_common_test",
4799 srcs: ["mylib.cpp"],
4800 system_shared_libs: [],
4801 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004802 // TODO: remove //apex_available:platform
4803 apex_available: [
4804 "//apex_available:platform",
4805 "myapex",
4806 ],
Alex Light0851b882019-02-07 13:20:53 -08004807 }
4808 `)
4809
Jooyung Hana0503a52023-08-23 13:12:50 +09004810 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004811 apexRule := module.Rule("apexRule")
4812 copyCmds := apexRule.Args["copy_commands"]
4813
4814 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4815 t.Log("Apex was not a test apex!")
4816 t.Fail()
4817 }
4818 // Ensure that main rule creates an output
4819 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4820
4821 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004822 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004823
4824 // Ensure that both direct and indirect deps are copied into apex
4825 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4826
Colin Cross7113d202019-11-20 16:39:12 -08004827 // Ensure that the platform variant ends with _shared
4828 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004829}
4830
Jooyung Han85707de2023-12-01 14:21:13 +09004831func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004832 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004833 ctx := testApex(t, `
4834 apex {
4835 name: "myapex",
4836 key: "myapex.key",
4837 updatable: false,
4838 binaries: ["mybin"],
4839 }
4840 apex {
4841 name: "myvendorapex",
4842 key: "myapex.key",
4843 file_contexts: "myvendorapex_file_contexts",
4844 vendor: true,
4845 updatable: false,
4846 binaries: ["mybin"],
4847 }
4848 apex_key {
4849 name: "myapex.key",
4850 public_key: "testkey.avbpubkey",
4851 private_key: "testkey.pem",
4852 }
4853 cc_binary {
4854 name: "mybin",
4855 vendor_available: true,
4856 system_shared_libs: [],
4857 stl: "none",
4858 shared_libs: ["libz"],
4859 apex_available: ["//apex_available:anyapex"],
4860 }
4861 cc_library {
4862 name: "libz",
4863 vendor_available: true,
4864 system_shared_libs: [],
4865 stl: "none",
4866 stubs: {
4867 versions: ["28", "30"],
4868 },
4869 target: {
4870 vendor: {
4871 no_stubs: true,
4872 },
4873 },
4874 }
4875 `, withFiles(map[string][]byte{
4876 "myvendorapex_file_contexts": nil,
4877 }))
4878
4879 // libz provides stubs for core variant.
4880 {
4881 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4882 "bin/mybin",
4883 })
4884 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4885 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4886 }
4887 // libz doesn't provide stubs for vendor variant.
4888 {
4889 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4890 "bin/mybin",
4891 "lib64/libz.so",
4892 })
4893 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4894 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4895 }
4896}
4897
Alex Light9670d332019-01-29 18:07:33 -08004898func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004899 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004900 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004901 apex {
4902 name: "myapex",
4903 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004904 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004905 multilib: {
4906 first: {
4907 native_shared_libs: ["mylib_common"],
4908 }
4909 },
4910 target: {
4911 android: {
4912 multilib: {
4913 first: {
4914 native_shared_libs: ["mylib"],
4915 }
4916 }
4917 },
4918 host: {
4919 multilib: {
4920 first: {
4921 native_shared_libs: ["mylib2"],
4922 }
4923 }
4924 }
4925 }
4926 }
4927
4928 apex_key {
4929 name: "myapex.key",
4930 public_key: "testkey.avbpubkey",
4931 private_key: "testkey.pem",
4932 }
4933
4934 cc_library {
4935 name: "mylib",
4936 srcs: ["mylib.cpp"],
4937 system_shared_libs: [],
4938 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004939 // TODO: remove //apex_available:platform
4940 apex_available: [
4941 "//apex_available:platform",
4942 "myapex",
4943 ],
Alex Light9670d332019-01-29 18:07:33 -08004944 }
4945
4946 cc_library {
4947 name: "mylib_common",
4948 srcs: ["mylib.cpp"],
4949 system_shared_libs: [],
4950 stl: "none",
4951 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004952 // TODO: remove //apex_available:platform
4953 apex_available: [
4954 "//apex_available:platform",
4955 "myapex",
4956 ],
Alex Light9670d332019-01-29 18:07:33 -08004957 }
4958
4959 cc_library {
4960 name: "mylib2",
4961 srcs: ["mylib.cpp"],
4962 system_shared_libs: [],
4963 stl: "none",
4964 compile_multilib: "first",
4965 }
4966 `)
4967
Jooyung Hana0503a52023-08-23 13:12:50 +09004968 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004969 copyCmds := apexRule.Args["copy_commands"]
4970
4971 // Ensure that main rule creates an output
4972 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4973
4974 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004975 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4976 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4977 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004978
4979 // Ensure that both direct and indirect deps are copied into apex
4980 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4981 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4982 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4983
Colin Cross7113d202019-11-20 16:39:12 -08004984 // Ensure that the platform variant ends with _shared
4985 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4986 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4987 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004988}
Jiyong Park04480cf2019-02-06 00:16:29 +09004989
Jiyong Park59140302020-12-14 18:44:04 +09004990func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004992 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004993 apex {
4994 name: "myapex",
4995 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004996 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004997 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004998 arch: {
4999 arm64: {
5000 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07005001 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09005002 },
5003 x86_64: {
5004 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07005005 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09005006 },
5007 }
5008 }
5009
5010 apex_key {
5011 name: "myapex.key",
5012 public_key: "testkey.avbpubkey",
5013 private_key: "testkey.pem",
5014 }
5015
5016 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07005017 name: "mylib.generic",
5018 srcs: ["mylib.cpp"],
5019 system_shared_libs: [],
5020 stl: "none",
5021 // TODO: remove //apex_available:platform
5022 apex_available: [
5023 "//apex_available:platform",
5024 "myapex",
5025 ],
5026 }
5027
5028 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09005029 name: "mylib.arm64",
5030 srcs: ["mylib.cpp"],
5031 system_shared_libs: [],
5032 stl: "none",
5033 // TODO: remove //apex_available:platform
5034 apex_available: [
5035 "//apex_available:platform",
5036 "myapex",
5037 ],
5038 }
5039
5040 cc_library {
5041 name: "mylib.x64",
5042 srcs: ["mylib.cpp"],
5043 system_shared_libs: [],
5044 stl: "none",
5045 // TODO: remove //apex_available:platform
5046 apex_available: [
5047 "//apex_available:platform",
5048 "myapex",
5049 ],
5050 }
5051 `)
5052
Jooyung Hana0503a52023-08-23 13:12:50 +09005053 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09005054 copyCmds := apexRule.Args["copy_commands"]
5055
5056 // Ensure that apex variant is created for the direct dep
5057 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07005058 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09005059 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
5060
5061 // Ensure that both direct and indirect deps are copied into apex
5062 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
5063 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
5064}
5065
Jiyong Park04480cf2019-02-06 00:16:29 +09005066func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005067 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005068 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09005069 apex {
5070 name: "myapex",
5071 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00005072 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005073 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00005074 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09005075 }
5076
5077 apex_key {
5078 name: "myapex.key",
5079 public_key: "testkey.avbpubkey",
5080 private_key: "testkey.pem",
5081 }
5082
5083 sh_binary {
5084 name: "myscript",
5085 src: "mylib.cpp",
5086 filename: "myscript.sh",
5087 sub_dir: "script",
5088 }
5089 `)
5090
Jooyung Hana0503a52023-08-23 13:12:50 +09005091 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09005092 copyCmds := apexRule.Args["copy_commands"]
5093
5094 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
5095}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005096
Jooyung Han91df2082019-11-20 01:49:42 +09005097func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005098 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09005099 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005100 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005101 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005102 {"", "system"},
5103 {"product_specific: true", "product"},
5104 {"soc_specific: true", "vendor"},
5105 {"proprietary: true", "vendor"},
5106 {"vendor: true", "vendor"},
5107 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005108 }
5109 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005110 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005111 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005112 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005113 apex {
5114 name: "myapex",
5115 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005116 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005117 `+tc.propName+`
5118 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005119
Jooyung Han91df2082019-11-20 01:49:42 +09005120 apex_key {
5121 name: "myapex.key",
5122 public_key: "testkey.avbpubkey",
5123 private_key: "testkey.pem",
5124 }
5125 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005126
Jooyung Hana0503a52023-08-23 13:12:50 +09005127 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08005128 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005129 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005130 if actual != expected {
5131 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5132 }
Jooyung Han91df2082019-11-20 01:49:42 +09005133 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005134 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005135}
Jiyong Park67882562019-03-21 01:11:21 +09005136
Jooyung Han580eb4f2020-06-24 19:33:06 +09005137func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005138 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005139 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005140 apex {
5141 name: "myapex",
5142 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005143 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005144 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005145
Jooyung Han580eb4f2020-06-24 19:33:06 +09005146 apex_key {
5147 name: "myapex.key",
5148 public_key: "testkey.avbpubkey",
5149 private_key: "testkey.pem",
5150 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005151 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005152 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005153 rule := module.Output("file_contexts")
5154 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5155}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005156
Jooyung Han580eb4f2020-06-24 19:33:06 +09005157func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005158 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005159 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005160 apex {
5161 name: "myapex",
5162 key: "myapex.key",
5163 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005164 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005165 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005166
Jooyung Han580eb4f2020-06-24 19:33:06 +09005167 apex_key {
5168 name: "myapex.key",
5169 public_key: "testkey.avbpubkey",
5170 private_key: "testkey.pem",
5171 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005172 `, withFiles(map[string][]byte{
5173 "my_own_file_contexts": nil,
5174 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005175}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005176
Jooyung Han580eb4f2020-06-24 19:33:06 +09005177func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005178 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005179 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005180 apex {
5181 name: "myapex",
5182 key: "myapex.key",
5183 product_specific: true,
5184 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005185 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005186 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005187
Jooyung Han580eb4f2020-06-24 19:33:06 +09005188 apex_key {
5189 name: "myapex.key",
5190 public_key: "testkey.avbpubkey",
5191 private_key: "testkey.pem",
5192 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005193 `)
5194
Colin Cross1c460562021-02-16 17:55:47 -08005195 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005196 apex {
5197 name: "myapex",
5198 key: "myapex.key",
5199 product_specific: true,
5200 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005201 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005202 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005203
Jooyung Han580eb4f2020-06-24 19:33:06 +09005204 apex_key {
5205 name: "myapex.key",
5206 public_key: "testkey.avbpubkey",
5207 private_key: "testkey.pem",
5208 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005209 `, withFiles(map[string][]byte{
5210 "product_specific_file_contexts": nil,
5211 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005212 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005213 rule := module.Output("file_contexts")
5214 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5215}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005216
Jooyung Han580eb4f2020-06-24 19:33:06 +09005217func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005218 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005219 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005220 apex {
5221 name: "myapex",
5222 key: "myapex.key",
5223 product_specific: true,
5224 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005225 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005226 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005227
Jooyung Han580eb4f2020-06-24 19:33:06 +09005228 apex_key {
5229 name: "myapex.key",
5230 public_key: "testkey.avbpubkey",
5231 private_key: "testkey.pem",
5232 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005233
Jooyung Han580eb4f2020-06-24 19:33:06 +09005234 filegroup {
5235 name: "my-file-contexts",
5236 srcs: ["product_specific_file_contexts"],
5237 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005238 `, withFiles(map[string][]byte{
5239 "product_specific_file_contexts": nil,
5240 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005241 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005242 rule := module.Output("file_contexts")
5243 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005244}
5245
Jiyong Park67882562019-03-21 01:11:21 +09005246func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005247 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005248 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005249 apex_key {
5250 name: "myapex.key",
5251 public_key: ":my.avbpubkey",
5252 private_key: ":my.pem",
5253 product_specific: true,
5254 }
5255
5256 filegroup {
5257 name: "my.avbpubkey",
5258 srcs: ["testkey2.avbpubkey"],
5259 }
5260
5261 filegroup {
5262 name: "my.pem",
5263 srcs: ["testkey2.pem"],
5264 }
5265 `)
5266
5267 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5268 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005269 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005270 if actual_pubkey != expected_pubkey {
5271 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5272 }
5273 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005274 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005275 if actual_privkey != expected_privkey {
5276 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5277 }
5278}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005279
5280func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005281 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005282 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005283 prebuilt_apex {
5284 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005285 arch: {
5286 arm64: {
5287 src: "myapex-arm64.apex",
5288 },
5289 arm: {
5290 src: "myapex-arm.apex",
5291 },
5292 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005293 }
5294 `)
5295
Wei Li340ee8e2022-03-18 17:33:24 -07005296 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5297 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005298
Jiyong Parkc95714e2019-03-29 14:23:10 +09005299 expectedInput := "myapex-arm64.apex"
5300 if prebuilt.inputApex.String() != expectedInput {
5301 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5302 }
Wei Li340ee8e2022-03-18 17:33:24 -07005303 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5304 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5305 rule := testingModule.Rule("genProvenanceMetaData")
5306 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5307 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5308 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5309 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005310
5311 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5312 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005313}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005314
Paul Duffinc0609c62021-03-01 17:27:16 +00005315func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005316 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005317 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005318 prebuilt_apex {
5319 name: "myapex",
5320 }
5321 `)
5322}
5323
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005324func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005325 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005326 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005327 prebuilt_apex {
5328 name: "myapex",
5329 src: "myapex-arm.apex",
5330 filename: "notmyapex.apex",
5331 }
5332 `)
5333
Wei Li340ee8e2022-03-18 17:33:24 -07005334 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5335 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005336
5337 expected := "notmyapex.apex"
5338 if p.installFilename != expected {
5339 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5340 }
Wei Li340ee8e2022-03-18 17:33:24 -07005341 rule := testingModule.Rule("genProvenanceMetaData")
5342 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5343 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5344 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5345 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005346}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005347
Samiul Islam7c02e262021-09-08 17:48:28 +01005348func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005349 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005350 testApex(t, `
5351 apex_set {
5352 name: "com.company.android.myapex",
5353 apex_name: "com.android.myapex",
5354 set: "company-myapex.apks",
5355 filename: "com.company.android.myapex.apex"
5356 }
5357 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5358
5359 testApex(t, `
5360 apex_set {
5361 name: "com.company.android.myapex",
5362 apex_name: "com.android.myapex",
5363 set: "company-myapex.apks",
5364 filename: "com.company.android.myapex.capex"
5365 }
5366 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5367
5368 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5369 apex_set {
5370 name: "com.company.android.myapex",
5371 apex_name: "com.android.myapex",
5372 set: "company-myapex.apks",
5373 filename: "some-random-suffix"
5374 }
5375 `)
5376}
5377
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005378func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005379 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005380 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005381 prebuilt_apex {
5382 name: "myapex.prebuilt",
5383 src: "myapex-arm.apex",
5384 overrides: [
5385 "myapex",
5386 ],
5387 }
5388 `)
5389
Wei Li340ee8e2022-03-18 17:33:24 -07005390 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5391 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005392
5393 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005394 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005395 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005396 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005397 }
Wei Li340ee8e2022-03-18 17:33:24 -07005398 rule := testingModule.Rule("genProvenanceMetaData")
5399 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5400 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5401 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5402 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005403}
5404
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005405func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005406 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005407 testApex(t, `
5408 prebuilt_apex {
5409 name: "com.company.android.myapex",
5410 apex_name: "com.android.myapex",
5411 src: "company-myapex-arm.apex",
5412 }
5413 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5414
5415 testApex(t, `
5416 apex_set {
5417 name: "com.company.android.myapex",
5418 apex_name: "com.android.myapex",
5419 set: "company-myapex.apks",
5420 }
5421 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5422}
5423
5424func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005425 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005426 _ = android.GroupFixturePreparers(
5427 java.PrepareForTestWithJavaDefaultModules,
5428 PrepareForTestWithApexBuildComponents,
5429 android.FixtureWithRootAndroidBp(`
5430 platform_bootclasspath {
5431 name: "platform-bootclasspath",
5432 fragments: [
5433 {
5434 apex: "com.android.art",
5435 module: "art-bootclasspath-fragment",
5436 },
5437 ],
5438 }
5439
5440 prebuilt_apex {
5441 name: "com.company.android.art",
5442 apex_name: "com.android.art",
5443 src: "com.company.android.art-arm.apex",
5444 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5445 }
5446
5447 prebuilt_bootclasspath_fragment {
5448 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005449 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005450 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005451 hidden_api: {
5452 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5453 metadata: "my-bootclasspath-fragment/metadata.csv",
5454 index: "my-bootclasspath-fragment/index.csv",
5455 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5456 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5457 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005458 }
5459
5460 java_import {
5461 name: "core-oj",
5462 jars: ["prebuilt.jar"],
5463 }
5464 `),
5465 ).RunTest(t)
5466}
5467
Spandan Das59a4a2b2024-01-09 21:35:56 +00005468// A minimal context object for use with DexJarBuildPath
5469type moduleErrorfTestCtx struct {
5470}
5471
5472func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5473}
5474
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005475func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005476 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005477 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005478 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005479 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5480 // is disabled.
5481 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005482
5483 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5484 // file creation.
5485 java.FixtureConfigureBootJars("platform:foo"),
5486 android.FixtureModifyMockFS(func(fs android.MockFS) {
5487 fs["platform/Android.bp"] = []byte(`
5488 java_library {
5489 name: "foo",
5490 srcs: ["Test.java"],
5491 compile_dex: true,
5492 }
5493 `)
5494 fs["platform/Test.java"] = nil
5495 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005496 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005497
Paul Duffin40a3f652021-07-19 13:11:24 +01005498 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005499 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005500 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005501 var rule android.TestingBuildParams
5502
5503 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5504 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005505 }
5506
Paul Duffin40a3f652021-07-19 13:11:24 +01005507 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5508 t.Helper()
5509 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5510 var rule android.TestingBuildParams
5511
5512 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5513 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5514 }
5515
Paul Duffin89f570a2021-06-16 01:42:33 +01005516 fragment := java.ApexVariantReference{
5517 Apex: proptools.StringPtr("myapex"),
5518 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5519 }
5520
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005521 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005522 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005523 bp := `
5524 prebuilt_apex {
5525 name: "myapex",
5526 arch: {
5527 arm64: {
5528 src: "myapex-arm64.apex",
5529 },
5530 arm: {
5531 src: "myapex-arm.apex",
5532 },
5533 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005534 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5535 }
5536
5537 prebuilt_bootclasspath_fragment {
5538 name: "my-bootclasspath-fragment",
5539 contents: ["libfoo", "libbar"],
5540 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005541 hidden_api: {
5542 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5543 metadata: "my-bootclasspath-fragment/metadata.csv",
5544 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005545 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5546 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5547 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005548 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005549 }
5550
Spandan Das52c01a12024-09-20 01:09:48 +00005551 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005552 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005553 public: {
5554 jars: ["libfoo.jar"],
5555 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005556 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005557 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005558 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005559 }
Paul Duffin37856732021-02-26 14:24:15 +00005560
5561 java_sdk_library_import {
5562 name: "libbar",
5563 public: {
5564 jars: ["libbar.jar"],
5565 },
5566 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005567 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005568 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005569 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005570 `
5571
Paul Duffin89f570a2021-06-16 01:42:33 +01005572 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005573
Paul Duffin537ea3d2021-05-14 10:38:00 +01005574 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005575 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005576 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005577 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005578 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005579 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 +01005580 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005581 })
5582
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005583 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005584 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005585 bp := `
5586 apex_set {
5587 name: "myapex",
5588 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005589 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005590 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5591 }
5592
Paul Duffin89f570a2021-06-16 01:42:33 +01005593 prebuilt_bootclasspath_fragment {
5594 name: "my-bootclasspath-fragment",
5595 contents: ["libfoo", "libbar"],
5596 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005597 hidden_api: {
5598 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5599 metadata: "my-bootclasspath-fragment/metadata.csv",
5600 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005601 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5602 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5603 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005604 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005605 }
5606
Liz Kammer2dc72442023-04-20 10:10:48 -04005607 prebuilt_systemserverclasspath_fragment {
5608 name: "my-systemserverclasspath-fragment",
5609 contents: ["libbaz"],
5610 apex_available: ["myapex"],
5611 }
5612
Spandan Das52c01a12024-09-20 01:09:48 +00005613 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005614 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005615 public: {
5616 jars: ["libfoo.jar"],
5617 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005618 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005619 shared_library: false,
5620 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005621 }
5622
Spandan Das52c01a12024-09-20 01:09:48 +00005623
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005624 java_sdk_library_import {
5625 name: "libbar",
5626 public: {
5627 jars: ["libbar.jar"],
5628 },
5629 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005630 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005631 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005632 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005633
5634 java_sdk_library_import {
5635 name: "libbaz",
5636 public: {
5637 jars: ["libbaz.jar"],
5638 },
5639 apex_available: ["myapex"],
5640 shared_library: false,
5641 permitted_packages: ["baz"],
5642 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005643 `
5644
Paul Duffin89f570a2021-06-16 01:42:33 +01005645 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005646
Paul Duffin537ea3d2021-05-14 10:38:00 +01005647 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005648 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005649 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005650 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005651 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005652 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 +01005653 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005654
5655 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5656
5657 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005658 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005659 "myjavalib.myapex",
5660 "libfoo.myapex",
5661 "libbar.myapex",
5662 "libbaz.myapex",
5663 }
5664 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5665 for i, e := range mkEntries {
5666 g := e.OverrideName
5667 if w := overrideNames[i]; w != g {
5668 t.Errorf("Expected override name %q, got %q", w, g)
5669 }
5670 }
5671
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005672 })
5673
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005674 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005675 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005676 bp := `
5677 prebuilt_apex {
5678 name: "myapex",
5679 arch: {
5680 arm64: {
5681 src: "myapex-arm64.apex",
5682 },
5683 arm: {
5684 src: "myapex-arm.apex",
5685 },
5686 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005687 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5688 }
5689
5690 prebuilt_bootclasspath_fragment {
5691 name: "my-bootclasspath-fragment",
5692 contents: ["libfoo", "libbar"],
5693 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005694 hidden_api: {
5695 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5696 metadata: "my-bootclasspath-fragment/metadata.csv",
5697 index: "my-bootclasspath-fragment/index.csv",
5698 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5699 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5700 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005701 }
5702
5703 java_import {
5704 name: "libfoo",
5705 jars: ["libfoo.jar"],
5706 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005707 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005708 }
5709
5710 java_library {
5711 name: "libfoo",
5712 srcs: ["foo/bar/MyClass.java"],
5713 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005714 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005715 }
Paul Duffin37856732021-02-26 14:24:15 +00005716
5717 java_sdk_library_import {
5718 name: "libbar",
5719 public: {
5720 jars: ["libbar.jar"],
5721 },
5722 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005723 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005724 }
5725
5726 java_sdk_library {
5727 name: "libbar",
5728 srcs: ["foo/bar/MyClass.java"],
5729 unsafe_ignore_missing_latest_api: true,
5730 apex_available: ["myapex"],
5731 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005732 `
5733
5734 // In this test the source (java_library) libfoo is active since the
5735 // prebuilt (java_import) defaults to prefer:false. However the
5736 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5737 // find the dex boot jar in it. We either need to disable the source libfoo
5738 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005739 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005740 // dexbootjar check is skipped if AllowMissingDependencies is true
5741 preparerAllowMissingDeps := android.GroupFixturePreparers(
5742 preparer,
5743 android.PrepareForTestWithAllowMissingDependencies,
5744 )
5745 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005746 })
5747
5748 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005749 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005750 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005751 apex {
5752 name: "myapex",
5753 key: "myapex.key",
5754 updatable: false,
5755 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5756 }
5757
5758 apex_key {
5759 name: "myapex.key",
5760 public_key: "testkey.avbpubkey",
5761 private_key: "testkey.pem",
5762 }
5763
5764 bootclasspath_fragment {
5765 name: "my-bootclasspath-fragment",
5766 contents: ["libfoo", "libbar"],
5767 apex_available: ["myapex"],
5768 hidden_api: {
5769 split_packages: ["*"],
5770 },
5771 }
5772
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005773 prebuilt_apex {
5774 name: "myapex",
5775 arch: {
5776 arm64: {
5777 src: "myapex-arm64.apex",
5778 },
5779 arm: {
5780 src: "myapex-arm.apex",
5781 },
5782 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005783 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5784 }
5785
5786 prebuilt_bootclasspath_fragment {
5787 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005788 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005789 contents: ["libfoo", "libbar"],
5790 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005791 hidden_api: {
5792 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5793 metadata: "my-bootclasspath-fragment/metadata.csv",
5794 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005795 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5796 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5797 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005798 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005799 }
5800
Spandan Das52c01a12024-09-20 01:09:48 +00005801 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005802 name: "libfoo",
5803 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005804 public: {
5805 jars: ["libfoo.jar"],
5806 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005807 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005808 shared_library: false,
5809 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005810 }
5811
5812 java_library {
5813 name: "libfoo",
5814 srcs: ["foo/bar/MyClass.java"],
5815 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005816 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005817 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005818 }
Paul Duffin37856732021-02-26 14:24:15 +00005819
5820 java_sdk_library_import {
5821 name: "libbar",
5822 prefer: true,
5823 public: {
5824 jars: ["libbar.jar"],
5825 },
5826 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005827 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005828 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005829 }
5830
5831 java_sdk_library {
5832 name: "libbar",
5833 srcs: ["foo/bar/MyClass.java"],
5834 unsafe_ignore_missing_latest_api: true,
5835 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005836 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005837 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005838 `
5839
Paul Duffin89f570a2021-06-16 01:42:33 +01005840 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005841
Paul Duffin537ea3d2021-05-14 10:38:00 +01005842 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005843 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005844 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005845 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005846 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005847 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 +01005848 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005849 })
5850
5851 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005852 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005853 bp := `
5854 apex {
5855 name: "myapex",
5856 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005857 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005858 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005859 }
5860
5861 apex_key {
5862 name: "myapex.key",
5863 public_key: "testkey.avbpubkey",
5864 private_key: "testkey.pem",
5865 }
5866
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005867 bootclasspath_fragment {
5868 name: "my-bootclasspath-fragment",
5869 contents: ["libfoo", "libbar"],
5870 apex_available: ["myapex"],
5871 hidden_api: {
5872 split_packages: ["*"],
5873 },
5874 }
5875
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005876 prebuilt_apex {
5877 name: "myapex",
5878 arch: {
5879 arm64: {
5880 src: "myapex-arm64.apex",
5881 },
5882 arm: {
5883 src: "myapex-arm.apex",
5884 },
5885 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005886 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5887 }
5888
5889 prebuilt_bootclasspath_fragment {
5890 name: "my-bootclasspath-fragment",
5891 contents: ["libfoo", "libbar"],
5892 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005893 hidden_api: {
5894 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5895 metadata: "my-bootclasspath-fragment/metadata.csv",
5896 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005897 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5898 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5899 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005900 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005901 }
5902
5903 java_import {
5904 name: "libfoo",
5905 jars: ["libfoo.jar"],
5906 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005907 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005908 }
5909
5910 java_library {
5911 name: "libfoo",
5912 srcs: ["foo/bar/MyClass.java"],
5913 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005914 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005915 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005916 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005917 }
Paul Duffin37856732021-02-26 14:24:15 +00005918
5919 java_sdk_library_import {
5920 name: "libbar",
5921 public: {
5922 jars: ["libbar.jar"],
5923 },
5924 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005925 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005926 }
5927
5928 java_sdk_library {
5929 name: "libbar",
5930 srcs: ["foo/bar/MyClass.java"],
5931 unsafe_ignore_missing_latest_api: true,
5932 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005933 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005934 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005935 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005936 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005937 `
5938
Paul Duffin89f570a2021-06-16 01:42:33 +01005939 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005940
Paul Duffin537ea3d2021-05-14 10:38:00 +01005941 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005942 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005943 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5944 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005945 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5946 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 +01005947 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005948 })
5949
5950 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005951 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005952 bp := `
5953 apex {
5954 name: "myapex",
5955 enabled: false,
5956 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005957 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005958 }
5959
5960 apex_key {
5961 name: "myapex.key",
5962 public_key: "testkey.avbpubkey",
5963 private_key: "testkey.pem",
5964 }
5965
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005966 bootclasspath_fragment {
5967 name: "my-bootclasspath-fragment",
5968 enabled: false,
5969 contents: ["libfoo", "libbar"],
5970 apex_available: ["myapex"],
5971 hidden_api: {
5972 split_packages: ["*"],
5973 },
5974 }
5975
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005976 prebuilt_apex {
5977 name: "myapex",
5978 arch: {
5979 arm64: {
5980 src: "myapex-arm64.apex",
5981 },
5982 arm: {
5983 src: "myapex-arm.apex",
5984 },
5985 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005986 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5987 }
5988
5989 prebuilt_bootclasspath_fragment {
5990 name: "my-bootclasspath-fragment",
5991 contents: ["libfoo", "libbar"],
5992 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005993 hidden_api: {
5994 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5995 metadata: "my-bootclasspath-fragment/metadata.csv",
5996 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005997 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5998 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5999 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01006000 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006001 }
6002
6003 java_import {
6004 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006005 jars: ["libfoo.jar"],
6006 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01006007 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006008 }
6009
6010 java_library {
6011 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006012 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006013 srcs: ["foo/bar/MyClass.java"],
6014 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006015 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006016 }
Paul Duffin37856732021-02-26 14:24:15 +00006017
6018 java_sdk_library_import {
6019 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00006020 public: {
6021 jars: ["libbar.jar"],
6022 },
6023 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01006024 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01006025 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00006026 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00006027 }
6028
6029 java_sdk_library {
6030 name: "libbar",
6031 srcs: ["foo/bar/MyClass.java"],
6032 unsafe_ignore_missing_latest_api: true,
6033 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006034 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00006035 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006036 `
Cole Fausta963b942024-04-11 17:43:00 -07006037 // This test disables libbar, which causes the ComponentDepsMutator to add
6038 // deps on libbar.stubs and other sub-modules that don't exist. We can
6039 // enable AllowMissingDependencies to work around that, but enabling that
6040 // causes extra checks for missing source files to dex_bootjars, so add those
6041 // to the mock fs as well.
6042 preparer2 := android.GroupFixturePreparers(
6043 preparer,
6044 android.PrepareForTestWithAllowMissingDependencies,
6045 android.FixtureMergeMockFs(map[string][]byte{
6046 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07006047 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07006048 }),
6049 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006050
Cole Fausta963b942024-04-11 17:43:00 -07006051 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00006052
Paul Duffin537ea3d2021-05-14 10:38:00 +01006053 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00006054 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01006055 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01006056 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01006057 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01006058 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 +01006059 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006060 })
Spandan Das3a392012024-01-17 18:26:27 +00006061
Spandan Dasf2c10572024-02-27 04:49:52 +00006062 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006063 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00006064 bp := `
6065 // Source
6066 apex {
6067 name: "myapex",
6068 enabled: false,
6069 key: "myapex.key",
6070 bootclasspath_fragments: ["my-bootclasspath-fragment"],
6071 }
6072
6073 apex_key {
6074 name: "myapex.key",
6075 public_key: "testkey.avbpubkey",
6076 private_key: "testkey.pem",
6077 }
6078
6079 // Prebuilt
6080 prebuilt_apex {
6081 name: "myapex.v1",
6082 source_apex_name: "myapex",
6083 arch: {
6084 arm64: {
6085 src: "myapex-arm64.apex",
6086 },
6087 arm: {
6088 src: "myapex-arm.apex",
6089 },
6090 },
6091 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6092 prefer: true,
6093 }
6094 prebuilt_apex {
6095 name: "myapex.v2",
6096 source_apex_name: "myapex",
6097 arch: {
6098 arm64: {
6099 src: "myapex-arm64.apex",
6100 },
6101 arm: {
6102 src: "myapex-arm.apex",
6103 },
6104 },
6105 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6106 prefer: true,
6107 }
6108
6109 prebuilt_bootclasspath_fragment {
6110 name: "my-bootclasspath-fragment",
6111 contents: ["libfoo", "libbar"],
6112 apex_available: ["myapex"],
6113 hidden_api: {
6114 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6115 metadata: "my-bootclasspath-fragment/metadata.csv",
6116 index: "my-bootclasspath-fragment/index.csv",
6117 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6118 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6119 },
6120 prefer: true,
6121 }
6122
6123 java_import {
6124 name: "libfoo",
6125 jars: ["libfoo.jar"],
6126 apex_available: ["myapex"],
6127 prefer: true,
6128 }
6129 java_import {
6130 name: "libbar",
6131 jars: ["libbar.jar"],
6132 apex_available: ["myapex"],
6133 prefer: true,
6134 }
6135 `
6136
Spandan Dasf2c10572024-02-27 04:49:52 +00006137 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 +00006138 })
6139
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006140}
6141
Roland Levillain630846d2019-06-26 12:48:34 +01006142func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006143 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006144 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006145 apex_test {
6146 name: "myapex",
6147 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006148 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006149 tests: [
6150 "mytest",
6151 ],
6152 }
6153
6154 apex_key {
6155 name: "myapex.key",
6156 public_key: "testkey.avbpubkey",
6157 private_key: "testkey.pem",
6158 }
6159
Liz Kammer1c14a212020-05-12 15:26:55 -07006160 filegroup {
6161 name: "fg",
6162 srcs: [
6163 "baz",
6164 "bar/baz"
6165 ],
6166 }
6167
Roland Levillain630846d2019-06-26 12:48:34 +01006168 cc_test {
6169 name: "mytest",
6170 gtest: false,
6171 srcs: ["mytest.cpp"],
6172 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006173 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006174 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006175 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006176 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006177 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006178
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006179 cc_library {
6180 name: "mylib",
6181 srcs: ["mylib.cpp"],
6182 system_shared_libs: [],
6183 stl: "none",
6184 }
6185
Liz Kammer5bd365f2020-05-27 15:15:11 -07006186 filegroup {
6187 name: "fg2",
6188 srcs: [
6189 "testdata/baz"
6190 ],
6191 }
Roland Levillain630846d2019-06-26 12:48:34 +01006192 `)
6193
Jooyung Hana0503a52023-08-23 13:12:50 +09006194 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006195 copyCmds := apexRule.Args["copy_commands"]
6196
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006197 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006198 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006199 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006200
Liz Kammer1c14a212020-05-12 15:26:55 -07006201 //Ensure that test data are copied into apex.
6202 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6203 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6204
Roland Levillainf89cd092019-07-29 16:22:59 +01006205 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006206 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006207 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006208 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006209 prefix := "TARGET_"
6210 var builder strings.Builder
6211 data.Custom(&builder, name, prefix, "", data)
6212 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006213 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006214 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006215}
6216
Jooyung Hand48f3c32019-08-23 11:18:57 +09006217func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006218 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006219 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6220 apex {
6221 name: "myapex",
6222 key: "myapex.key",
6223 native_shared_libs: ["libfoo"],
6224 }
6225
6226 apex_key {
6227 name: "myapex.key",
6228 public_key: "testkey.avbpubkey",
6229 private_key: "testkey.pem",
6230 }
6231
6232 cc_library {
6233 name: "libfoo",
6234 stl: "none",
6235 system_shared_libs: [],
6236 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006237 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006238 }
6239 `)
6240 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6241 apex {
6242 name: "myapex",
6243 key: "myapex.key",
6244 java_libs: ["myjar"],
6245 }
6246
6247 apex_key {
6248 name: "myapex.key",
6249 public_key: "testkey.avbpubkey",
6250 private_key: "testkey.pem",
6251 }
6252
6253 java_library {
6254 name: "myjar",
6255 srcs: ["foo/bar/MyClass.java"],
6256 sdk_version: "none",
6257 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006258 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006259 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006260 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006261 }
6262 `)
6263}
6264
Bill Peckhama41a6962021-01-11 10:58:54 -08006265func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006266 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006267 apex {
6268 name: "myapex",
6269 key: "myapex.key",
6270 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006271 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006272 }
6273
6274 apex_key {
6275 name: "myapex.key",
6276 public_key: "testkey.avbpubkey",
6277 private_key: "testkey.pem",
6278 }
6279
6280 java_import {
6281 name: "myjavaimport",
6282 apex_available: ["myapex"],
6283 jars: ["my.jar"],
6284 compile_dex: true,
6285 }
6286 `)
6287
Jooyung Hana0503a52023-08-23 13:12:50 +09006288 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006289 apexRule := module.Rule("apexRule")
6290 copyCmds := apexRule.Args["copy_commands"]
6291 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6292}
6293
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006294func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006295 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006296 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006297 apex {
6298 name: "myapex",
6299 key: "myapex.key",
6300 apps: [
6301 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006302 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006303 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006304 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006305 }
6306
6307 apex_key {
6308 name: "myapex.key",
6309 public_key: "testkey.avbpubkey",
6310 private_key: "testkey.pem",
6311 }
6312
6313 android_app {
6314 name: "AppFoo",
6315 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006316 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006317 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006318 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006319 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006320 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006321 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006322 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006323
6324 android_app {
6325 name: "AppFooPriv",
6326 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006327 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006328 system_modules: "none",
6329 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006330 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006331 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006332 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006333 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006334
6335 cc_library_shared {
6336 name: "libjni",
6337 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006338 shared_libs: ["libfoo"],
6339 stl: "none",
6340 system_shared_libs: [],
6341 apex_available: [ "myapex" ],
6342 sdk_version: "current",
6343 }
6344
6345 cc_library_shared {
6346 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006347 stl: "none",
6348 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006349 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006350 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006351 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006352 `)
6353
Jooyung Hana0503a52023-08-23 13:12:50 +09006354 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006355 apexRule := module.Rule("apexRule")
6356 copyCmds := apexRule.Args["copy_commands"]
6357
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006358 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6359 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006360 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006361
Colin Crossaede88c2020-08-11 12:17:01 -07006362 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006363 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006364 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006365 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006366 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006367 // JNI libraries including transitive deps are
6368 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006369 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006370 // ... embedded inside APK (jnilibs.zip)
6371 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6372 // ... and not directly inside the APEX
6373 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6374 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006375
6376 apexBundle := module.Module().(*apexBundle)
6377 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6378 var builder strings.Builder
6379 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6380 androidMk := builder.String()
6381 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6382 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6383 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6384 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6385 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6386 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 +01006387}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006388
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006389func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006390 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006391 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6392 for _, id := range invalidBuildIds {
6393 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6394 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6395 variables.BuildId = proptools.StringPtr(id)
6396 })
6397 testApexError(t, message, `apex {
6398 name: "myapex",
6399 key: "myapex.key",
6400 apps: ["AppFooPrebuilt"],
6401 updatable: false,
6402 }
6403
6404 apex_key {
6405 name: "myapex.key",
6406 public_key: "testkey.avbpubkey",
6407 private_key: "testkey.pem",
6408 }
6409
6410 android_app_import {
6411 name: "AppFooPrebuilt",
6412 apk: "PrebuiltAppFoo.apk",
6413 presigned: true,
6414 apex_available: ["myapex"],
6415 }
6416 `, fixture)
6417 }
6418}
6419
Dario Frenicde2a032019-10-27 00:29:22 +01006420func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006421 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006422 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006423 apex {
6424 name: "myapex",
6425 key: "myapex.key",
6426 apps: [
6427 "AppFooPrebuilt",
6428 "AppFooPrivPrebuilt",
6429 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006430 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006431 }
6432
6433 apex_key {
6434 name: "myapex.key",
6435 public_key: "testkey.avbpubkey",
6436 private_key: "testkey.pem",
6437 }
6438
6439 android_app_import {
6440 name: "AppFooPrebuilt",
6441 apk: "PrebuiltAppFoo.apk",
6442 presigned: true,
6443 dex_preopt: {
6444 enabled: false,
6445 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006446 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006447 }
6448
6449 android_app_import {
6450 name: "AppFooPrivPrebuilt",
6451 apk: "PrebuiltAppFooPriv.apk",
6452 privileged: true,
6453 presigned: true,
6454 dex_preopt: {
6455 enabled: false,
6456 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006457 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006458 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006459 }
6460 `)
6461
Jooyung Hana0503a52023-08-23 13:12:50 +09006462 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006463 apexRule := module.Rule("apexRule")
6464 copyCmds := apexRule.Args["copy_commands"]
6465
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006466 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6467 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006468}
6469
6470func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006471 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006472 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006473 apex {
6474 name: "myapex",
6475 key: "myapex.key",
6476 apps: [
6477 "AppFoo",
6478 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006479 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006480 }
6481
6482 apex_key {
6483 name: "myapex.key",
6484 public_key: "testkey.avbpubkey",
6485 private_key: "testkey.pem",
6486 }
6487
6488 android_app {
6489 name: "AppFoo",
6490 srcs: ["foo/bar/MyClass.java"],
6491 sdk_version: "none",
6492 system_modules: "none",
6493 apex_available: [ "myapex" ],
6494 }
6495
6496 android_app_import {
6497 name: "AppFoo",
6498 apk: "AppFooPrebuilt.apk",
6499 filename: "AppFooPrebuilt.apk",
6500 presigned: true,
6501 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006502 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006503 }
6504 `, withFiles(map[string][]byte{
6505 "AppFooPrebuilt.apk": nil,
6506 }))
6507
Jooyung Hana0503a52023-08-23 13:12:50 +09006508 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006509 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006510 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006511}
6512
Dario Freni6f3937c2019-12-20 22:58:03 +00006513func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006514 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006515 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006516 apex {
6517 name: "myapex",
6518 key: "myapex.key",
6519 apps: [
6520 "TesterHelpAppFoo",
6521 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006522 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006523 }
6524
6525 apex_key {
6526 name: "myapex.key",
6527 public_key: "testkey.avbpubkey",
6528 private_key: "testkey.pem",
6529 }
6530
6531 android_test_helper_app {
6532 name: "TesterHelpAppFoo",
6533 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006534 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006535 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006536 }
6537
6538 `)
6539
Jooyung Hana0503a52023-08-23 13:12:50 +09006540 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006541 apexRule := module.Rule("apexRule")
6542 copyCmds := apexRule.Args["copy_commands"]
6543
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006544 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006545}
6546
Jooyung Han18020ea2019-11-13 10:50:48 +09006547func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006548 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006549 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006550 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006551 apex {
6552 name: "myapex",
6553 key: "myapex.key",
6554 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006555 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006556 }
6557
6558 apex_key {
6559 name: "myapex.key",
6560 public_key: "testkey.avbpubkey",
6561 private_key: "testkey.pem",
6562 }
6563
6564 apex {
6565 name: "otherapex",
6566 key: "myapex.key",
6567 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006568 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006569 }
6570
6571 cc_defaults {
6572 name: "libfoo-defaults",
6573 apex_available: ["otherapex"],
6574 }
6575
6576 cc_library {
6577 name: "libfoo",
6578 defaults: ["libfoo-defaults"],
6579 stl: "none",
6580 system_shared_libs: [],
6581 }`)
6582}
6583
Paul Duffine52e66f2020-03-30 17:54:29 +01006584func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006585 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006586 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006587 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006588 apex {
6589 name: "myapex",
6590 key: "myapex.key",
6591 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006592 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006593 }
6594
6595 apex_key {
6596 name: "myapex.key",
6597 public_key: "testkey.avbpubkey",
6598 private_key: "testkey.pem",
6599 }
6600
6601 apex {
6602 name: "otherapex",
6603 key: "otherapex.key",
6604 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006605 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006606 }
6607
6608 apex_key {
6609 name: "otherapex.key",
6610 public_key: "testkey.avbpubkey",
6611 private_key: "testkey.pem",
6612 }
6613
6614 cc_library {
6615 name: "libfoo",
6616 stl: "none",
6617 system_shared_libs: [],
6618 apex_available: ["otherapex"],
6619 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006620
6621 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6622 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6623 testApex(t, `
6624 apex {
6625 name: "com.sdv.myapex",
6626 key: "myapex.key",
6627 native_shared_libs: ["libfoo"],
6628 updatable: false,
6629 product_specific: true,
6630 }
6631
6632 apex_key {
6633 name: "myapex.key",
6634 public_key: "testkey.avbpubkey",
6635 private_key: "testkey.pem",
6636 }
6637
6638 apex {
6639 name: "com.any.otherapex",
6640 key: "otherapex.key",
6641 native_shared_libs: ["libfoo"],
6642 updatable: false,
6643 }
6644
6645 apex_key {
6646 name: "otherapex.key",
6647 public_key: "testkey.avbpubkey",
6648 private_key: "testkey.pem",
6649 }
6650
6651 cc_library {
6652 name: "libfoo",
6653 stl: "none",
6654 system_shared_libs: [],
6655 apex_available: ["com.any.otherapex"],
6656 product_specific: true,
6657 }`,
6658 android.FixtureMergeMockFs(android.MockFS{
6659 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6660 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6661 }))
6662
6663 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6664 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6665 apex {
6666 name: "com.sdv.myapex",
6667 key: "myapex.key",
6668 native_shared_libs: ["libfoo"],
6669 updatable: false,
6670 }
6671
6672 apex_key {
6673 name: "myapex.key",
6674 public_key: "testkey.avbpubkey",
6675 private_key: "testkey.pem",
6676 }
6677
6678 apex {
6679 name: "com.any.otherapex",
6680 key: "otherapex.key",
6681 native_shared_libs: ["libfoo"],
6682 updatable: false,
6683 }
6684
6685 apex_key {
6686 name: "otherapex.key",
6687 public_key: "testkey.avbpubkey",
6688 private_key: "testkey.pem",
6689 }
6690
6691 cc_library {
6692 name: "libfoo",
6693 stl: "none",
6694 system_shared_libs: [],
6695 apex_available: ["com.any.otherapex"],
6696 }`,
6697 android.FixtureMergeMockFs(android.MockFS{
6698 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6699 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6700 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006701}
Jiyong Park127b40b2019-09-30 16:04:35 +09006702
Paul Duffine52e66f2020-03-30 17:54:29 +01006703func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006704 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006705 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006706 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006707.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006708.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006709.*via tag cc\.dependencyTag.*
6710.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006711.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006712.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006713.*via tag cc\.dependencyTag.*
6714.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006715.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006716.*-> libbaz.*link:shared.*
6717.*via tag cc\.dependencyTag.*
6718.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006719 apex {
6720 name: "myapex",
6721 key: "myapex.key",
6722 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006723 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006724 }
6725
6726 apex_key {
6727 name: "myapex.key",
6728 public_key: "testkey.avbpubkey",
6729 private_key: "testkey.pem",
6730 }
6731
Jiyong Park127b40b2019-09-30 16:04:35 +09006732 cc_library {
6733 name: "libfoo",
6734 stl: "none",
6735 shared_libs: ["libbar"],
6736 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006737 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006738 }
6739
6740 cc_library {
6741 name: "libbar",
6742 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006743 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006744 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006745 apex_available: ["myapex"],
6746 }
6747
6748 cc_library {
6749 name: "libbaz",
6750 stl: "none",
6751 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006752 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006753
6754 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6755 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6756 testApex(t, `
6757 apex {
6758 name: "com.sdv.myapex",
6759 key: "myapex.key",
6760 native_shared_libs: ["libfoo"],
6761 updatable: false,
6762 product_specific: true,
6763 }
6764
6765 apex_key {
6766 name: "myapex.key",
6767 public_key: "testkey.avbpubkey",
6768 private_key: "testkey.pem",
6769 }
6770
6771 cc_library {
6772 name: "libfoo",
6773 stl: "none",
6774 shared_libs: ["libbar"],
6775 system_shared_libs: [],
6776 apex_available: ["com.sdv.myapex"],
6777 product_specific: true,
6778 }
6779
6780 cc_library {
6781 name: "libbar",
6782 stl: "none",
6783 shared_libs: ["libbaz"],
6784 system_shared_libs: [],
6785 apex_available: ["com.sdv.myapex"],
6786 product_specific: true,
6787 }
6788
6789 cc_library {
6790 name: "libbaz",
6791 stl: "none",
6792 system_shared_libs: [],
6793 product_specific: true,
6794 }`,
6795 android.FixtureMergeMockFs(android.MockFS{
6796 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6797 }))
6798
6799 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6800 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6801 apex {
6802 name: "com.sdv.myapex",
6803 key: "myapex.key",
6804 native_shared_libs: ["libfoo"],
6805 updatable: false,
6806 }
6807
6808 apex_key {
6809 name: "myapex.key",
6810 public_key: "testkey.avbpubkey",
6811 private_key: "testkey.pem",
6812 }
6813
6814 cc_library {
6815 name: "libfoo",
6816 stl: "none",
6817 shared_libs: ["libbar"],
6818 system_shared_libs: [],
6819 apex_available: ["com.sdv.myapex"],
6820 }
6821
6822 cc_library {
6823 name: "libbar",
6824 stl: "none",
6825 shared_libs: ["libbaz"],
6826 system_shared_libs: [],
6827 apex_available: ["com.sdv.myapex"],
6828 }
6829
6830 cc_library {
6831 name: "libbaz",
6832 stl: "none",
6833 system_shared_libs: [],
6834 }`,
6835 android.FixtureMergeMockFs(android.MockFS{
6836 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6837 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006838}
Jiyong Park127b40b2019-09-30 16:04:35 +09006839
Liz Kammer5f108fa2023-05-11 14:33:17 -04006840func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006841 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006842 testApex(t, `
6843 apex {
6844 name: "myapex",
6845 key: "myapex.key",
6846 native_shared_libs: ["libfoo"],
6847 updatable: false,
6848 }
6849
6850 apex_key {
6851 name: "myapex.key",
6852 public_key: "testkey.avbpubkey",
6853 private_key: "testkey.pem",
6854 }
6855
6856 cc_library {
6857 name: "libfoo",
6858 stl: "none",
6859 static_libs: ["libbar"],
6860 system_shared_libs: [],
6861 apex_available: ["myapex"],
6862 }
6863
6864 cc_library {
6865 name: "libbar",
6866 stl: "none",
6867 shared_libs: ["libbaz"],
6868 system_shared_libs: [],
6869 apex_available: ["myapex"],
6870 }
6871
6872 cc_library {
6873 name: "libbaz",
6874 stl: "none",
6875 system_shared_libs: [],
6876 }`)
6877
6878 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6879 apex {
6880 name: "myapex",
6881 key: "myapex.key",
6882 native_shared_libs: ["libfoo"],
6883 updatable: false,
6884 }
6885
6886 apex_key {
6887 name: "myapex.key",
6888 public_key: "testkey.avbpubkey",
6889 private_key: "testkey.pem",
6890 }
6891
6892 cc_library {
6893 name: "libfoo",
6894 stl: "none",
6895 static_libs: ["libbar"],
6896 system_shared_libs: [],
6897 apex_available: ["myapex"],
6898 }
6899
6900 cc_library {
6901 name: "libbar",
6902 stl: "none",
6903 system_shared_libs: [],
6904 }`)
6905}
6906
Paul Duffine52e66f2020-03-30 17:54:29 +01006907func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006908 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006909 testApexError(t, "\"otherapex\" is not a valid module name", `
6910 apex {
6911 name: "myapex",
6912 key: "myapex.key",
6913 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006914 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006915 }
6916
6917 apex_key {
6918 name: "myapex.key",
6919 public_key: "testkey.avbpubkey",
6920 private_key: "testkey.pem",
6921 }
6922
6923 cc_library {
6924 name: "libfoo",
6925 stl: "none",
6926 system_shared_libs: [],
6927 apex_available: ["otherapex"],
6928 }`)
6929
Paul Duffine52e66f2020-03-30 17:54:29 +01006930 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006931 apex {
6932 name: "myapex",
6933 key: "myapex.key",
6934 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006935 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006936 }
6937
6938 apex_key {
6939 name: "myapex.key",
6940 public_key: "testkey.avbpubkey",
6941 private_key: "testkey.pem",
6942 }
6943
6944 cc_library {
6945 name: "libfoo",
6946 stl: "none",
6947 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006948 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006949 apex_available: ["myapex"],
6950 }
6951
6952 cc_library {
6953 name: "libbar",
6954 stl: "none",
6955 system_shared_libs: [],
6956 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006957 }
6958
6959 cc_library {
6960 name: "libbaz",
6961 stl: "none",
6962 system_shared_libs: [],
6963 stubs: {
6964 versions: ["10", "20", "30"],
6965 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006966 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006967}
Jiyong Park127b40b2019-09-30 16:04:35 +09006968
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006969func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006970 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006971 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006972 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006973 testApexError(t, "expected an integer between 0-9; got -1", `
6974 apex {
6975 name: "myapex",
6976 key: "myapex.key",
6977 apex_available_name: "com.android.foo",
6978 variant_version: "-1",
6979 updatable: false,
6980 }
6981 apex_key {
6982 name: "myapex.key",
6983 public_key: "testkey.avbpubkey",
6984 private_key: "testkey.pem",
6985 }
6986 `)
6987 })
6988
6989 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006990 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006991 testApexError(t, "expected an integer between 0-9; got 10", `
6992 apex {
6993 name: "myapex",
6994 key: "myapex.key",
6995 apex_available_name: "com.android.foo",
6996 variant_version: "10",
6997 updatable: false,
6998 }
6999 apex_key {
7000 name: "myapex.key",
7001 public_key: "testkey.avbpubkey",
7002 private_key: "testkey.pem",
7003 }
7004 `)
7005 })
7006}
7007
7008func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007009 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007010 context := android.GroupFixturePreparers(
7011 android.PrepareForIntegrationTestWithAndroid,
7012 PrepareForTestWithApexBuildComponents,
7013 android.FixtureMergeMockFs(android.MockFS{
7014 "system/sepolicy/apex/foo-file_contexts": nil,
7015 "system/sepolicy/apex/bar-file_contexts": nil,
7016 }),
7017 )
7018 result := context.RunTestWithBp(t, `
7019 apex {
7020 name: "foo",
7021 key: "myapex.key",
7022 apex_available_name: "com.android.foo",
7023 variant_version: "0",
7024 updatable: false,
7025 }
7026 apex {
7027 name: "bar",
7028 key: "myapex.key",
7029 apex_available_name: "com.android.foo",
7030 variant_version: "3",
7031 updatable: false,
7032 }
7033 apex_key {
7034 name: "myapex.key",
7035 public_key: "testkey.avbpubkey",
7036 private_key: "testkey.pem",
7037 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007038 override_apex {
7039 name: "myoverrideapex",
7040 base: "bar",
7041 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007042 `)
7043
Jooyung Hana0503a52023-08-23 13:12:50 +09007044 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00007045 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007046 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
7047 if fooActualDefaultVersion != fooExpectedDefaultVersion {
7048 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
7049 }
7050
Jooyung Hana0503a52023-08-23 13:12:50 +09007051 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00007052 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007053 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
7054 barActualDefaultVersion := barManifestRule.Args["default_version"]
7055 if barActualDefaultVersion != barExpectedDefaultVersion {
7056 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7057 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04007058
Spandan Das50801e22024-05-13 18:29:45 +00007059 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04007060 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
7061 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
7062 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
7063 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04007064}
7065
Sam Delmericoca816532023-06-02 14:09:50 -04007066func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007067 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007068 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 -07007069 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007070 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
7071 apex {
7072 name: "myapex_sminus",
7073 key: "myapex.key",
7074 apps: ["AppFoo"],
7075 apex_available_name: "myapex",
7076 updatable: false,
7077 }
7078 apex {
7079 name: "myapex",
7080 key: "myapex.key",
7081 apps: ["AppFoo"],
7082 updatable: false,
7083 }
7084 apex_key {
7085 name: "myapex.key",
7086 public_key: "testkey.avbpubkey",
7087 private_key: "testkey.pem",
7088 }
7089 android_app {
7090 name: "AppFoo",
7091 srcs: ["foo/bar/MyClass.java"],
7092 sdk_version: "none",
7093 system_modules: "none",
7094 apex_available: [ "myapex_sminus" ],
7095 }`,
7096 android.FixtureMergeMockFs(android.MockFS{
7097 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7098 }),
7099 )
7100 })
7101
7102 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 -07007103 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007104 testApex(t, `
7105 apex {
7106 name: "myapex_sminus",
7107 key: "myapex.key",
7108 apps: ["AppFoo"],
7109 apex_available_name: "myapex",
7110 updatable: false,
7111 }
7112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 apps: ["AppFoo"],
7116 updatable: false,
7117 }
7118 apex_key {
7119 name: "myapex.key",
7120 public_key: "testkey.avbpubkey",
7121 private_key: "testkey.pem",
7122 }
7123 android_app {
7124 name: "AppFoo",
7125 srcs: ["foo/bar/MyClass.java"],
7126 sdk_version: "none",
7127 system_modules: "none",
7128 apex_available: [ "myapex" ],
7129 }`,
7130 android.FixtureMergeMockFs(android.MockFS{
7131 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7132 }),
7133 )
7134 })
7135
7136 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007137 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007138 testApex(t, `
7139 override_apex {
7140 name: "myoverrideapex_sminus",
7141 base: "myapex_sminus",
7142 key: "myapex.key",
7143 apps: ["AppFooOverride"],
7144 }
7145 override_apex {
7146 name: "myoverrideapex",
7147 base: "myapex",
7148 key: "myapex.key",
7149 apps: ["AppFooOverride"],
7150 }
7151 apex {
7152 name: "myapex_sminus",
7153 key: "myapex.key",
7154 apps: ["AppFoo"],
7155 apex_available_name: "myapex",
7156 updatable: false,
7157 }
7158 apex {
7159 name: "myapex",
7160 key: "myapex.key",
7161 apps: ["AppFoo"],
7162 updatable: false,
7163 }
7164 apex_key {
7165 name: "myapex.key",
7166 public_key: "testkey.avbpubkey",
7167 private_key: "testkey.pem",
7168 }
7169 android_app {
7170 name: "AppFooOverride",
7171 srcs: ["foo/bar/MyClass.java"],
7172 sdk_version: "none",
7173 system_modules: "none",
7174 apex_available: [ "myapex" ],
7175 }
7176 android_app {
7177 name: "AppFoo",
7178 srcs: ["foo/bar/MyClass.java"],
7179 sdk_version: "none",
7180 system_modules: "none",
7181 apex_available: [ "myapex" ],
7182 }`,
7183 android.FixtureMergeMockFs(android.MockFS{
7184 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7185 }),
7186 )
7187 })
7188}
7189
7190func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007191 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007192 context := android.GroupFixturePreparers(
7193 android.PrepareForIntegrationTestWithAndroid,
7194 PrepareForTestWithApexBuildComponents,
7195 java.PrepareForTestWithDexpreopt,
7196 android.FixtureMergeMockFs(android.MockFS{
7197 "system/sepolicy/apex/myapex-file_contexts": nil,
7198 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7199 }),
7200 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7201 variables.BuildId = proptools.StringPtr("buildid")
7202 }),
7203 )
7204 context.RunTestWithBp(t, `
7205 override_apex {
7206 name: "myoverrideapex_sminus",
7207 base: "myapex_sminus",
7208 }
7209 override_apex {
7210 name: "myoverrideapex",
7211 base: "myapex",
7212 }
7213 apex {
7214 name: "myapex",
7215 key: "myapex.key",
7216 apps: ["AppFoo"],
7217 updatable: false,
7218 }
7219 apex {
7220 name: "myapex_sminus",
7221 apex_available_name: "myapex",
7222 key: "myapex.key",
7223 apps: ["AppFoo_sminus"],
7224 updatable: false,
7225 }
7226 apex_key {
7227 name: "myapex.key",
7228 public_key: "testkey.avbpubkey",
7229 private_key: "testkey.pem",
7230 }
7231 android_app {
7232 name: "AppFoo",
7233 srcs: ["foo/bar/MyClass.java"],
7234 sdk_version: "none",
7235 system_modules: "none",
7236 apex_available: [ "myapex" ],
7237 }
7238 android_app {
7239 name: "AppFoo_sminus",
7240 srcs: ["foo/bar/MyClass.java"],
7241 sdk_version: "none",
7242 min_sdk_version: "29",
7243 system_modules: "none",
7244 apex_available: [ "myapex" ],
7245 }`)
7246}
7247
Jiyong Park89e850a2020-04-07 16:37:39 +09007248func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007249 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007250 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007251 apex {
7252 name: "myapex",
7253 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007254 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007255 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007256 }
7257
7258 apex_key {
7259 name: "myapex.key",
7260 public_key: "testkey.avbpubkey",
7261 private_key: "testkey.pem",
7262 }
7263
7264 cc_library {
7265 name: "libfoo",
7266 stl: "none",
7267 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007268 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007269 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007270 }
7271
7272 cc_library {
7273 name: "libfoo2",
7274 stl: "none",
7275 system_shared_libs: [],
7276 shared_libs: ["libbaz"],
7277 apex_available: ["//apex_available:platform"],
7278 }
7279
7280 cc_library {
7281 name: "libbar",
7282 stl: "none",
7283 system_shared_libs: [],
7284 apex_available: ["myapex"],
7285 }
7286
7287 cc_library {
7288 name: "libbaz",
7289 stl: "none",
7290 system_shared_libs: [],
7291 apex_available: ["myapex"],
7292 stubs: {
7293 versions: ["1"],
7294 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007295 }`)
7296
Jiyong Park89e850a2020-04-07 16:37:39 +09007297 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7298 // because it depends on libbar which isn't available to platform
7299 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7300 if libfoo.NotAvailableForPlatform() != true {
7301 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7302 }
7303
7304 // libfoo2 however can be available to platform because it depends on libbaz which provides
7305 // stubs
7306 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7307 if libfoo2.NotAvailableForPlatform() == true {
7308 t.Errorf("%q should be available to platform", libfoo2.String())
7309 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007310}
Jiyong Parka90ca002019-10-07 15:47:24 +09007311
Paul Duffine52e66f2020-03-30 17:54:29 +01007312func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007313 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007314 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007315 apex {
7316 name: "myapex",
7317 key: "myapex.key",
7318 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007319 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007320 }
7321
7322 apex_key {
7323 name: "myapex.key",
7324 public_key: "testkey.avbpubkey",
7325 private_key: "testkey.pem",
7326 }
7327
7328 cc_library {
7329 name: "libfoo",
7330 stl: "none",
7331 system_shared_libs: [],
7332 apex_available: ["myapex"],
7333 static: {
7334 apex_available: ["//apex_available:platform"],
7335 },
7336 }`)
7337
Jiyong Park89e850a2020-04-07 16:37:39 +09007338 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7339 if libfooShared.NotAvailableForPlatform() != true {
7340 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7341 }
7342 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7343 if libfooStatic.NotAvailableForPlatform() != false {
7344 t.Errorf("%q should be available to platform", libfooStatic.String())
7345 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007346}
7347
Jooyung Han9a419e22024-08-16 17:14:21 +09007348func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007349 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007350
7351 for _, tc := range []struct {
7352 name string
7353 apexAvailable string
7354 expectedError string
7355 }{
7356 {
7357 name: "prefix matches correctly",
7358 apexAvailable: "com.foo.*",
7359 },
7360 {
7361 name: "prefix doesn't match",
7362 apexAvailable: "com.bar.*",
7363 expectedError: `Consider .* "com.foo\.\*"`,
7364 },
7365 {
7366 name: "short prefix",
7367 apexAvailable: "com.*",
7368 expectedError: "requires two or more components",
7369 },
7370 {
7371 name: "wildcard not in the end",
7372 apexAvailable: "com.*.foo",
7373 expectedError: "should end with .*",
7374 },
7375 {
7376 name: "wildcard in the middle",
7377 apexAvailable: "com.foo*.*",
7378 expectedError: "not allowed in the middle",
7379 },
7380 {
7381 name: "hint with prefix pattern",
7382 apexAvailable: "//apex_available:platform",
7383 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7384 },
7385 } {
7386 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007387 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007388 errorHandler := android.FixtureExpectsNoErrors
7389 if tc.expectedError != "" {
7390 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7391 }
7392 context := android.GroupFixturePreparers(
7393 prepareForApexTest,
7394 android.FixtureMergeMockFs(android.MockFS{
7395 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7396 }),
7397 ).ExtendWithErrorHandler(errorHandler)
7398
7399 context.RunTestWithBp(t, `
7400 apex {
7401 name: "com.foo.bar",
7402 key: "myapex.key",
7403 native_shared_libs: ["libfoo"],
7404 updatable: false,
7405 }
7406
7407 apex_key {
7408 name: "myapex.key",
7409 public_key: "testkey.avbpubkey",
7410 private_key: "testkey.pem",
7411 }
7412
7413 cc_library {
7414 name: "libfoo",
7415 stl: "none",
7416 system_shared_libs: [],
7417 apex_available: ["`+tc.apexAvailable+`"],
7418 }`)
7419 })
7420 }
7421 testApexError(t, `Consider adding "com.foo" to`, `
7422 apex {
7423 name: "com.foo", // too short for a partner apex
7424 key: "myapex.key",
7425 native_shared_libs: ["libfoo"],
7426 updatable: false,
7427 }
7428
7429 apex_key {
7430 name: "myapex.key",
7431 public_key: "testkey.avbpubkey",
7432 private_key: "testkey.pem",
7433 }
7434
7435 cc_library {
7436 name: "libfoo",
7437 stl: "none",
7438 system_shared_libs: [],
7439 }
7440 `)
7441}
7442
Jooyung Hanb9518072024-11-22 14:05:20 +09007443func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7444 t.Parallel()
7445 ctx := testApex(t, `
7446 apex_test {
7447 name: "myapex",
7448 key: "myapex.key",
7449 skip_validations: {
7450 host_apex_verifier: true,
7451 },
7452 updatable: false,
7453 }
7454 apex_key {
7455 name: "myapex.key",
7456 public_key: "testkey.avbpubkey",
7457 private_key: "testkey.pem",
7458 }
7459 `)
7460
7461 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7462 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7463 t.Error("should not run host_apex_verifier")
7464 }
7465}
7466
7467func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7468 t.Parallel()
7469 ctx := testApex(t, `
7470 apex_test {
7471 name: "myapex",
7472 key: "myapex.key",
7473 updatable: false,
7474 }
7475 apex_key {
7476 name: "myapex.key",
7477 public_key: "testkey.avbpubkey",
7478 private_key: "testkey.pem",
7479 }
7480 `)
7481
7482 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7483 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7484 t.Error("should run host_apex_verifier")
7485 }
7486}
7487
Jiyong Park5d790c32019-11-15 18:40:32 +09007488func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007489 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007490 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007491 apex {
7492 name: "myapex",
7493 key: "myapex.key",
7494 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007495 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007496 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007497 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007498 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007499 }
7500
7501 override_apex {
7502 name: "override_myapex",
7503 base: "myapex",
7504 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007505 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007506 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007507 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007508 compile_multilib: "first",
7509 multilib: {
7510 lib32: {
7511 native_shared_libs: ["mylib32"],
7512 },
7513 lib64: {
7514 native_shared_libs: ["mylib64"],
7515 },
7516 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007517 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007518 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007519 key: "mynewapex.key",
7520 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007521 }
7522
7523 apex_key {
7524 name: "myapex.key",
7525 public_key: "testkey.avbpubkey",
7526 private_key: "testkey.pem",
7527 }
7528
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007529 apex_key {
7530 name: "mynewapex.key",
7531 public_key: "testkey2.avbpubkey",
7532 private_key: "testkey2.pem",
7533 }
7534
7535 android_app_certificate {
7536 name: "myapex.certificate",
7537 certificate: "testkey",
7538 }
7539
Jiyong Park5d790c32019-11-15 18:40:32 +09007540 android_app {
7541 name: "app",
7542 srcs: ["foo/bar/MyClass.java"],
7543 package_name: "foo",
7544 sdk_version: "none",
7545 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007546 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007547 }
7548
7549 override_android_app {
7550 name: "override_app",
7551 base: "app",
7552 package_name: "bar",
7553 }
markchien7c803b82021-08-26 22:10:06 +08007554
7555 bpf {
7556 name: "bpf",
7557 srcs: ["bpf.c"],
7558 }
7559
7560 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007561 name: "overrideBpf",
7562 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007563 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007564
7565 prebuilt_etc {
7566 name: "myetc",
7567 src: "myprebuilt",
7568 }
7569
7570 prebuilt_etc {
7571 name: "override_myetc",
7572 src: "override_myprebuilt",
7573 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007574
7575 cc_library {
7576 name: "mylib32",
7577 apex_available: [ "myapex" ],
7578 }
7579
7580 cc_library {
7581 name: "mylib64",
7582 apex_available: [ "myapex" ],
7583 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007584 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007585
Jooyung Hana0503a52023-08-23 13:12:50 +09007586 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007587 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007588 if originalVariant.GetOverriddenBy() != "" {
7589 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7590 }
7591 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7592 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7593 }
7594
Spandan Das50801e22024-05-13 18:29:45 +00007595 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007596 apexRule := module.Rule("apexRule")
7597 copyCmds := apexRule.Args["copy_commands"]
7598
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007599 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7600 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007601
markchien7c803b82021-08-26 22:10:06 +08007602 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007603 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007604
Daniel Norman5a3ce132021-08-26 15:44:43 -07007605 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7606 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7607
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007608 apexBundle := module.Module().(*apexBundle)
7609 name := apexBundle.Name()
7610 if name != "override_myapex" {
7611 t.Errorf("name should be \"override_myapex\", but was %q", name)
7612 }
7613
Baligh Uddin004d7172020-02-19 21:29:28 -08007614 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7615 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7616 }
7617
Jiyong Park20bacab2020-03-03 11:45:41 +09007618 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007619 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007620 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7621
7622 signApkRule := module.Rule("signapk")
7623 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007624
Colin Crossaa255532020-07-03 13:18:24 -07007625 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007626 var builder strings.Builder
7627 data.Custom(&builder, name, "TARGET_", "", data)
7628 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007629 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7630 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007631 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007632 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007633 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007634 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007635 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007636 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007637}
7638
Albert Martineefabcf2022-03-21 20:11:16 +00007639func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007640 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007641 // Override from 29 to 31
7642 minSdkOverride31 := "31"
7643 ctx := testApex(t, `
7644 apex {
7645 name: "myapex",
7646 key: "myapex.key",
7647 native_shared_libs: ["mylib"],
7648 updatable: true,
7649 min_sdk_version: "29"
7650 }
7651
7652 override_apex {
7653 name: "override_myapex",
7654 base: "myapex",
7655 logging_parent: "com.foo.bar",
7656 package_name: "test.overridden.package"
7657 }
7658
7659 apex_key {
7660 name: "myapex.key",
7661 public_key: "testkey.avbpubkey",
7662 private_key: "testkey.pem",
7663 }
7664
7665 cc_library {
7666 name: "mylib",
7667 srcs: ["mylib.cpp"],
7668 runtime_libs: ["libbar"],
7669 system_shared_libs: [],
7670 stl: "none",
7671 apex_available: [ "myapex" ],
7672 min_sdk_version: "apex_inherit"
7673 }
7674
7675 cc_library {
7676 name: "libbar",
7677 srcs: ["mylib.cpp"],
7678 system_shared_libs: [],
7679 stl: "none",
7680 apex_available: [ "myapex" ],
7681 min_sdk_version: "apex_inherit"
7682 }
7683
7684 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7685
Jooyung Hana0503a52023-08-23 13:12:50 +09007686 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007687 copyCmds := apexRule.Args["copy_commands"]
7688
7689 // Ensure that direct non-stubs dep is always included
7690 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7691
7692 // Ensure that runtime_libs dep in included
7693 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7694
7695 // Ensure libraries target overridden min_sdk_version value
7696 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7697}
7698
7699func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007700 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007701 // Attempt to override from 31 to 29, should be a NOOP
7702 minSdkOverride29 := "29"
7703 ctx := testApex(t, `
7704 apex {
7705 name: "myapex",
7706 key: "myapex.key",
7707 native_shared_libs: ["mylib"],
7708 updatable: true,
7709 min_sdk_version: "31"
7710 }
7711
7712 override_apex {
7713 name: "override_myapex",
7714 base: "myapex",
7715 logging_parent: "com.foo.bar",
7716 package_name: "test.overridden.package"
7717 }
7718
7719 apex_key {
7720 name: "myapex.key",
7721 public_key: "testkey.avbpubkey",
7722 private_key: "testkey.pem",
7723 }
7724
7725 cc_library {
7726 name: "mylib",
7727 srcs: ["mylib.cpp"],
7728 runtime_libs: ["libbar"],
7729 system_shared_libs: [],
7730 stl: "none",
7731 apex_available: [ "myapex" ],
7732 min_sdk_version: "apex_inherit"
7733 }
7734
7735 cc_library {
7736 name: "libbar",
7737 srcs: ["mylib.cpp"],
7738 system_shared_libs: [],
7739 stl: "none",
7740 apex_available: [ "myapex" ],
7741 min_sdk_version: "apex_inherit"
7742 }
7743
7744 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7745
Jooyung Hana0503a52023-08-23 13:12:50 +09007746 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007747 copyCmds := apexRule.Args["copy_commands"]
7748
7749 // Ensure that direct non-stubs dep is always included
7750 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7751
7752 // Ensure that runtime_libs dep in included
7753 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7754
7755 // Ensure libraries target the original min_sdk_version value rather than the overridden
7756 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7757}
7758
Jooyung Han214bf372019-11-12 13:03:50 +09007759func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007760 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007761 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007762 apex {
7763 name: "myapex",
7764 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007765 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007766 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007767 }
7768
7769 apex_key {
7770 name: "myapex.key",
7771 public_key: "testkey.avbpubkey",
7772 private_key: "testkey.pem",
7773 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007774
7775 cc_library {
7776 name: "mylib",
7777 srcs: ["mylib.cpp"],
7778 stl: "libc++",
7779 system_shared_libs: [],
7780 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007781 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007782 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007783 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007784
Jooyung Hana0503a52023-08-23 13:12:50 +09007785 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007786 args := module.Rule("apexRule").Args
7787 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007788
7789 // The copies of the libraries in the apex should have one more dependency than
7790 // the ones outside the apex, namely the unwinder. Ideally we should check
7791 // the dependency names directly here but for some reason the names are blank in
7792 // this test.
7793 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007794 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007795 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7796 if len(apexImplicits) != len(nonApexImplicits)+1 {
7797 t.Errorf("%q missing unwinder dep", lib)
7798 }
7799 }
Jooyung Han214bf372019-11-12 13:03:50 +09007800}
7801
Paul Duffine05480a2021-03-08 15:07:14 +00007802var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007803 "api/current.txt": nil,
7804 "api/removed.txt": nil,
7805 "api/system-current.txt": nil,
7806 "api/system-removed.txt": nil,
7807 "api/test-current.txt": nil,
7808 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007809
Anton Hanssondff2c782020-12-21 17:10:01 +00007810 "100/public/api/foo.txt": nil,
7811 "100/public/api/foo-removed.txt": nil,
7812 "100/system/api/foo.txt": nil,
7813 "100/system/api/foo-removed.txt": nil,
7814
Paul Duffineedc5d52020-06-12 17:46:39 +01007815 // For java_sdk_library_import
7816 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007817}
7818
Jooyung Han58f26ab2019-12-18 15:34:32 +09007819func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007820 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007821 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007822 apex {
7823 name: "myapex",
7824 key: "myapex.key",
7825 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007826 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007827 }
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"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007839 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007840 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007841
7842 prebuilt_apis {
7843 name: "sdk",
7844 api_dirs: ["100"],
7845 }
Paul Duffin9b879592020-05-26 13:21:35 +01007846 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007847
7848 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007849 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007850 "javalib/foo.jar",
7851 "etc/permissions/foo.xml",
7852 })
7853 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007854 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7855 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7856 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007857}
7858
Spandan Das3ee19692024-06-19 04:47:40 +00007859func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007860 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007861 ctx := testApex(t, `
7862 override_apex {
7863 name: "mycompanyapex",
7864 base: "myapex",
7865 }
7866 apex {
7867 name: "myapex",
7868 key: "myapex.key",
7869 java_libs: ["foo"],
7870 updatable: false,
7871 }
7872
7873 apex_key {
7874 name: "myapex.key",
7875 public_key: "testkey.avbpubkey",
7876 private_key: "testkey.pem",
7877 }
7878
7879 java_sdk_library {
7880 name: "foo",
7881 srcs: ["a.java"],
7882 api_packages: ["foo"],
7883 apex_available: [ "myapex" ],
7884 }
7885
7886 prebuilt_apis {
7887 name: "sdk",
7888 api_dirs: ["100"],
7889 }
7890 `, withFiles(filesForSdkLibrary))
7891
7892 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7893 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7894 // (com.android.foo), the filepath should not contain override apex name.
7895 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7896 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7897 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7898}
7899
Paul Duffin9b879592020-05-26 13:21:35 +01007900func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007901 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007902 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007903 apex {
7904 name: "myapex",
7905 key: "myapex.key",
7906 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007907 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007908 }
7909
7910 apex_key {
7911 name: "myapex.key",
7912 public_key: "testkey.avbpubkey",
7913 private_key: "testkey.pem",
7914 }
7915
7916 java_sdk_library {
7917 name: "foo",
7918 srcs: ["a.java"],
7919 api_packages: ["foo"],
7920 apex_available: ["myapex"],
7921 sdk_version: "none",
7922 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007923 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007924 }
7925
7926 java_library {
7927 name: "bar",
7928 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007929 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007930 apex_available: ["myapex"],
7931 sdk_version: "none",
7932 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007933 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007934 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007935
7936 prebuilt_apis {
7937 name: "sdk",
7938 api_dirs: ["100"],
7939 }
Paul Duffin9b879592020-05-26 13:21:35 +01007940 `, withFiles(filesForSdkLibrary))
7941
7942 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007943 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007944 "javalib/bar.jar",
7945 "javalib/foo.jar",
7946 "etc/permissions/foo.xml",
7947 })
7948
7949 // The bar library should depend on the implementation jar.
7950 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007951 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007952 t.Errorf("expected %q, found %#q", expected, actual)
7953 }
7954}
7955
7956func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007957 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007958 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007959 apex {
7960 name: "myapex",
7961 key: "myapex.key",
7962 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007963 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007964 }
7965
7966 apex_key {
7967 name: "myapex.key",
7968 public_key: "testkey.avbpubkey",
7969 private_key: "testkey.pem",
7970 }
7971
7972 java_sdk_library {
7973 name: "foo",
7974 srcs: ["a.java"],
7975 api_packages: ["foo"],
7976 apex_available: ["myapex"],
7977 sdk_version: "none",
7978 system_modules: "none",
7979 }
7980
7981 java_library {
7982 name: "bar",
7983 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007984 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007985 sdk_version: "none",
7986 system_modules: "none",
7987 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007988
7989 prebuilt_apis {
7990 name: "sdk",
7991 api_dirs: ["100"],
7992 }
Paul Duffin9b879592020-05-26 13:21:35 +01007993 `, withFiles(filesForSdkLibrary))
7994
7995 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007996 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007997 "javalib/foo.jar",
7998 "etc/permissions/foo.xml",
7999 })
8000
8001 // The bar library should depend on the stubs jar.
8002 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01008003 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01008004 t.Errorf("expected %q, found %#q", expected, actual)
8005 }
8006}
8007
Paul Duffineedc5d52020-06-12 17:46:39 +01008008func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008009 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008010 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00008011 prebuilt_apis {
8012 name: "sdk",
8013 api_dirs: ["100"],
8014 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01008015 withFiles(map[string][]byte{
8016 "apex/a.java": nil,
8017 "apex/apex_manifest.json": nil,
8018 "apex/Android.bp": []byte(`
8019 package {
8020 default_visibility: ["//visibility:private"],
8021 }
8022
8023 apex {
8024 name: "myapex",
8025 key: "myapex.key",
8026 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008027 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008028 }
8029
8030 apex_key {
8031 name: "myapex.key",
8032 public_key: "testkey.avbpubkey",
8033 private_key: "testkey.pem",
8034 }
8035
8036 java_library {
8037 name: "bar",
8038 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00008039 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01008040 apex_available: ["myapex"],
8041 sdk_version: "none",
8042 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008043 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008044 }
8045`),
8046 "source/a.java": nil,
8047 "source/api/current.txt": nil,
8048 "source/api/removed.txt": nil,
8049 "source/Android.bp": []byte(`
8050 package {
8051 default_visibility: ["//visibility:private"],
8052 }
8053
8054 java_sdk_library {
8055 name: "foo",
8056 visibility: ["//apex"],
8057 srcs: ["a.java"],
8058 api_packages: ["foo"],
8059 apex_available: ["myapex"],
8060 sdk_version: "none",
8061 system_modules: "none",
8062 public: {
8063 enabled: true,
8064 },
Colin Crosse4f34882024-11-14 12:26:00 -08008065 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008066 }
8067`),
8068 "prebuilt/a.jar": nil,
8069 "prebuilt/Android.bp": []byte(`
8070 package {
8071 default_visibility: ["//visibility:private"],
8072 }
8073
8074 java_sdk_library_import {
8075 name: "foo",
8076 visibility: ["//apex", "//source"],
8077 apex_available: ["myapex"],
8078 prefer: true,
8079 public: {
8080 jars: ["a.jar"],
8081 },
Colin Crosse4f34882024-11-14 12:26:00 -08008082 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008083 }
8084`),
Anton Hanssondff2c782020-12-21 17:10:01 +00008085 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01008086 )
8087
8088 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09008089 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01008090 "javalib/bar.jar",
8091 "javalib/foo.jar",
8092 "etc/permissions/foo.xml",
8093 })
8094
8095 // The bar library should depend on the implementation jar.
8096 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00008097 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01008098 t.Errorf("expected %q, found %#q", expected, actual)
8099 }
8100}
8101
8102func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008103 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01008104 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
8105 apex {
8106 name: "myapex",
8107 key: "myapex.key",
8108 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008109 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008110 }
8111
8112 apex_key {
8113 name: "myapex.key",
8114 public_key: "testkey.avbpubkey",
8115 private_key: "testkey.pem",
8116 }
8117
8118 java_sdk_library_import {
8119 name: "foo",
8120 apex_available: ["myapex"],
8121 prefer: true,
8122 public: {
8123 jars: ["a.jar"],
8124 },
8125 }
8126
8127 `, withFiles(filesForSdkLibrary))
8128}
8129
atrost6e126252020-01-27 17:01:16 +00008130func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008131 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01008132 result := android.GroupFixturePreparers(
8133 prepareForApexTest,
8134 java.PrepareForTestWithPlatformCompatConfig,
8135 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00008136 apex {
8137 name: "myapex",
8138 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008139 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008140 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008141 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008142 }
8143
8144 apex_key {
8145 name: "myapex.key",
8146 public_key: "testkey.avbpubkey",
8147 private_key: "testkey.pem",
8148 }
8149
8150 platform_compat_config {
8151 name: "myjar-platform-compat-config",
8152 src: ":myjar",
8153 }
8154
8155 java_library {
8156 name: "myjar",
8157 srcs: ["foo/bar/MyClass.java"],
8158 sdk_version: "none",
8159 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008160 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008161 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008162 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008163
8164 // Make sure that a preferred prebuilt does not affect the apex contents.
8165 prebuilt_platform_compat_config {
8166 name: "myjar-platform-compat-config",
8167 metadata: "compat-config/metadata.xml",
8168 prefer: true,
8169 }
atrost6e126252020-01-27 17:01:16 +00008170 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008171 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008172 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008173 "etc/compatconfig/myjar-platform-compat-config.xml",
8174 "javalib/myjar.jar",
8175 })
8176}
8177
Jooyung Han862c0d62022-12-21 10:15:37 +09008178func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008179 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008180 android.GroupFixturePreparers(
8181 android.PrepareForTestWithAndroidBuildComponents,
8182 PrepareForTestWithApexBuildComponents,
8183 prepareForTestWithMyapex,
8184 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8185 ).
8186 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8187 RunTestWithBp(t, `
8188 apex {
8189 name: "myapex",
8190 key: "myapex.key",
8191 prebuilts: ["foo", "bar"],
8192 updatable: false,
8193 }
8194
8195 apex_key {
8196 name: "myapex.key",
8197 public_key: "testkey.avbpubkey",
8198 private_key: "testkey.pem",
8199 }
8200
8201 prebuilt_etc {
8202 name: "foo",
8203 src: "myprebuilt",
8204 filename_from_src: true,
8205 }
8206
8207 prebuilt_etc {
8208 name: "bar",
8209 src: "myprebuilt",
8210 filename_from_src: true,
8211 }
8212 `)
8213}
8214
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008215func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008216 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008217 bp := `
8218 apex {
8219 name: "myapex",
8220 key: "myapex.key",
8221 native_shared_libs: ["libfoo"],
8222 updatable: false,
8223 unwanted_transitive_deps: ["libbar"],
8224 }
8225
8226 apex_key {
8227 name: "myapex.key",
8228 public_key: "testkey.avbpubkey",
8229 private_key: "testkey.pem",
8230 }
8231
8232 cc_library {
8233 name: "libfoo",
8234 srcs: ["foo.cpp"],
8235 shared_libs: ["libbar"],
8236 apex_available: ["myapex"],
8237 }
8238
8239 cc_library {
8240 name: "libbar",
8241 srcs: ["bar.cpp"],
8242 apex_available: ["myapex"],
8243 }`
8244 ctx := testApex(t, bp)
8245 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8246 "*/libc++.so",
8247 "*/libfoo.so",
8248 // not libbar.so
8249 })
8250}
8251
Jiyong Park479321d2019-12-16 11:47:12 +09008252func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008253 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008254 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8255 apex {
8256 name: "myapex",
8257 key: "myapex.key",
8258 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008259 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008260 }
8261
8262 apex_key {
8263 name: "myapex.key",
8264 public_key: "testkey.avbpubkey",
8265 private_key: "testkey.pem",
8266 }
8267
8268 java_library {
8269 name: "myjar",
8270 srcs: ["foo/bar/MyClass.java"],
8271 sdk_version: "none",
8272 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008273 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008274 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008275 }
8276 `)
8277}
8278
Jiyong Park7cd10e32020-01-14 09:22:18 +09008279func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008280 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008281 bp := `
8282 apex {
8283 name: "myapex",
8284 key: "myapex.key",
8285 native_shared_libs: ["mylib"],
8286 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008287 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008288 }
8289
Jiyong Park9d677202020-02-19 16:29:35 +09008290 apex {
8291 name: "myapex.updatable",
8292 key: "myapex.key",
8293 native_shared_libs: ["mylib"],
8294 java_libs: ["myjar"],
8295 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008296 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008297 }
8298
Jiyong Park7cd10e32020-01-14 09:22:18 +09008299 apex_key {
8300 name: "myapex.key",
8301 public_key: "testkey.avbpubkey",
8302 private_key: "testkey.pem",
8303 }
8304
8305 cc_library {
8306 name: "mylib",
8307 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008308 shared_libs: [
8309 "myotherlib",
8310 "myotherlib_ext",
8311 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008312 system_shared_libs: [],
8313 stl: "none",
8314 apex_available: [
8315 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008316 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008317 "//apex_available:platform",
8318 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008319 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008320 }
8321
8322 cc_library {
8323 name: "myotherlib",
8324 srcs: ["mylib.cpp"],
8325 system_shared_libs: [],
8326 stl: "none",
8327 apex_available: [
8328 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008329 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008330 "//apex_available:platform",
8331 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008332 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008333 }
8334
Jiyong Parkce243632023-02-17 18:22:25 +09008335 cc_library {
8336 name: "myotherlib_ext",
8337 srcs: ["mylib.cpp"],
8338 system_shared_libs: [],
8339 system_ext_specific: true,
8340 stl: "none",
8341 apex_available: [
8342 "myapex",
8343 "myapex.updatable",
8344 "//apex_available:platform",
8345 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008346 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008347 }
8348
Jiyong Park7cd10e32020-01-14 09:22:18 +09008349 java_library {
8350 name: "myjar",
8351 srcs: ["foo/bar/MyClass.java"],
8352 sdk_version: "none",
8353 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008354 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008355 apex_available: [
8356 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008357 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008358 "//apex_available:platform",
8359 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008360 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008361 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008362 }
8363
8364 java_library {
8365 name: "myotherjar",
8366 srcs: ["foo/bar/MyClass.java"],
8367 sdk_version: "none",
8368 system_modules: "none",
8369 apex_available: [
8370 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008371 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008372 "//apex_available:platform",
8373 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008374 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008375 }
8376 `
8377
8378 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8379 for _, f := range files {
8380 if f.path == file {
8381 if f.isLink {
8382 t.Errorf("%q is not a real file", file)
8383 }
8384 return
8385 }
8386 }
8387 t.Errorf("%q is not found", file)
8388 }
8389
Jiyong Parkce243632023-02-17 18:22:25 +09008390 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008391 for _, f := range files {
8392 if f.path == file {
8393 if !f.isLink {
8394 t.Errorf("%q is not a symlink", file)
8395 }
Jiyong Parkce243632023-02-17 18:22:25 +09008396 if f.src != target {
8397 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8398 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008399 return
8400 }
8401 }
8402 t.Errorf("%q is not found", file)
8403 }
8404
Jiyong Park9d677202020-02-19 16:29:35 +09008405 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8406 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008407 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008408 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008409 ensureRealfileExists(t, files, "javalib/myjar.jar")
8410 ensureRealfileExists(t, files, "lib64/mylib.so")
8411 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008412 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008413
Jooyung Hana0503a52023-08-23 13:12:50 +09008414 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008415 ensureRealfileExists(t, files, "javalib/myjar.jar")
8416 ensureRealfileExists(t, files, "lib64/mylib.so")
8417 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008418 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008419
8420 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008421 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008422 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008423 ensureRealfileExists(t, files, "javalib/myjar.jar")
8424 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008425 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8426 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008427
Jooyung Hana0503a52023-08-23 13:12:50 +09008428 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008429 ensureRealfileExists(t, files, "javalib/myjar.jar")
8430 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008431 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8432 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008433}
8434
Yo Chiange8128052020-07-23 20:09:18 +08008435func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008436 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008437 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008438 apex {
8439 name: "myapex",
8440 key: "myapex.key",
8441 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008442 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008443 }
8444
8445 apex_key {
8446 name: "myapex.key",
8447 public_key: "testkey.avbpubkey",
8448 private_key: "testkey.pem",
8449 }
8450
8451 cc_library_shared {
8452 name: "mylib",
8453 srcs: ["mylib.cpp"],
8454 shared_libs: ["myotherlib"],
8455 system_shared_libs: [],
8456 stl: "none",
8457 apex_available: [
8458 "myapex",
8459 "//apex_available:platform",
8460 ],
8461 }
8462
8463 cc_prebuilt_library_shared {
8464 name: "myotherlib",
8465 srcs: ["prebuilt.so"],
8466 system_shared_libs: [],
8467 stl: "none",
8468 apex_available: [
8469 "myapex",
8470 "//apex_available:platform",
8471 ],
8472 }
8473 `)
8474
Jooyung Hana0503a52023-08-23 13:12:50 +09008475 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008476 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008477 var builder strings.Builder
8478 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8479 androidMk := builder.String()
8480 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008481 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008482 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8483 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8484 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008485 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008486}
8487
Jooyung Han643adc42020-02-27 13:50:06 +09008488func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008489 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008490 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008491 apex {
8492 name: "myapex",
8493 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008494 binaries: ["mybin"],
8495 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008496 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008497 }
8498
8499 apex_key {
8500 name: "myapex.key",
8501 public_key: "testkey.avbpubkey",
8502 private_key: "testkey.pem",
8503 }
8504
8505 cc_library {
8506 name: "mylib",
8507 srcs: ["mylib.cpp"],
8508 shared_libs: ["mylib2"],
8509 system_shared_libs: [],
8510 stl: "none",
8511 apex_available: [ "myapex" ],
8512 }
8513
8514 cc_library {
8515 name: "mylib2",
8516 srcs: ["mylib.cpp"],
8517 system_shared_libs: [],
8518 stl: "none",
8519 apex_available: [ "myapex" ],
8520 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008521
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008522 // Used as both a JNI library and a regular shared library.
8523 cc_library {
8524 name: "mylib3",
8525 srcs: ["mylib.cpp"],
8526 system_shared_libs: [],
8527 stl: "none",
8528 apex_available: [ "myapex" ],
8529 }
8530
8531 cc_binary {
8532 name: "mybin",
8533 srcs: ["mybin.cpp"],
8534 shared_libs: ["mylib3"],
8535 system_shared_libs: [],
8536 stl: "none",
8537 apex_available: [ "myapex" ],
8538 }
8539
Jiyong Park34d5c332022-02-24 18:02:44 +09008540 rust_ffi_shared {
8541 name: "libfoo.rust",
8542 crate_name: "foo",
8543 srcs: ["foo.rs"],
8544 shared_libs: ["libfoo.shared_from_rust"],
8545 prefer_rlib: true,
8546 apex_available: ["myapex"],
8547 }
8548
8549 cc_library_shared {
8550 name: "libfoo.shared_from_rust",
8551 srcs: ["mylib.cpp"],
8552 system_shared_libs: [],
8553 stl: "none",
8554 stubs: {
8555 versions: ["10", "11", "12"],
8556 },
8557 }
8558
Jooyung Han643adc42020-02-27 13:50:06 +09008559 `)
8560
Jooyung Hana0503a52023-08-23 13:12:50 +09008561 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008562 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008563 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008564 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008565 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008566 "lib64/mylib.so",
8567 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008568 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008569 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008570 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008571
8572 // b/220397949
8573 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008574}
8575
Jooyung Han49f67012020-04-17 13:43:10 +09008576func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008577 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008578 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008579 apex {
8580 name: "myapex",
8581 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008582 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008583 }
8584 apex_key {
8585 name: "myapex.key",
8586 public_key: "testkey.avbpubkey",
8587 private_key: "testkey.pem",
8588 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008589 `,
8590 android.FixtureModifyConfig(func(config android.Config) {
8591 delete(config.Targets, android.Android)
8592 config.AndroidCommonTarget = android.Target{}
8593 }),
8594 )
Jooyung Han49f67012020-04-17 13:43:10 +09008595
8596 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8597 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8598 }
8599}
8600
Jiyong Parkbd159612020-02-28 15:22:21 +09008601func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008602 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008603 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008604 apex {
8605 name: "myapex",
8606 key: "myapex.key",
8607 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008608 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008609 }
8610
8611 apex_key {
8612 name: "myapex.key",
8613 public_key: "testkey.avbpubkey",
8614 private_key: "testkey.pem",
8615 }
8616
8617 android_app {
8618 name: "AppFoo",
8619 srcs: ["foo/bar/MyClass.java"],
8620 sdk_version: "none",
8621 system_modules: "none",
8622 apex_available: [ "myapex" ],
8623 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008624 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008625
Jooyung Hana0503a52023-08-23 13:12:50 +09008626 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008627 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008628
8629 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008630 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 +09008631}
8632
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008633func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008634 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008635 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008636 apex {
8637 name: "myapex",
8638 key: "myapex.key",
8639 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008640 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008641 }
8642
8643 apex_key {
8644 name: "myapex.key",
8645 public_key: "testkey.avbpubkey",
8646 private_key: "testkey.pem",
8647 }
8648
8649 android_app_set {
8650 name: "AppSet",
8651 set: "AppSet.apks",
8652 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008653 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008654 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008655 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008656 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8657 s := mod.Rule("apexRule").Args["copy_commands"]
8658 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008659 if len(copyCmds) != 4 {
8660 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008661 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008662 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8663 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008664 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8665 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008666
8667 // Ensure that canned_fs_config has an entry for the app set zip file
8668 generateFsRule := mod.Rule("generateFsConfig")
8669 cmd := generateFsRule.RuleParams.Command
8670 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008671}
8672
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008673func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008674 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008675 apex_set {
8676 name: "myapex",
8677 filename: "foo_v2.apex",
8678 sanitized: {
8679 none: { set: "myapex.apks", },
8680 hwaddress: { set: "myapex.hwasan.apks", },
8681 },
Paul Duffin24704672021-04-06 16:09:30 +01008682 }
8683 `
8684 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008685
Paul Duffin24704672021-04-06 16:09:30 +01008686 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008687 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008688
Spandan Das9d6e2092024-09-21 02:50:00 +00008689 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008690 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008691
Paul Duffin24704672021-04-06 16:09:30 +01008692 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8693
8694 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008695 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8696 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008697
8698 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008699}
8700
Pranav Guptaeba03b02022-09-27 00:27:08 +00008701func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008702 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008703 ctx := testApex(t, `
8704 apex_set {
8705 name: "myapex",
8706 set: ":myapex_apks_file",
8707 }
8708
8709 filegroup {
8710 name: "myapex_apks_file",
8711 srcs: ["myapex.apks"],
8712 }
8713 `)
8714
Spandan Das9d6e2092024-09-21 02:50:00 +00008715 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008716
8717 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008718 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008719 extractedApex := m.Output(extractorOutput)
8720
8721 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8722}
8723
Paul Duffin89f570a2021-06-16 01:42:33 +01008724func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008725 t.Helper()
8726
Paul Duffin55607122021-03-30 23:32:51 +01008727 fs := android.MockFS{
8728 "a.java": nil,
8729 "a.jar": nil,
8730 "apex_manifest.json": nil,
8731 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008732 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008733 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8734 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8735 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008736 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008737 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008738
Paul Duffin55607122021-03-30 23:32:51 +01008739 errorHandler := android.FixtureExpectsNoErrors
8740 if errmsg != "" {
8741 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008742 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008743
Paul Duffin55607122021-03-30 23:32:51 +01008744 result := android.GroupFixturePreparers(
8745 cc.PrepareForTestWithCcDefaultModules,
8746 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008747 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008748 java.PrepareForTestWithJavaSdkLibraryFiles,
8749 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008750 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008751 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008752 android.FixtureModifyMockFS(func(fs android.MockFS) {
8753 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8754 insert := ""
8755 for _, fragment := range fragments {
8756 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8757 }
8758 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8759 platform_bootclasspath {
8760 name: "platform-bootclasspath",
8761 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008762 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008763 %s
8764 ],
8765 }
8766 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008767 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008768 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008769 // Dexpreopt for boot jars requires the ART boot image profile.
8770 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8771 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008772 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008773 ).
8774 ExtendWithErrorHandler(errorHandler).
8775 RunTestWithBp(t, bp)
8776
8777 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008778}
8779
Jooyung Han548640b2020-04-27 12:10:30 +09008780func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008781 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008782 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8783 apex {
8784 name: "myapex",
8785 key: "myapex.key",
8786 updatable: true,
8787 }
8788
8789 apex_key {
8790 name: "myapex.key",
8791 public_key: "testkey.avbpubkey",
8792 private_key: "testkey.pem",
8793 }
8794 `)
8795}
8796
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008797func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008798 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008799 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8800 apex {
8801 name: "myapex",
8802 key: "myapex.key",
8803 }
8804
8805 apex_key {
8806 name: "myapex.key",
8807 public_key: "testkey.avbpubkey",
8808 private_key: "testkey.pem",
8809 }
8810 `)
8811}
8812
satayevb98371c2021-06-15 16:49:50 +01008813func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008814 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008815 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8816 apex {
8817 name: "myapex",
8818 key: "myapex.key",
8819 systemserverclasspath_fragments: [
8820 "mysystemserverclasspathfragment",
8821 ],
8822 min_sdk_version: "29",
8823 updatable: true,
8824 }
8825
8826 apex_key {
8827 name: "myapex.key",
8828 public_key: "testkey.avbpubkey",
8829 private_key: "testkey.pem",
8830 }
8831
8832 java_library {
8833 name: "foo",
8834 srcs: ["b.java"],
8835 min_sdk_version: "29",
8836 installable: true,
8837 apex_available: [
8838 "myapex",
8839 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008840 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008841 }
8842
8843 systemserverclasspath_fragment {
8844 name: "mysystemserverclasspathfragment",
8845 generate_classpaths_proto: false,
8846 contents: [
8847 "foo",
8848 ],
8849 apex_available: [
8850 "myapex",
8851 ],
8852 }
satayevabcd5972021-08-06 17:49:46 +01008853 `,
8854 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8855 )
satayevb98371c2021-06-15 16:49:50 +01008856}
8857
Paul Duffin064b70c2020-11-02 17:32:38 +00008858func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008859 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008860 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008861 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008862 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008863 fragment := java.ApexVariantReference{
8864 Apex: proptools.StringPtr("myapex"),
8865 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8866 }
8867
Paul Duffin064b70c2020-11-02 17:32:38 +00008868 testDexpreoptWithApexes(t, `
8869 prebuilt_apex {
8870 name: "myapex" ,
8871 arch: {
8872 arm64: {
8873 src: "myapex-arm64.apex",
8874 },
8875 arm: {
8876 src: "myapex-arm.apex",
8877 },
8878 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008879 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8880 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008881
Paul Duffin89f570a2021-06-16 01:42:33 +01008882 prebuilt_bootclasspath_fragment {
8883 name: "my-bootclasspath-fragment",
8884 contents: ["libfoo"],
8885 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008886 hidden_api: {
8887 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8888 metadata: "my-bootclasspath-fragment/metadata.csv",
8889 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008890 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8891 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8892 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008893 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008894 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008895
Spandan Das52c01a12024-09-20 01:09:48 +00008896 java_sdk_library_import {
8897 name: "libfoo",
8898 prefer: true,
8899 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008900 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008901 },
8902 apex_available: ["myapex"],
8903 shared_library: false,
8904 permitted_packages: ["libfoo"],
8905 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008906 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008907 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008908}
8909
Spandan Dasf14e2542021-11-12 00:01:37 +00008910func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008911 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008912 bp += `
8913 apex_key {
8914 name: "myapex.key",
8915 public_key: "testkey.avbpubkey",
8916 private_key: "testkey.pem",
8917 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008918 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008919 "lib1/src/A.java": nil,
8920 "lib2/src/B.java": nil,
8921 "system/sepolicy/apex/myapex-file_contexts": nil,
8922 }
8923
Paul Duffin45338f02021-03-30 23:07:52 +01008924 errorHandler := android.FixtureExpectsNoErrors
8925 if errmsg != "" {
8926 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008927 }
Colin Crossae8600b2020-10-29 17:09:13 -07008928
Paul Duffin45338f02021-03-30 23:07:52 +01008929 android.GroupFixturePreparers(
8930 android.PrepareForTestWithAndroidBuildComponents,
8931 java.PrepareForTestWithJavaBuildComponents,
8932 PrepareForTestWithApexBuildComponents,
8933 android.PrepareForTestWithNeverallowRules(rules),
8934 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008935 apexBootJars := make([]string, 0, len(bootJars))
8936 for _, apexBootJar := range bootJars {
8937 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008938 }
satayevd604b212021-07-21 14:23:52 +01008939 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008940 }),
8941 fs.AddToFixture(),
8942 ).
8943 ExtendWithErrorHandler(errorHandler).
8944 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008945}
8946
8947func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008948 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008949 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008950 name string
8951 expectedError string
8952 bp string
8953 bootJars []string
8954 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008955 }{
8956
8957 {
8958 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8959 expectedError: "",
8960 bp: `
8961 java_library {
8962 name: "bcp_lib1",
8963 srcs: ["lib1/src/*.java"],
8964 permitted_packages: ["foo.bar"],
8965 apex_available: ["myapex"],
8966 sdk_version: "none",
8967 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008968 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008969 }
8970 java_library {
8971 name: "nonbcp_lib2",
8972 srcs: ["lib2/src/*.java"],
8973 apex_available: ["myapex"],
8974 permitted_packages: ["a.b"],
8975 sdk_version: "none",
8976 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008977 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008978 }
8979 apex {
8980 name: "myapex",
8981 key: "myapex.key",
8982 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008983 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008984 }`,
8985 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008986 bcpPermittedPackages: map[string][]string{
8987 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008988 "foo.bar",
8989 },
8990 },
8991 },
8992 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008993 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008994 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 +01008995 bp: `
8996 java_library {
8997 name: "bcp_lib1",
8998 srcs: ["lib1/src/*.java"],
8999 apex_available: ["myapex"],
9000 permitted_packages: ["foo.bar"],
9001 sdk_version: "none",
9002 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08009003 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01009004 }
9005 java_library {
9006 name: "bcp_lib2",
9007 srcs: ["lib2/src/*.java"],
9008 apex_available: ["myapex"],
9009 permitted_packages: ["foo.bar", "bar.baz"],
9010 sdk_version: "none",
9011 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08009012 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01009013 }
9014 apex {
9015 name: "myapex",
9016 key: "myapex.key",
9017 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009018 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01009019 }
9020 `,
9021 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00009022 bcpPermittedPackages: map[string][]string{
9023 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01009024 "foo.bar",
9025 },
Spandan Dasf14e2542021-11-12 00:01:37 +00009026 "bcp_lib2": []string{
9027 "foo.bar",
9028 },
9029 },
9030 },
9031 {
9032 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
9033 expectedError: "",
9034 bp: `
9035 java_library {
9036 name: "bcp_lib_restricted",
9037 srcs: ["lib1/src/*.java"],
9038 apex_available: ["myapex"],
9039 permitted_packages: ["foo.bar"],
9040 sdk_version: "none",
9041 min_sdk_version: "29",
9042 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08009043 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00009044 }
9045 java_library {
9046 name: "bcp_lib_unrestricted",
9047 srcs: ["lib2/src/*.java"],
9048 apex_available: ["myapex"],
9049 permitted_packages: ["foo.bar", "bar.baz"],
9050 sdk_version: "none",
9051 min_sdk_version: "29",
9052 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08009053 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00009054 }
9055 apex {
9056 name: "myapex",
9057 key: "myapex.key",
9058 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
9059 updatable: true,
9060 min_sdk_version: "29",
9061 }
9062 `,
9063 bootJars: []string{"bcp_lib1", "bcp_lib2"},
9064 bcpPermittedPackages: map[string][]string{
9065 "bcp_lib1_non_updateable": []string{
9066 "foo.bar",
9067 },
9068 // 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 +01009069 },
9070 },
9071 }
9072 for _, tc := range testcases {
9073 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009074 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00009075 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9076 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009077 })
9078 }
9079}
9080
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009081// TODO(jungjw): Move this to proptools
9082func intPtr(i int) *int {
9083 return &i
9084}
9085
9086func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009087 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009088 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009089 apex_set {
9090 name: "myapex",
9091 set: "myapex.apks",
9092 filename: "foo_v2.apex",
9093 overrides: ["foo"],
9094 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009095 `,
9096 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9097 variables.Platform_sdk_version = intPtr(30)
9098 }),
9099 android.FixtureModifyConfig(func(config android.Config) {
9100 config.Targets[android.Android] = []android.Target{
9101 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9102 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9103 }
9104 }),
9105 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009106
Spandan Das9d6e2092024-09-21 02:50:00 +00009107 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009108
9109 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009110 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009111 actual := extractedApex.Args["abis"]
9112 expected := "ARMEABI_V7A,ARM64_V8A"
9113 if actual != expected {
9114 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9115 }
9116 actual = extractedApex.Args["sdk-version"]
9117 expected = "30"
9118 if actual != expected {
9119 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9120 }
9121
Paul Duffin6717d882021-06-15 19:09:41 +01009122 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009123 a := m.Module().(*ApexSet)
9124 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009125 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009126 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9127 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9128 }
9129}
9130
Anton Hansson805e0a52022-11-25 14:06:46 +00009131func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009132 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00009133 ctx := testApex(t, `
9134 apex_set {
9135 name: "myapex",
9136 set: "myapex.apks",
9137 filename: "foo_v2.apex",
9138 overrides: ["foo"],
9139 }
9140 `,
9141 android.FixtureModifyConfig(func(config android.Config) {
9142 config.Targets[android.Android] = []android.Target{
9143 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9144 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9145 }
9146 }),
9147 )
9148
Spandan Das9d6e2092024-09-21 02:50:00 +00009149 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009150
9151 // Check extract_apks tool parameters. No native bridge arch expected
9152 extractedApex := m.Output("extracted/myapex.apks")
9153 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9154}
9155
Jiyong Park7d95a512020-05-10 15:16:24 +09009156func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009157 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009158 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9159 apex {
9160 name: "myapex",
9161 key: "myapex.key",
9162 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009163 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009164 }
9165
9166 apex_key {
9167 name: "myapex.key",
9168 public_key: "testkey.avbpubkey",
9169 private_key: "testkey.pem",
9170 }
9171
9172 cc_library {
9173 name: "mylib",
9174 srcs: ["mylib.cpp"],
9175 static_libs: ["otherlib"],
9176 system_shared_libs: [],
9177 stl: "none",
9178 apex_available: [ "myapex" ],
9179 }
9180
9181 cc_library {
9182 name: "otherlib",
9183 srcs: ["mylib.cpp"],
9184 system_shared_libs: [],
9185 stl: "none",
9186 stubs: {
9187 versions: ["1", "2", "3"],
9188 },
9189 apex_available: [ "myapex" ],
9190 }
9191 `)
9192}
9193
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009194func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009195 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009196 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009197 apex {
9198 name: "myapex",
9199 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009200 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009201 custom_sign_tool: "sign_myapex",
9202 }
9203
9204 apex_key {
9205 name: "myapex.key",
9206 public_key: "testkey.avbpubkey",
9207 private_key: "testkey.pem",
9208 }
9209 `)
9210
Jooyung Han286957d2023-10-30 16:17:56 +09009211 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009212 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009213 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 +09009214}
9215
9216func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009217 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009218 ctx := testApex(t, `
9219 apex {
9220 name: "myapex",
9221 key: "myapex.key",
9222 updatable: false,
9223 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009224 }
9225
9226 apex_key {
9227 name: "myapex.key",
9228 public_key: "testkey.avbpubkey",
9229 private_key: "testkey.pem",
9230 }
9231
9232 prebuilt_apex {
9233 name: "myapex",
9234 prefer: true,
9235 arch: {
9236 arm64: {
9237 src: "myapex-arm64.apex",
9238 },
9239 arm: {
9240 src: "myapex-arm.apex",
9241 },
9242 },
9243 }
9244
9245 apex_set {
9246 name: "myapex_set",
9247 set: "myapex.apks",
9248 filename: "myapex_set.apex",
9249 overrides: ["myapex"],
9250 }
9251 `)
9252
Colin Crossf61d03d2023-11-02 16:56:39 -07009253 content := android.ContentFromFileRuleForTests(t, ctx,
9254 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009255 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 -07009256 content = android.ContentFromFileRuleForTests(t, ctx,
9257 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009258 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 +09009259}
9260
Jooyung Han938b5932020-06-20 12:47:47 +09009261func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009262 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009263 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009264 apex {
9265 name: "myapex",
9266 key: "myapex.key",
9267 apps: ["app"],
9268 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009269 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009270 }
9271
9272 apex_key {
9273 name: "myapex.key",
9274 public_key: "testkey.avbpubkey",
9275 private_key: "testkey.pem",
9276 }
9277
9278 android_app {
9279 name: "app",
9280 srcs: ["foo/bar/MyClass.java"],
9281 package_name: "foo",
9282 sdk_version: "none",
9283 system_modules: "none",
9284 apex_available: [ "myapex" ],
9285 }
9286 `, withFiles(map[string][]byte{
9287 "sub/Android.bp": []byte(`
9288 override_apex {
9289 name: "override_myapex",
9290 base: "myapex",
9291 apps: ["override_app"],
9292 allowed_files: ":allowed",
9293 }
9294 // Overridable "path" property should be referenced indirectly
9295 filegroup {
9296 name: "allowed",
9297 srcs: ["allowed.txt"],
9298 }
9299 override_android_app {
9300 name: "override_app",
9301 base: "app",
9302 package_name: "bar",
9303 }
9304 `),
9305 }))
9306
Jooyung Hana0503a52023-08-23 13:12:50 +09009307 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009308 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9309 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9310 }
9311
Spandan Das50801e22024-05-13 18:29:45 +00009312 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009313 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9314 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9315 }
9316}
9317
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009318func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009319 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009320 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009321 apex {
9322 name: "myapex",
9323 key: "myapex.key",
9324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009325 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009326 }
9327
9328 apex_key {
9329 name: "myapex.key",
9330 public_key: "testkey.avbpubkey",
9331 private_key: "testkey.pem",
9332 }
9333
9334 cc_library {
9335 name: "mylib",
9336 srcs: ["mylib.cpp"],
9337 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009338 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009339 },
9340 apex_available: ["myapex"],
9341 }
9342
9343 cc_prebuilt_library_shared {
9344 name: "mylib",
9345 prefer: false,
9346 srcs: ["prebuilt.so"],
9347 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009348 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009349 },
9350 apex_available: ["myapex"],
9351 }
9352 `)
9353}
9354
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009355func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009356 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009357 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009358 apex {
9359 name: "myapex",
9360 key: "myapex.key",
9361 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009362 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009363 }
9364 apex_key {
9365 name: "myapex.key",
9366 public_key: "testkey.avbpubkey",
9367 private_key: "testkey.pem",
9368 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009369 `,
9370 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9371 variables.CompressedApex = proptools.BoolPtr(true)
9372 }),
9373 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009374
Jooyung Hana0503a52023-08-23 13:12:50 +09009375 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009376 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9377
Jooyung Hana0503a52023-08-23 13:12:50 +09009378 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009379 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9380
9381 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009382 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009383 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9384
9385 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009386 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009387 var builder strings.Builder
9388 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9389 androidMk := builder.String()
9390 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9391}
9392
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009393func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9394 t.Parallel()
9395 ctx := testApex(t, `
9396 apex {
9397 name: "myapex",
9398 key: "myapex.key",
9399 compressible: true,
9400 updatable: false,
9401 payload_fs_type: "erofs",
9402 }
9403 apex_key {
9404 name: "myapex.key",
9405 public_key: "testkey.avbpubkey",
9406 private_key: "testkey.pem",
9407 }
9408 `,
9409 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9410 variables.CompressedApex = proptools.BoolPtr(true)
9411 }),
9412 )
9413
9414 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9415 if compressRule.Rule != nil {
9416 t.Error("erofs apex should not be compressed")
9417 }
9418}
9419
Jooyung Han26ec8482024-07-31 15:04:05 +09009420func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009421 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009422 for _, compressionEnabled := range []bool{true, false} {
9423 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009424 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009425 ctx := testApex(t, `
9426 apex_set {
9427 name: "com.company.android.myapex",
9428 apex_name: "com.android.myapex",
9429 set: "company-myapex.apks",
9430 }
9431 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9432 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9433 }),
9434 )
9435
9436 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9437 if compressionEnabled {
9438 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9439 } else {
9440 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9441 }
9442 })
9443 }
9444}
9445
Martin Stjernholm2856c662020-12-02 15:03:42 +00009446func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009447 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009448 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009449 apex {
9450 name: "myapex",
9451 key: "myapex.key",
9452 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009453 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009454 }
9455
9456 apex_key {
9457 name: "myapex.key",
9458 public_key: "testkey.avbpubkey",
9459 private_key: "testkey.pem",
9460 }
9461
9462 cc_library {
9463 name: "mylib",
9464 srcs: ["mylib.cpp"],
9465 apex_available: ["myapex"],
9466 shared_libs: ["otherlib"],
9467 system_shared_libs: [],
9468 }
9469
9470 cc_library {
9471 name: "otherlib",
9472 srcs: ["mylib.cpp"],
9473 stubs: {
9474 versions: ["current"],
9475 },
9476 }
9477
9478 cc_prebuilt_library_shared {
9479 name: "otherlib",
9480 prefer: true,
9481 srcs: ["prebuilt.so"],
9482 stubs: {
9483 versions: ["current"],
9484 },
9485 }
9486 `)
9487
Jooyung Hana0503a52023-08-23 13:12:50 +09009488 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009489 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009490 var builder strings.Builder
9491 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9492 androidMk := builder.String()
9493
9494 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9495 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009496 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009497}
9498
Jiyong Parke3867542020-12-03 17:28:25 +09009499func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009500 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009501 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009502 apex {
9503 name: "myapex",
9504 key: "myapex.key",
9505 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009506 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009507 }
9508
9509 apex_key {
9510 name: "myapex.key",
9511 public_key: "testkey.avbpubkey",
9512 private_key: "testkey.pem",
9513 }
9514
9515 cc_library {
9516 name: "mylib",
9517 srcs: ["mylib.cpp"],
9518 system_shared_libs: [],
9519 stl: "none",
9520 apex_available: ["myapex"],
9521 shared_libs: ["mylib2"],
9522 target: {
9523 apex: {
9524 exclude_shared_libs: ["mylib2"],
9525 },
9526 },
9527 }
9528
9529 cc_library {
9530 name: "mylib2",
9531 srcs: ["mylib.cpp"],
9532 system_shared_libs: [],
9533 stl: "none",
9534 }
9535 `)
9536
9537 // Check if mylib is linked to mylib2 for the non-apex target
9538 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9539 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9540
9541 // Make sure that the link doesn't occur for the apex target
9542 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9543 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9544
9545 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009546 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009547 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9548}
9549
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009550func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009551 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009552 bpBase := `
9553 apex {
9554 name: "myapex",
9555 key: "myapex.key",
9556 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009557 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009558 }
9559 apex_key {
9560 name: "myapex.key",
9561 public_key: "testkey.avbpubkey",
9562 private_key: "testkey.pem",
9563 }
9564 cc_library {
9565 name: "mylib",
9566 srcs: ["mylib.cpp"],
9567 apex_available: ["myapex"],
9568 shared_libs: ["stublib"],
9569 system_shared_libs: [],
9570 }
9571 apex {
9572 name: "otherapex",
9573 enabled: %s,
9574 key: "myapex.key",
9575 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009576 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009577 }
9578 `
9579
9580 stublibSourceBp := `
9581 cc_library {
9582 name: "stublib",
9583 srcs: ["mylib.cpp"],
9584 apex_available: ["otherapex"],
9585 system_shared_libs: [],
9586 stl: "none",
9587 stubs: {
9588 versions: ["1"],
9589 },
9590 }
9591 `
9592
9593 stublibPrebuiltBp := `
9594 cc_prebuilt_library_shared {
9595 name: "stublib",
9596 srcs: ["prebuilt.so"],
9597 apex_available: ["otherapex"],
9598 stubs: {
9599 versions: ["1"],
9600 },
9601 %s
9602 }
9603 `
9604
9605 tests := []struct {
9606 name string
9607 stublibBp string
9608 usePrebuilt bool
9609 modNames []string // Modules to collect AndroidMkEntries for
9610 otherApexEnabled []string
9611 }{
9612 {
9613 name: "only_source",
9614 stublibBp: stublibSourceBp,
9615 usePrebuilt: false,
9616 modNames: []string{"stublib"},
9617 otherApexEnabled: []string{"true", "false"},
9618 },
9619 {
9620 name: "source_preferred",
9621 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9622 usePrebuilt: false,
9623 modNames: []string{"stublib", "prebuilt_stublib"},
9624 otherApexEnabled: []string{"true", "false"},
9625 },
9626 {
9627 name: "prebuilt_preferred",
9628 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9629 usePrebuilt: true,
9630 modNames: []string{"stublib", "prebuilt_stublib"},
9631 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9632 },
9633 {
9634 name: "only_prebuilt",
9635 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9636 usePrebuilt: true,
9637 modNames: []string{"stublib"},
9638 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9639 },
9640 }
9641
9642 for _, test := range tests {
9643 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009644 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009645 for _, otherApexEnabled := range test.otherApexEnabled {
9646 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009647 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009648 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009649
9650 type modAndMkEntries struct {
9651 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009652 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009653 }
9654 entries := []*modAndMkEntries{}
9655
9656 // Gather shared lib modules that are installable
9657 for _, modName := range test.modNames {
9658 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9659 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9660 continue
9661 }
9662 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009663 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009664 continue
9665 }
Yu Liue70976d2024-10-15 20:45:35 +00009666 info := android.AndroidMkInfoForTest(t, ctx, mod)
9667 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9668 ents = append(ents, info.ExtraInfo...)
9669 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009670 if ent.Disabled {
9671 continue
9672 }
9673 entries = append(entries, &modAndMkEntries{
9674 mod: mod,
9675 mkEntries: ent,
9676 })
9677 }
9678 }
9679 }
9680
9681 var entry *modAndMkEntries = nil
9682 for _, ent := range entries {
9683 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9684 if entry != nil {
9685 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9686 } else {
9687 entry = ent
9688 }
9689 }
9690 }
9691
9692 if entry == nil {
9693 t.Errorf("AndroidMk entry for \"stublib\" missing")
9694 } else {
9695 isPrebuilt := entry.mod.Prebuilt() != nil
9696 if isPrebuilt != test.usePrebuilt {
9697 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9698 }
9699 if !entry.mod.IsStubs() {
9700 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9701 }
9702 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9703 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9704 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009705 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009706 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009707 if !android.InList(expected, cflags) {
9708 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9709 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009710 }
9711 })
9712 }
9713 })
9714 }
9715}
9716
Colin Crossc33e5212021-05-25 18:16:02 -07009717func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009718 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009719 bp := `
9720 apex {
9721 name: "myapex",
9722 key: "myapex.key",
9723 java_libs: ["mylib"],
9724 bootclasspath_fragments: ["mybootclasspathfragment"],
9725 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9726 updatable: false,
9727 }
9728
9729 apex_key {
9730 name: "myapex.key",
9731 public_key: "testkey.avbpubkey",
9732 private_key: "testkey.pem",
9733 }
9734
9735 java_library {
9736 name: "mylib",
9737 srcs: ["mylib.java"],
9738 apex_available: ["myapex"],
9739 compile_dex: true,
9740 }
9741
9742 bootclasspath_fragment {
9743 name: "mybootclasspathfragment",
9744 contents: ["mybootclasspathlib"],
9745 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009746 hidden_api: {
9747 split_packages: ["*"],
9748 },
Colin Crossc33e5212021-05-25 18:16:02 -07009749 }
9750
9751 java_library {
9752 name: "mybootclasspathlib",
9753 srcs: ["mybootclasspathlib.java"],
9754 apex_available: ["myapex"],
9755 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009756 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009757 }
9758
9759 systemserverclasspath_fragment {
9760 name: "mysystemserverclasspathfragment",
9761 contents: ["mysystemserverclasspathlib"],
9762 apex_available: ["myapex"],
9763 }
9764
9765 java_library {
9766 name: "mysystemserverclasspathlib",
9767 srcs: ["mysystemserverclasspathlib.java"],
9768 apex_available: ["myapex"],
9769 compile_dex: true,
9770 }
9771 `
9772
9773 result := android.GroupFixturePreparers(
9774 PrepareForTestWithApexBuildComponents,
9775 prepareForTestWithMyapex,
9776 java.PrepareForTestWithJavaDefaultModules,
9777 android.PrepareForTestWithAndroidBuildComponents,
9778 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009779 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9780 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009781 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009782 ).RunTest(t)
9783
9784 // Make sure jacoco ran on both mylib and mybootclasspathlib
9785 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9786 t.Errorf("Failed to find jacoco rule for mylib")
9787 }
9788 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9789 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9790 }
9791 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9792 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9793 }
9794}
9795
Jiyong Park192600a2021-08-03 07:52:17 +00009796func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009797 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009798 testApexError(t, `executable mybin is static`, `
9799 apex {
9800 name: "myapex",
9801 key: "myapex.key",
9802 binaries: ["mybin"],
9803 min_sdk_version: "29",
9804 }
9805
9806 apex_key {
9807 name: "myapex.key",
9808 public_key: "testkey.avbpubkey",
9809 private_key: "testkey.pem",
9810 }
9811
9812 cc_binary {
9813 name: "mybin",
9814 srcs: ["mylib.cpp"],
9815 relative_install_path: "foo/bar",
9816 static_executable: true,
9817 system_shared_libs: [],
9818 stl: "none",
9819 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009820 min_sdk_version: "29",
9821 }
9822 `)
9823
9824 testApexError(t, `executable mybin.rust is static`, `
9825 apex {
9826 name: "myapex",
9827 key: "myapex.key",
9828 binaries: ["mybin.rust"],
9829 min_sdk_version: "29",
9830 }
9831
9832 apex_key {
9833 name: "myapex.key",
9834 public_key: "testkey.avbpubkey",
9835 private_key: "testkey.pem",
9836 }
9837
9838 rust_binary {
9839 name: "mybin.rust",
9840 srcs: ["foo.rs"],
9841 static_executable: true,
9842 apex_available: ["myapex"],
9843 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009844 }
9845 `)
9846}
9847
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009848func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009849 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009850 ctx := testApex(t, `
9851 apex {
9852 name: "myapex",
9853 key: "myapex.key",
9854 updatable: false,
9855 java_libs: ["foo"],
9856 }
9857
9858 apex_key {
9859 name: "myapex.key",
9860 public_key: "testkey.avbpubkey",
9861 private_key: "testkey.pem",
9862 }
9863
9864 java_library {
9865 name: "foo",
9866 srcs: ["foo.java"],
9867 apex_available: ["myapex"],
9868 installable: true,
9869 }
9870 `,
9871 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9872 )
9873
Jooyung Hana0503a52023-08-23 13:12:50 +09009874 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009875 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9876 var builder strings.Builder
9877 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9878 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009879 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 +00009880}
9881
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009882func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009883 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009884 ctx := testApex(t, `
9885 apex {
9886 name: "myapex",
9887 key: "myapex.key",
9888 updatable: false,
9889 java_libs: ["foo"],
9890 required: ["otherapex"],
9891 }
9892
9893 apex {
9894 name: "otherapex",
9895 key: "myapex.key",
9896 updatable: false,
9897 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009898 }
9899
9900 apex_key {
9901 name: "myapex.key",
9902 public_key: "testkey.avbpubkey",
9903 private_key: "testkey.pem",
9904 }
9905
9906 java_library {
9907 name: "foo",
9908 srcs: ["foo.java"],
9909 apex_available: ["myapex", "otherapex"],
9910 installable: true,
9911 }
9912 `)
9913
Jooyung Hana0503a52023-08-23 13:12:50 +09009914 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009915 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9916 var builder strings.Builder
9917 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9918 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009919 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009920}
9921
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009922func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009923 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009924 ctx := testApex(t, `
9925 apex {
9926 name: "myapex",
9927 key: "myapex.key",
9928 updatable: false,
9929 }
9930
9931 apex_key {
9932 name: "myapex.key",
9933 public_key: "testkey.avbpubkey",
9934 private_key: "testkey.pem",
9935 }
9936 `)
9937
Jooyung Hana0503a52023-08-23 13:12:50 +09009938 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009939 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009940 data := android.AndroidMkDataForTest(t, ctx, bundle)
9941 var builder strings.Builder
9942 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9943 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009944 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009945}
9946
Jooyung Hana6d36672022-02-24 13:58:07 +09009947func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009948 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009949 for _, tc := range []struct {
9950 name string
9951 ref string
9952 expected_data []string
9953 }{
9954 {
9955 name: "test_using_output",
9956 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009957 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009958 },
9959 {
9960 name: "test_using_apex",
9961 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009962 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009963 },
9964 } {
9965 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009966 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009967 ctx := testApex(t, `
9968 apex {
9969 name: "myapex",
9970 key: "myapex.key",
9971 compressible: true,
9972 updatable: false,
9973 }
9974
9975 apex_key {
9976 name: "myapex.key",
9977 public_key: "testkey.avbpubkey",
9978 private_key: "testkey.pem",
9979 }
9980
9981 java_test {
9982 name: "`+tc.name+`",
9983 srcs: ["a.java"],
9984 data: ["`+tc.ref+`"],
9985 }
9986 `,
9987 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9988 variables.CompressedApex = proptools.BoolPtr(true)
9989 }))
9990 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9991 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9992 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9993 })
9994 }
9995}
9996
satayev758968a2021-12-06 11:42:40 +00009997func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009998 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009999 preparer := android.GroupFixturePreparers(
10000 PrepareForTestWithApexBuildComponents,
10001 prepareForTestWithMyapex,
10002 java.PrepareForTestWithJavaSdkLibraryFiles,
10003 java.PrepareForTestWithJavaDefaultModules,
10004 android.PrepareForTestWithAndroidBuildComponents,
10005 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
10006 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
10007 )
10008
10009 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
10010 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010011 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010012 preparer.RunTestWithBp(t, `
10013 apex {
10014 name: "myapex",
10015 key: "myapex.key",
10016 bootclasspath_fragments: ["mybootclasspathfragment"],
10017 min_sdk_version: "30",
10018 updatable: false,
10019 }
10020
10021 apex_key {
10022 name: "myapex.key",
10023 public_key: "testkey.avbpubkey",
10024 private_key: "testkey.pem",
10025 }
10026
10027 bootclasspath_fragment {
10028 name: "mybootclasspathfragment",
10029 contents: ["mybootclasspathlib"],
10030 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010031 hidden_api: {
10032 split_packages: ["*"],
10033 },
satayev758968a2021-12-06 11:42:40 +000010034 }
10035
10036 java_sdk_library {
10037 name: "mybootclasspathlib",
10038 srcs: ["mybootclasspathlib.java"],
10039 apex_available: ["myapex"],
10040 compile_dex: true,
10041 unsafe_ignore_missing_latest_api: true,
10042 min_sdk_version: "31",
10043 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000010044 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +000010045 }
10046
10047 java_library {
10048 name: "util",
10049 srcs: ["a.java"],
10050 apex_available: ["myapex"],
10051 min_sdk_version: "31",
10052 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000010053 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +000010054 }
10055
10056 java_library {
10057 name: "another_util",
10058 srcs: ["a.java"],
10059 min_sdk_version: "31",
10060 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +000010061 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +000010062 }
10063 `)
10064 })
10065
10066 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10067 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010068 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010069 preparer.RunTestWithBp(t, `
10070 apex {
10071 name: "myapex",
10072 key: "myapex.key",
10073 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10074 min_sdk_version: "30",
10075 updatable: false,
10076 }
10077
10078 apex_key {
10079 name: "myapex.key",
10080 public_key: "testkey.avbpubkey",
10081 private_key: "testkey.pem",
10082 }
10083
10084 systemserverclasspath_fragment {
10085 name: "mysystemserverclasspathfragment",
10086 contents: ["mysystemserverclasspathlib"],
10087 apex_available: ["myapex"],
10088 }
10089
10090 java_sdk_library {
10091 name: "mysystemserverclasspathlib",
10092 srcs: ["mysystemserverclasspathlib.java"],
10093 apex_available: ["myapex"],
10094 compile_dex: true,
10095 min_sdk_version: "32",
10096 unsafe_ignore_missing_latest_api: true,
10097 static_libs: ["util"],
10098 }
10099
10100 java_library {
10101 name: "util",
10102 srcs: ["a.java"],
10103 apex_available: ["myapex"],
10104 min_sdk_version: "31",
10105 static_libs: ["another_util"],
10106 }
10107
10108 java_library {
10109 name: "another_util",
10110 srcs: ["a.java"],
10111 min_sdk_version: "31",
10112 apex_available: ["myapex"],
10113 }
10114 `)
10115 })
10116
10117 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010118 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +000010119 preparer.
satayev758968a2021-12-06 11:42:40 +000010120 RunTestWithBp(t, `
10121 apex {
10122 name: "myapex",
10123 key: "myapex.key",
10124 bootclasspath_fragments: ["mybootclasspathfragment"],
10125 min_sdk_version: "30",
10126 updatable: false,
10127 }
10128
10129 apex_key {
10130 name: "myapex.key",
10131 public_key: "testkey.avbpubkey",
10132 private_key: "testkey.pem",
10133 }
10134
10135 bootclasspath_fragment {
10136 name: "mybootclasspathfragment",
10137 contents: ["mybootclasspathlib"],
10138 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010139 hidden_api: {
10140 split_packages: ["*"],
10141 },
satayev758968a2021-12-06 11:42:40 +000010142 }
10143
10144 java_sdk_library {
10145 name: "mybootclasspathlib",
10146 srcs: ["mybootclasspathlib.java"],
10147 apex_available: ["myapex"],
10148 compile_dex: true,
10149 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010150 sdk_version: "current",
10151 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010152 }
10153 `)
10154 })
10155
10156 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010157 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010158 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10159 RunTestWithBp(t, `
10160 apex {
10161 name: "myapex",
10162 key: "myapex.key",
10163 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10164 min_sdk_version: "30",
10165 updatable: false,
10166 }
10167
10168 apex_key {
10169 name: "myapex.key",
10170 public_key: "testkey.avbpubkey",
10171 private_key: "testkey.pem",
10172 }
10173
10174 systemserverclasspath_fragment {
10175 name: "mysystemserverclasspathfragment",
10176 contents: ["mysystemserverclasspathlib"],
10177 apex_available: ["myapex"],
10178 }
10179
10180 java_sdk_library {
10181 name: "mysystemserverclasspathlib",
10182 srcs: ["mysystemserverclasspathlib.java"],
10183 apex_available: ["myapex"],
10184 compile_dex: true,
10185 unsafe_ignore_missing_latest_api: true,
10186 }
10187 `)
10188 })
10189}
10190
Jiakai Zhang6decef92022-01-12 17:56:19 +000010191// Verifies that the APEX depends on all the Make modules in the list.
10192func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10193 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10194 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010195 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010196 }
10197}
10198
10199// Verifies that the APEX does not depend on any of the Make modules in the list.
10200func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10201 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10202 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010203 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010204 }
10205}
10206
Cole Faust24e25c02024-01-19 14:12:17 -080010207func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010208 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010209 bpTemplate := `
10210 apex {
10211 name: "myapex",
10212 key: "myapex.key",
10213 java_libs: ["myjavalib"],
10214 updatable: %v,
10215 min_sdk_version: "29",
10216 }
10217 apex_key {
10218 name: "myapex.key",
10219 }
10220 java_library {
10221 name: "myjavalib",
10222 srcs: ["MyClass.java"],
10223 apex_available: [ "myapex" ],
10224 lint: {
10225 strict_updatability_linting: %v,
10226 %s
10227 },
10228 sdk_version: "current",
10229 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010230 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010231 }
10232 `
10233 fs := android.MockFS{
10234 "lint-baseline.xml": nil,
10235 }
10236
10237 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010238 testCaseName string
10239 apexUpdatable bool
10240 javaStrictUpdtabilityLint bool
10241 lintFileExists bool
10242 disallowedFlagExpectedOnApex bool
10243 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010244 }{
10245 {
Colin Cross87427352024-09-25 15:41:19 -070010246 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10247 apexUpdatable: true,
10248 javaStrictUpdtabilityLint: true,
10249 lintFileExists: false,
10250 disallowedFlagExpectedOnApex: false,
10251 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010252 },
10253 {
Colin Cross87427352024-09-25 15:41:19 -070010254 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10255 apexUpdatable: false,
10256 javaStrictUpdtabilityLint: false,
10257 lintFileExists: true,
10258 disallowedFlagExpectedOnApex: false,
10259 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010260 },
10261 {
Colin Cross87427352024-09-25 15:41:19 -070010262 testCaseName: "non-updatable apex respects strict updatability of javalib",
10263 apexUpdatable: false,
10264 javaStrictUpdtabilityLint: true,
10265 lintFileExists: true,
10266 disallowedFlagExpectedOnApex: false,
10267 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010268 },
10269 {
Colin Cross87427352024-09-25 15:41:19 -070010270 testCaseName: "updatable apex checks strict updatability of javalib",
10271 apexUpdatable: true,
10272 javaStrictUpdtabilityLint: false,
10273 lintFileExists: true,
10274 disallowedFlagExpectedOnApex: true,
10275 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010276 },
10277 }
10278
10279 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010280 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010281 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010282 fixtures := []android.FixturePreparer{}
10283 baselineProperty := ""
10284 if testCase.lintFileExists {
10285 fixtures = append(fixtures, fs.AddToFixture())
10286 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10287 }
10288 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010289
Colin Cross87427352024-09-25 15:41:19 -070010290 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010291
Colin Cross87427352024-09-25 15:41:19 -070010292 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10293 if expectStrictUpdatability {
10294 if m.Rule == nil {
10295 t.Errorf("expected strict updatability check rule on %s", name)
10296 } else {
10297 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10298 m.RuleParams.Command, "--disallowed_issues NewApi")
10299 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10300 m.Inputs.Strings(), "lint-baseline.xml")
10301 }
10302 } else {
10303 if m.Rule != nil {
10304 t.Errorf("expected no strict updatability check rule on %s", name)
10305 }
10306 }
10307 }
10308
10309 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10310 apex := result.ModuleForTests("myapex", "android_common_myapex")
10311 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10312 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10313
10314 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10315 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10316 })
Cole Faust24e25c02024-01-19 14:12:17 -080010317 }
10318}
10319
Cole Faust24e25c02024-01-19 14:12:17 -080010320// checks transtive deps of an apex coming from bootclasspath_fragment
10321func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010322 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010323 bp := `
10324 apex {
10325 name: "myapex",
10326 key: "myapex.key",
10327 bootclasspath_fragments: ["mybootclasspathfragment"],
10328 updatable: true,
10329 min_sdk_version: "29",
10330 }
10331 apex_key {
10332 name: "myapex.key",
10333 }
10334 bootclasspath_fragment {
10335 name: "mybootclasspathfragment",
10336 contents: ["myjavalib"],
10337 apex_available: ["myapex"],
10338 hidden_api: {
10339 split_packages: ["*"],
10340 },
10341 }
10342 java_library {
10343 name: "myjavalib",
10344 srcs: ["MyClass.java"],
10345 apex_available: [ "myapex" ],
10346 sdk_version: "current",
10347 min_sdk_version: "29",
10348 compile_dex: true,
10349 lint: {
10350 baseline_filename: "lint-baseline.xml",
10351 }
10352 }
10353 `
10354 fs := android.MockFS{
10355 "lint-baseline.xml": nil,
10356 }
10357
10358 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010359 apex := result.ModuleForTests("myapex", "android_common_myapex")
10360 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10361 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10362 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10363 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10364 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010365}
Spandan Das66773252022-01-15 00:23:18 +000010366
Jihoon Kang784c0052024-06-25 22:15:39 +000010367func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010368 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010369 bp := `
10370 apex {
10371 name: "myapex",
10372 key: "myapex.key",
10373 bootclasspath_fragments: ["mybootclasspathfragment"],
10374 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010375 java_libs: [
10376 "jacocoagent",
10377 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010378 }
10379 apex_key {
10380 name: "myapex.key",
10381 }
10382 bootclasspath_fragment {
10383 name: "mybootclasspathfragment",
10384 contents: ["foo"],
10385 apex_available: ["myapex"],
10386 hidden_api: {
10387 split_packages: ["*"],
10388 },
10389 }
10390 java_sdk_library {
10391 name: "foo",
10392 srcs: ["MyClass.java"],
10393 apex_available: [ "myapex" ],
10394 sdk_version: "current",
10395 min_sdk_version: "29",
10396 compile_dex: true,
10397 }
10398 `
10399 fs := android.MockFS{
10400 "lint-baseline.xml": nil,
10401 }
10402
10403 result := android.GroupFixturePreparers(
10404 prepareForApexTest,
10405 java.PrepareForTestWithJavaSdkLibraryFiles,
10406 java.PrepareForTestWithJacocoInstrumentation,
10407 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010408 android.FixtureMergeMockFs(fs),
10409 ).RunTestWithBp(t, bp)
10410
10411 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10412 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10413 android.AssertStringDoesContain(t,
10414 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10415 lintReportInputs, "foo.impl")
10416}
10417
Spandan Das42e89502022-05-06 22:12:55 +000010418// updatable apexes should propagate updatable=true to its apps
10419func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010420 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010421 bp := `
10422 apex {
10423 name: "myapex",
10424 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010425 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010426 apps: [
10427 "myapp",
10428 ],
10429 min_sdk_version: "30",
10430 }
10431 apex_key {
10432 name: "myapex.key",
10433 }
10434 android_app {
10435 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010436 apex_available: [
10437 "myapex",
10438 ],
10439 sdk_version: "current",
10440 min_sdk_version: "30",
10441 }
10442 `
Colin Cross99939e92024-10-01 16:02:46 -070010443 _ = android.GroupFixturePreparers(
10444 prepareForApexTest,
10445 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10446 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010447}
10448
Jingwen Chendea7a642023-03-28 11:30:50 +000010449func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010450 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010451 ctx := testApex(t, `
10452 apex {
10453 name: "myapex",
10454 key: "myapex.key",
10455 updatable: false,
10456 }
10457
10458 apex_key {
10459 name: "myapex.key",
10460 public_key: "testkey.avbpubkey",
10461 private_key: "testkey.pem",
10462 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010463 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010464 generateFsRule := mod.Rule("generateFsConfig")
10465 cmd := generateFsRule.RuleParams.Command
10466
10467 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10468}
10469
10470func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010471 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010472 ctx := testApex(t, `
10473 apex {
10474 name: "myapex",
10475 key: "myapex.key",
10476 canned_fs_config: "my_config",
10477 updatable: false,
10478 }
10479
10480 apex_key {
10481 name: "myapex.key",
10482 public_key: "testkey.avbpubkey",
10483 private_key: "testkey.pem",
10484 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010485 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010486 generateFsRule := mod.Rule("generateFsConfig")
10487 cmd := generateFsRule.RuleParams.Command
10488
10489 // Ensure that canned_fs_config has "cat my_config" at the end
10490 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10491}
Spandan Das20fce2d2023-04-12 17:21:39 +000010492
10493func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010494 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010495 testCases := []struct {
10496 desc string
10497 hasStubs bool
10498 apexAvailable string
10499 expectedError string
10500 }{
10501 {
10502 desc: "non-stub library can have multiple apex_available",
10503 hasStubs: false,
10504 apexAvailable: `["myapex", "otherapex"]`,
10505 },
10506 {
10507 desc: "stub library should not be available to anyapex",
10508 hasStubs: true,
10509 apexAvailable: `["//apex_available:anyapex"]`,
10510 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10511 },
10512 {
10513 desc: "stub library should not be available to multiple apexes",
10514 hasStubs: true,
10515 apexAvailable: `["myapex", "otherapex"]`,
10516 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10517 },
10518 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010519 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 +000010520 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010521 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010522 },
10523 }
10524 bpTemplate := `
10525 cc_library {
10526 name: "libfoo",
10527 %v
10528 apex_available: %v,
10529 }
10530 apex {
10531 name: "myapex",
10532 key: "apex.key",
10533 updatable: false,
10534 native_shared_libs: ["libfoo"],
10535 }
10536 apex {
10537 name: "otherapex",
10538 key: "apex.key",
10539 updatable: false,
10540 }
10541 apex_test {
10542 name: "test_myapex",
10543 key: "apex.key",
10544 updatable: false,
10545 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010546 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010547 }
10548 apex_key {
10549 name: "apex.key",
10550 }
10551 `
10552 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010553 t.Run(tc.desc, func(t *testing.T) {
10554 stubs := ""
10555 if tc.hasStubs {
10556 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10557 }
10558 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10559 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10560 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10561 })
10562 if tc.expectedError == "" {
10563 testApex(t, bp, mockFsFixturePreparer)
10564 } else {
10565 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10566 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010567 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010568 }
10569}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010570
10571func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010572 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010573 context := android.GroupFixturePreparers(
10574 android.PrepareForIntegrationTestWithAndroid,
10575 cc.PrepareForIntegrationTestWithCc,
10576 PrepareForTestWithApexBuildComponents,
10577 prepareForTestWithMyapex,
10578 filesystem.PrepareForTestWithFilesystemBuildComponents,
10579 )
10580 result := context.RunTestWithBp(t, `
10581 android_system_image {
10582 name: "myfilesystem",
10583 deps: [
10584 "libfoo",
10585 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010586 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010587 gen_linker_config: true,
10588 linker_config_srcs: ["linker.config.json"],
10589 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010590 }
10591
10592 cc_library {
10593 name: "libfoo",
10594 shared_libs: [
10595 "libbar",
10596 ],
10597 stl: "none",
10598 }
10599
10600 cc_library {
10601 name: "libbar",
10602 stl: "none",
10603 apex_available: ["myapex"],
10604 }
10605
10606 apex {
10607 name: "myapex",
10608 native_shared_libs: ["libbar"],
10609 key: "myapex.key",
10610 updatable: false,
10611 }
10612
10613 apex_key {
10614 name: "myapex.key",
10615 public_key: "testkey.avbpubkey",
10616 private_key: "testkey.pem",
10617 }
10618 `)
10619
Cole Faust3b806d32024-03-11 15:15:03 -070010620 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010621 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10622 inputs.Strings(),
10623 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10624}
Yu Liueae7b362023-11-16 17:05:47 -080010625
10626var apex_default_bp = `
10627 apex_key {
10628 name: "myapex.key",
10629 public_key: "testkey.avbpubkey",
10630 private_key: "testkey.pem",
10631 }
10632
10633 filegroup {
10634 name: "myapex.manifest",
10635 srcs: ["apex_manifest.json"],
10636 }
10637
10638 filegroup {
10639 name: "myapex.androidmanifest",
10640 srcs: ["AndroidManifest.xml"],
10641 }
10642`
10643
10644func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010645 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010646 ctx := testApex(t, apex_default_bp+`
10647 apex {
10648 name: "myapex",
10649 manifest: ":myapex.manifest",
10650 androidManifest: ":myapex.androidmanifest",
10651 key: "myapex.key",
10652 java_libs: [
10653 "my_java_library_foo",
10654 "my_java_library_bar",
10655 ],
10656 updatable: false,
10657 }
10658
10659 java_library {
10660 name: "my_java_library_foo",
10661 srcs: ["foo/bar/MyClass.java"],
10662 sdk_version: "none",
10663 system_modules: "none",
10664 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010665 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010666 "myapex",
10667 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010668 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010669 }
10670
10671 java_library {
10672 name: "my_java_library_bar",
10673 srcs: ["foo/bar/MyClass.java"],
10674 sdk_version: "none",
10675 system_modules: "none",
10676 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010677 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010678 "myapex",
10679 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010680 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010681 }
10682
10683 aconfig_declarations {
10684 name: "my_aconfig_declarations_foo",
10685 package: "com.example.package",
10686 container: "myapex",
10687 srcs: ["foo.aconfig"],
10688 }
10689
10690 java_aconfig_library {
10691 name: "my_java_aconfig_library_foo",
10692 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010693 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010694 "myapex",
10695 ],
10696 }
10697
10698 aconfig_declarations {
10699 name: "my_aconfig_declarations_bar",
10700 package: "com.example.package",
10701 container: "myapex",
10702 srcs: ["bar.aconfig"],
10703 }
10704
10705 java_aconfig_library {
10706 name: "my_java_aconfig_library_bar",
10707 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010708 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010709 "myapex",
10710 ],
10711 }
10712 `)
10713
10714 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10715 s := mod.Rule("apexRule").Args["copy_commands"]
10716 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010717 if len(copyCmds) != 14 {
10718 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010719 }
10720
Jooyung Hana3fddf42024-09-03 13:22:21 +090010721 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10722 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10723 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10724 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010725 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010726
Yu Liubba555e2024-02-17 00:36:42 +000010727 inputs := []string{
10728 "my_aconfig_declarations_foo/intermediate.pb",
10729 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010730 }
Yu Liubba555e2024-02-17 00:36:42 +000010731 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10732 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10733 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10734 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010735 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010736}
10737
10738func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010739 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010740 ctx := testApex(t, apex_default_bp+`
10741 apex {
10742 name: "myapex",
10743 manifest: ":myapex.manifest",
10744 androidManifest: ":myapex.androidmanifest",
10745 key: "myapex.key",
10746 java_libs: [
10747 "my_java_library_foo",
10748 ],
10749 native_shared_libs: [
10750 "my_cc_library_bar",
10751 ],
10752 binaries: [
10753 "my_cc_binary_baz",
10754 ],
10755 updatable: false,
10756 }
10757
10758 java_library {
10759 name: "my_java_library_foo",
10760 srcs: ["foo/bar/MyClass.java"],
10761 sdk_version: "none",
10762 system_modules: "none",
10763 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010764 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010765 "myapex",
10766 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010767 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010768 }
10769
10770 cc_library {
10771 name: "my_cc_library_bar",
10772 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010773 static_libs: [
10774 "my_cc_aconfig_library_bar",
10775 "my_cc_aconfig_library_baz",
10776 ],
Yu Liueae7b362023-11-16 17:05:47 -080010777 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010778 "myapex",
10779 ],
10780 }
10781
10782 cc_binary {
10783 name: "my_cc_binary_baz",
10784 srcs: ["foo/bar/MyClass.cc"],
10785 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010786 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010787 "myapex",
10788 ],
10789 }
10790
10791 aconfig_declarations {
10792 name: "my_aconfig_declarations_foo",
10793 package: "com.example.package",
10794 container: "myapex",
10795 srcs: ["foo.aconfig"],
10796 }
10797
10798 java_aconfig_library {
10799 name: "my_java_aconfig_library_foo",
10800 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010801 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010802 "myapex",
10803 ],
10804 }
10805
10806 aconfig_declarations {
10807 name: "my_aconfig_declarations_bar",
10808 package: "com.example.package",
10809 container: "myapex",
10810 srcs: ["bar.aconfig"],
10811 }
10812
10813 cc_aconfig_library {
10814 name: "my_cc_aconfig_library_bar",
10815 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010816 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010817 "myapex",
10818 ],
10819 }
10820
10821 aconfig_declarations {
10822 name: "my_aconfig_declarations_baz",
10823 package: "com.example.package",
10824 container: "myapex",
10825 srcs: ["baz.aconfig"],
10826 }
10827
10828 cc_aconfig_library {
10829 name: "my_cc_aconfig_library_baz",
10830 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010831 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010832 "myapex",
10833 ],
10834 }
10835
10836 cc_library {
10837 name: "server_configurable_flags",
10838 srcs: ["server_configurable_flags.cc"],
10839 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010840 cc_library {
10841 name: "libbase",
10842 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010843 apex_available: [
10844 "myapex",
10845 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010846 }
10847 cc_library {
10848 name: "libaconfig_storage_read_api_cc",
10849 srcs: ["libaconfig_storage_read_api_cc.cc"],
10850 }
Yu Liueae7b362023-11-16 17:05:47 -080010851 `)
10852
10853 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10854 s := mod.Rule("apexRule").Args["copy_commands"]
10855 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010856 if len(copyCmds) != 18 {
10857 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010858 }
10859
Jooyung Hana3fddf42024-09-03 13:22:21 +090010860 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10861 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10862 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10863 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010864 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010865
Yu Liubba555e2024-02-17 00:36:42 +000010866 inputs := []string{
10867 "my_aconfig_declarations_foo/intermediate.pb",
10868 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10869 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010870 }
Yu Liubba555e2024-02-17 00:36:42 +000010871 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10872 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10873 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10874 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010875 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010876}
10877
Yu Liucec0e412023-11-30 16:45:50 -080010878func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010879 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010880 ctx := testApex(t, apex_default_bp+`
10881 apex {
10882 name: "myapex",
10883 manifest: ":myapex.manifest",
10884 androidManifest: ":myapex.androidmanifest",
10885 key: "myapex.key",
10886 native_shared_libs: [
10887 "libmy_rust_library",
10888 ],
10889 binaries: [
10890 "my_rust_binary",
10891 ],
10892 rust_dyn_libs: [
10893 "libmy_rust_dylib",
10894 ],
10895 updatable: false,
10896 }
10897
10898 rust_library {
10899 name: "libflags_rust", // test mock
10900 crate_name: "flags_rust",
10901 srcs: ["lib.rs"],
10902 apex_available: [
10903 "myapex",
10904 ],
10905 }
10906
10907 rust_library {
10908 name: "liblazy_static", // test mock
10909 crate_name: "lazy_static",
10910 srcs: ["src/lib.rs"],
10911 apex_available: [
10912 "myapex",
10913 ],
10914 }
10915
Ted Bauer02d475c2024-03-27 20:56:26 +000010916 rust_library {
10917 name: "libaconfig_storage_read_api", // test mock
10918 crate_name: "aconfig_storage_read_api",
10919 srcs: ["src/lib.rs"],
10920 apex_available: [
10921 "myapex",
10922 ],
10923 }
10924
Ted Bauer6ef40db2024-03-29 14:04:10 +000010925 rust_library {
10926 name: "liblogger", // test mock
10927 crate_name: "logger",
10928 srcs: ["src/lib.rs"],
10929 apex_available: [
10930 "myapex",
10931 ],
10932 }
10933
10934 rust_library {
10935 name: "liblog_rust", // test mock
10936 crate_name: "log_rust",
10937 srcs: ["src/lib.rs"],
10938 apex_available: [
10939 "myapex",
10940 ],
10941 }
10942
Yu Liucec0e412023-11-30 16:45:50 -080010943 rust_ffi_shared {
10944 name: "libmy_rust_library",
10945 srcs: ["src/lib.rs"],
10946 rustlibs: ["libmy_rust_aconfig_library_foo"],
10947 crate_name: "my_rust_library",
10948 apex_available: [
10949 "myapex",
10950 ],
10951 }
10952
10953 rust_library_dylib {
10954 name: "libmy_rust_dylib",
10955 srcs: ["foo/bar/MyClass.rs"],
10956 rustlibs: ["libmy_rust_aconfig_library_bar"],
10957 crate_name: "my_rust_dylib",
10958 apex_available: [
10959 "myapex",
10960 ],
10961 }
10962
10963 rust_binary {
10964 name: "my_rust_binary",
10965 srcs: ["foo/bar/MyClass.rs"],
10966 rustlibs: [
10967 "libmy_rust_aconfig_library_baz",
10968 "libmy_rust_dylib",
10969 ],
10970 apex_available: [
10971 "myapex",
10972 ],
10973 }
10974
10975 aconfig_declarations {
10976 name: "my_aconfig_declarations_foo",
10977 package: "com.example.package",
10978 container: "myapex",
10979 srcs: ["foo.aconfig"],
10980 }
10981
10982 aconfig_declarations {
10983 name: "my_aconfig_declarations_bar",
10984 package: "com.example.package",
10985 container: "myapex",
10986 srcs: ["bar.aconfig"],
10987 }
10988
10989 aconfig_declarations {
10990 name: "my_aconfig_declarations_baz",
10991 package: "com.example.package",
10992 container: "myapex",
10993 srcs: ["baz.aconfig"],
10994 }
10995
10996 rust_aconfig_library {
10997 name: "libmy_rust_aconfig_library_foo",
10998 aconfig_declarations: "my_aconfig_declarations_foo",
10999 crate_name: "my_rust_aconfig_library_foo",
11000 apex_available: [
11001 "myapex",
11002 ],
11003 }
11004
11005 rust_aconfig_library {
11006 name: "libmy_rust_aconfig_library_bar",
11007 aconfig_declarations: "my_aconfig_declarations_bar",
11008 crate_name: "my_rust_aconfig_library_bar",
11009 apex_available: [
11010 "myapex",
11011 ],
11012 }
11013
11014 rust_aconfig_library {
11015 name: "libmy_rust_aconfig_library_baz",
11016 aconfig_declarations: "my_aconfig_declarations_baz",
11017 crate_name: "my_rust_aconfig_library_baz",
11018 apex_available: [
11019 "myapex",
11020 ],
11021 }
11022 `)
11023
11024 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11025 s := mod.Rule("apexRule").Args["copy_commands"]
11026 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +000011027 if len(copyCmds) != 34 {
11028 t.Fatalf("Expected 34 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080011029 }
11030
Jooyung Hana3fddf42024-09-03 13:22:21 +090011031 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
11032 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
11033 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
11034 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000011035 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080011036
Yu Liubba555e2024-02-17 00:36:42 +000011037 inputs := []string{
11038 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000011039 "my_aconfig_declarations_bar/intermediate.pb",
11040 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000011041 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
11042 }
11043 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
11044 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
11045 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
11046 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000011047 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000011048}
11049
11050func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
11051 aconfigRule := mod.Description(desc)
11052 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080011053 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000011054 if len(aconfigArgs) != len(inputs) {
11055 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080011056 }
Yu Liucec0e412023-11-30 16:45:50 -080011057
Yu Liubba555e2024-02-17 00:36:42 +000011058 ensureEquals(t, container, aconfigRule.Args["container"])
11059 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
11060
11061 buildParams := aconfigRule.BuildParams
11062 for _, input := range inputs {
11063 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11064 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011065 }
Yu Liubba555e2024-02-17 00:36:42 +000011066
11067 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011068}
11069
Yu Liueae7b362023-11-16 17:05:47 -080011070func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011071 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011072 ctx := testApex(t, apex_default_bp+`
11073 apex {
11074 name: "myapex",
11075 manifest: ":myapex.manifest",
11076 androidManifest: ":myapex.androidmanifest",
11077 key: "myapex.key",
11078 java_libs: [
11079 "my_java_library_foo",
11080 "other_java_library_bar",
11081 ],
11082 updatable: false,
11083 }
11084
11085 java_library {
11086 name: "my_java_library_foo",
11087 srcs: ["foo/bar/MyClass.java"],
11088 sdk_version: "none",
11089 system_modules: "none",
11090 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011091 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011092 "myapex",
11093 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011094 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011095 }
11096
11097 java_library {
11098 name: "other_java_library_bar",
11099 srcs: ["foo/bar/MyClass.java"],
11100 sdk_version: "none",
11101 system_modules: "none",
11102 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011103 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011104 "myapex",
11105 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011106 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011107 }
11108
11109 aconfig_declarations {
11110 name: "my_aconfig_declarations_foo",
11111 package: "com.example.package",
11112 container: "myapex",
11113 srcs: ["foo.aconfig"],
11114 }
11115
11116 java_aconfig_library {
11117 name: "my_java_aconfig_library_foo",
11118 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011119 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011120 "myapex",
11121 ],
11122 }
11123
11124 aconfig_declarations {
11125 name: "other_aconfig_declarations_bar",
11126 package: "com.example.package",
11127 container: "otherapex",
11128 srcs: ["bar.aconfig"],
11129 }
11130
11131 java_aconfig_library {
11132 name: "other_java_aconfig_library_bar",
11133 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011134 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011135 "myapex",
11136 ],
11137 }
11138 `)
11139
11140 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11141 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11142 s := " " + combineAconfigRule.Args["cache_files"]
11143 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11144 if len(aconfigArgs) != 1 {
11145 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11146 }
11147 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11148
11149 buildParams := combineAconfigRule.BuildParams
11150 if len(buildParams.Inputs) != 1 {
11151 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11152 }
11153 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11154 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11155}
11156
11157func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011158 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011159 ctx := testApex(t, apex_default_bp+`
11160 apex {
11161 name: "myapex",
11162 manifest: ":myapex.manifest",
11163 androidManifest: ":myapex.androidmanifest",
11164 key: "myapex.key",
11165 java_libs: [
11166 "my_java_library_foo",
11167 "my_java_library_bar",
11168 ],
11169 updatable: false,
11170 }
11171
11172 java_library {
11173 name: "my_java_library_foo",
11174 srcs: ["foo/bar/MyClass.java"],
11175 sdk_version: "none",
11176 system_modules: "none",
11177 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011178 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011179 "myapex",
11180 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011181 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011182 }
11183
11184 java_library {
11185 name: "my_java_library_bar",
11186 srcs: ["foo/bar/MyClass.java"],
11187 sdk_version: "none",
11188 system_modules: "none",
11189 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011190 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011191 "myapex",
11192 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011193 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011194 }
11195
11196 aconfig_declarations {
11197 name: "my_aconfig_declarations_foo",
11198 package: "com.example.package",
11199 container: "myapex",
11200 srcs: ["foo.aconfig"],
11201 }
11202
11203 java_aconfig_library {
11204 name: "my_java_aconfig_library_foo",
11205 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011206 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011207 "myapex",
11208 ],
11209 }
11210
11211 java_aconfig_library {
11212 name: "my_java_aconfig_library_bar",
11213 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011214 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011215 "myapex",
11216 ],
11217 }
11218 `)
11219
11220 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11221 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11222 s := " " + combineAconfigRule.Args["cache_files"]
11223 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11224 if len(aconfigArgs) != 1 {
11225 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11226 }
11227 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11228
11229 buildParams := combineAconfigRule.BuildParams
11230 if len(buildParams.Inputs) != 1 {
11231 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11232 }
11233 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11234 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11235}
Spandan Das5be63332023-12-13 00:06:32 +000011236
11237// Test that the boot jars come from the _selected_ apex prebuilt
11238// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11239func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011240 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011241 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11242 t.Helper()
11243 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11244 foundLibfooJar := false
11245 base := stem + ".jar"
11246 for _, output := range s.AllOutputs() {
11247 if filepath.Base(output) == base {
11248 foundLibfooJar = true
11249 buildRule := s.Output(output)
11250 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11251 }
11252 }
11253 if !foundLibfooJar {
11254 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11255 }
11256 }
11257
Spandan Das64c9e0c2023-12-20 20:13:34 +000011258 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11259 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11260 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11261 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11262 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11263 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)
11264 }
11265
11266 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11267 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11268 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11269 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11270 }
11271
Spandan Das5be63332023-12-13 00:06:32 +000011272 bp := `
11273 // Source APEX.
11274
11275 java_library {
11276 name: "framework-foo",
11277 srcs: ["foo.java"],
11278 installable: true,
11279 apex_available: [
11280 "com.android.foo",
11281 ],
11282 }
11283
11284 bootclasspath_fragment {
11285 name: "foo-bootclasspath-fragment",
11286 contents: ["framework-foo"],
11287 apex_available: [
11288 "com.android.foo",
11289 ],
11290 hidden_api: {
11291 split_packages: ["*"],
11292 },
11293 }
11294
11295 apex_key {
11296 name: "com.android.foo.key",
11297 public_key: "com.android.foo.avbpubkey",
11298 private_key: "com.android.foo.pem",
11299 }
11300
11301 apex {
11302 name: "com.android.foo",
11303 key: "com.android.foo.key",
11304 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11305 updatable: false,
11306 }
11307
11308 // Prebuilt APEX.
11309
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011310 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011311 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011312 public: {
11313 jars: ["foo.jar"],
11314 },
Spandan Das5be63332023-12-13 00:06:32 +000011315 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011316 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011317 }
11318
11319 prebuilt_bootclasspath_fragment {
11320 name: "foo-bootclasspath-fragment",
11321 contents: ["framework-foo"],
11322 hidden_api: {
11323 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11324 metadata: "my-bootclasspath-fragment/metadata.csv",
11325 index: "my-bootclasspath-fragment/index.csv",
11326 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11327 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11328 },
11329 apex_available: [
11330 "com.android.foo",
11331 ],
11332 }
11333
11334 prebuilt_apex {
11335 name: "com.android.foo",
11336 apex_name: "com.android.foo",
11337 src: "com.android.foo-arm.apex",
11338 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11339 }
11340
11341 // Another Prebuilt ART APEX
11342 prebuilt_apex {
11343 name: "com.android.foo.v2",
11344 apex_name: "com.android.foo", // Used to determine the API domain
11345 src: "com.android.foo-arm.apex",
11346 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11347 }
11348
11349 // APEX contribution modules
11350
11351 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011352 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011353 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011354 contents: ["com.android.foo"],
11355 }
11356
11357 apex_contributions {
11358 name: "foo.prebuilt.contributions",
11359 api_domain: "com.android.foo",
11360 contents: ["prebuilt_com.android.foo"],
11361 }
11362
11363 apex_contributions {
11364 name: "foo.prebuilt.v2.contributions",
11365 api_domain: "com.android.foo",
11366 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011367 }
11368 `
11369
11370 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011371 desc string
11372 selectedApexContributions string
11373 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011374 }{
11375 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011376 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11377 selectedApexContributions: "foo.source.contributions",
11378 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011379 },
11380 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011381 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11382 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011383 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 +000011384 },
11385 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011386 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11387 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011388 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 +000011389 },
11390 }
11391
11392 fragment := java.ApexVariantReference{
11393 Apex: proptools.StringPtr("com.android.foo"),
11394 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11395 }
11396
11397 for _, tc := range testCases {
11398 preparer := android.GroupFixturePreparers(
11399 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11400 android.FixtureMergeMockFs(map[string][]byte{
11401 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11402 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011403 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11404 // file creation.
11405 java.FixtureConfigureBootJars("platform:foo"),
11406 android.FixtureModifyMockFS(func(fs android.MockFS) {
11407 fs["platform/Android.bp"] = []byte(`
11408 java_library {
11409 name: "foo",
11410 srcs: ["Test.java"],
11411 compile_dex: true,
11412 }
11413 `)
11414 fs["platform/Test.java"] = nil
11415 }),
11416
Colin Crossa66b4632024-08-08 15:50:47 -070011417 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011418 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011419 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011420 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011421 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11422 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011423 }
11424}
Spandan Das3576e762024-01-03 18:57:03 +000011425
11426// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11427// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11428func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011429 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011430 // for a mainline module family, check that only the flagged soong module is visible to make
11431 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11432 variation := func(moduleName string) string {
11433 ret := "android_common_com.android.foo"
11434 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011435 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011436 }
11437 return ret
11438 }
11439
11440 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11441 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11442
11443 for _, hiddenModuleName := range hiddenModuleNames {
11444 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11445 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11446
11447 }
11448 }
11449
11450 bp := `
11451 apex_key {
11452 name: "com.android.foo.key",
11453 public_key: "com.android.foo.avbpubkey",
11454 private_key: "com.android.foo.pem",
11455 }
11456
11457 // AOSP source apex
11458 apex {
11459 name: "com.android.foo",
11460 key: "com.android.foo.key",
11461 updatable: false,
11462 }
11463
11464 // Google source apex
11465 override_apex {
11466 name: "com.google.android.foo",
11467 base: "com.android.foo",
11468 key: "com.android.foo.key",
11469 }
11470
11471 // Prebuilt Google APEX.
11472
11473 prebuilt_apex {
11474 name: "com.google.android.foo",
11475 apex_name: "com.android.foo",
11476 src: "com.android.foo-arm.apex",
11477 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11478 }
11479
11480 // Another Prebuilt Google APEX
11481 prebuilt_apex {
11482 name: "com.google.android.foo.v2",
11483 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011484 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011485 src: "com.android.foo-arm.apex",
11486 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11487 }
11488
11489 // APEX contribution modules
11490
11491 apex_contributions {
11492 name: "foo.source.contributions",
11493 api_domain: "com.android.foo",
11494 contents: ["com.google.android.foo"],
11495 }
11496
11497 apex_contributions {
11498 name: "foo.prebuilt.contributions",
11499 api_domain: "com.android.foo",
11500 contents: ["prebuilt_com.google.android.foo"],
11501 }
11502
11503 apex_contributions {
11504 name: "foo.prebuilt.v2.contributions",
11505 api_domain: "com.android.foo",
11506 contents: ["prebuilt_com.google.android.foo.v2"],
11507 }
11508
11509 // This is an incompatible module because it selects multiple versions of the same mainline module
11510 apex_contributions {
11511 name: "foo.prebuilt.duplicate.contributions",
11512 api_domain: "com.android.foo",
11513 contents: [
11514 "prebuilt_com.google.android.foo",
11515 "prebuilt_com.google.android.foo.v2",
11516 ],
11517 }
11518 `
11519
11520 testCases := []struct {
11521 desc string
11522 selectedApexContributions string
11523 expectedVisibleModuleName string
11524 expectedHiddenModuleNames []string
11525 expectedError string
11526 }{
11527 {
11528 desc: "Source apex is selected, prebuilts should be hidden from make",
11529 selectedApexContributions: "foo.source.contributions",
11530 expectedVisibleModuleName: "com.google.android.foo",
11531 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11532 },
11533 {
11534 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11535 selectedApexContributions: "foo.prebuilt.contributions",
11536 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11537 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11538 },
11539 {
11540 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11541 selectedApexContributions: "foo.prebuilt.v2.contributions",
11542 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11543 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11544 },
11545 {
11546 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11547 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11548 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11549 },
11550 }
11551
11552 for _, tc := range testCases {
11553 preparer := android.GroupFixturePreparers(
11554 android.FixtureMergeMockFs(map[string][]byte{
11555 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11556 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011557 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011558 )
11559 if tc.expectedError != "" {
11560 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11561 testApex(t, bp, preparer)
11562 return
11563 }
11564 ctx := testApex(t, bp, preparer)
11565
Spandan Das3576e762024-01-03 18:57:03 +000011566 // Check that
11567 // 1. The contents of the selected apex_contributions are visible to make
11568 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11569 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11570 }
11571}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011572
Spandan Das85bd4622024-08-01 00:51:20 +000011573// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11574func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011575 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011576 // for a mainline module family, check that only the flagged soong module is visible to make
11577 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11578 variation := func(moduleName string) string {
11579 ret := "android_common_com.android.adservices"
11580 if moduleName == "com.google.android.foo" {
11581 ret = "android_common_com.google.android.foo_com.google.android.foo"
11582 }
11583 return ret
11584 }
11585
11586 for _, visibleModuleName := range visibleModuleNames {
11587 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11588 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11589 }
11590
11591 for _, hiddenModuleName := range hiddenModuleNames {
11592 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11593 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11594
11595 }
11596 }
11597
11598 bp := `
11599 apex_key {
11600 name: "com.android.adservices.key",
11601 public_key: "com.android.adservices.avbpubkey",
11602 private_key: "com.android.adservices.pem",
11603 }
11604
11605 // AOSP source apex
11606 apex {
11607 name: "com.android.adservices",
11608 key: "com.android.adservices.key",
11609 updatable: false,
11610 }
11611
11612 // Prebuilt Google APEX.
11613
11614 prebuilt_apex {
11615 name: "com.google.android.adservices",
11616 apex_name: "com.android.adservices",
11617 src: "com.android.foo-arm.apex",
11618 }
11619
11620 // Another Prebuilt Google APEX
11621 prebuilt_apex {
11622 name: "com.google.android.adservices.v2",
11623 apex_name: "com.android.adservices",
11624 src: "com.android.foo-arm.apex",
11625 }
11626
11627 // APEX contribution modules
11628
11629
11630 apex_contributions {
11631 name: "adservices.prebuilt.contributions",
11632 api_domain: "com.android.adservices",
11633 contents: ["prebuilt_com.google.android.adservices"],
11634 }
11635
11636 apex_contributions {
11637 name: "adservices.prebuilt.v2.contributions",
11638 api_domain: "com.android.adservices",
11639 contents: ["prebuilt_com.google.android.adservices.v2"],
11640 }
11641 `
11642
11643 testCases := []struct {
11644 desc string
11645 selectedApexContributions string
11646 expectedVisibleModuleNames []string
11647 expectedHiddenModuleNames []string
11648 }{
11649 {
11650 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11651 selectedApexContributions: "",
11652 expectedVisibleModuleNames: []string{"com.android.adservices"},
11653 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11654 },
11655 {
11656 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11657 selectedApexContributions: "adservices.prebuilt.contributions",
11658 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11659 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11660 },
11661 {
11662 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11663 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11664 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11665 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11666 },
11667 }
11668
11669 for _, tc := range testCases {
11670 preparer := android.GroupFixturePreparers(
11671 android.FixtureMergeMockFs(map[string][]byte{
11672 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11673 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011674 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011675 )
11676 ctx := testApex(t, bp, preparer)
11677
11678 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11679 }
11680}
11681
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011682func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011683 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011684 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11685 for _, moduleName := range moduleNames {
11686 ret += fmt.Sprintf(`
11687 aconfig_declarations {
11688 name: "%[1]s",
11689 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011690 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011691 srcs: [
11692 "%[1]s.aconfig",
11693 ],
11694 }
11695 java_aconfig_library {
11696 name: "%[1]s-lib",
11697 aconfig_declarations: "%[1]s",
11698 }
11699 `, moduleName)
11700 }
11701 return ret
11702 }
11703
11704 result := android.GroupFixturePreparers(
11705 prepareForApexTest,
11706 java.PrepareForTestWithJavaSdkLibraryFiles,
11707 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011708 ).RunTestWithBp(t, `
11709 java_library {
11710 name: "baz-java-lib",
11711 static_libs: [
11712 "baz-lib",
11713 ],
11714 }
11715 filegroup {
11716 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011717 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011718 ":qux-lib{.generated_srcjars}",
11719 ],
11720 }
11721 filegroup {
11722 name: "qux-another-filegroup",
11723 srcs: [
11724 ":qux-filegroup",
11725 ],
11726 }
11727 java_library {
11728 name: "quux-java-lib",
11729 srcs: [
11730 "a.java",
11731 ],
11732 libs: [
11733 "quux-lib",
11734 ],
11735 }
11736 java_sdk_library {
11737 name: "foo",
11738 srcs: [
11739 ":qux-another-filegroup",
11740 ],
11741 api_packages: ["foo"],
11742 system: {
11743 enabled: true,
11744 },
11745 module_lib: {
11746 enabled: true,
11747 },
11748 test: {
11749 enabled: true,
11750 },
11751 static_libs: [
11752 "bar-lib",
11753 ],
11754 libs: [
11755 "baz-java-lib",
11756 "quux-java-lib",
11757 ],
11758 aconfig_declarations: [
11759 "bar",
11760 ],
11761 }
11762 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11763
11764 m := result.ModuleForTests("foo.stubs.source", "android_common")
11765 outDir := "out/soong/.intermediates"
11766
11767 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11768 // textproto files
11769 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11770
11771 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11772 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11773 // to aconfig.
11774 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11775 "passed as an input",
11776 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11777
11778 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11779 // to metalava as classpath. Thus the cache file provided by the associated
11780 // aconfig_declarations module "baz" should be passed to aconfig.
11781 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11782 "java_aconfig_library passed as an input",
11783 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11784
11785 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11786 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11787 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11788 "input",
11789 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11790
11791 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11792 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11793 // aconfig_declarations module "quux" should not be passed to aconfig.
11794 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11795 "depend on java_aconfig_library not passed as an input",
11796 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11797}
Cole Faust7c991b42024-05-15 11:17:55 -070011798
11799func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011800 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011801 ctx := testApex(t, `
11802 apex {
11803 name: "myapex",
11804 key: "myapex.key",
11805 prebuilts: ["myetc", "myetc2"],
11806 min_sdk_version: "29",
11807 }
11808 apex_key {
11809 name: "myapex.key",
11810 public_key: "testkey.avbpubkey",
11811 private_key: "testkey.pem",
11812 }
11813
11814 prebuilt_etc {
11815 name: "myetc",
11816 src: "myprebuilt",
11817 filename: "myfilename",
11818 }
11819 prebuilt_etc {
11820 name: "myetc2",
11821 sub_dir: "mysubdir",
11822 src: "myprebuilt",
11823 filename: "myfilename",
11824 }
11825 `, withFiles(android.MockFS{
11826 "packages/modules/common/build/allowed_deps.txt": nil,
11827 }))
11828
11829 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11830 data := android.AndroidMkDataForTest(t, ctx, ab)
11831 var builder strings.Builder
11832 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11833 androidMk := builder.String()
11834
11835 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11836 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11837}
Spandan Das50801e22024-05-13 18:29:45 +000011838
11839func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011840 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011841 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11842 args := module.Rule("apexRule").Args
11843 optFlags := args["opt_flags"]
11844 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11845 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11846 }
11847 }
11848
11849 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11850 t.Helper()
11851 found := false
11852 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11853 if dep == wantDep {
11854 found = true
11855 }
11856 })
11857 if !found {
11858 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11859 }
11860 }
11861
11862 ctx := testApex(t, `
11863 apex {
11864 name: "com.android.apex30",
11865 min_sdk_version: "30",
11866 key: "apex30.key",
11867 java_libs: ["javalib"],
11868 }
11869
11870 java_library {
11871 name: "javalib",
11872 srcs: ["A.java"],
11873 apex_available: ["com.android.apex30"],
11874 min_sdk_version: "30",
11875 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011876 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011877 }
11878
11879 override_apex {
11880 name: "com.mycompany.android.apex30",
11881 base: "com.android.apex30",
11882 }
11883
11884 override_apex {
11885 name: "com.mycompany.android.apex31",
11886 base: "com.android.apex30",
11887 min_sdk_version: "31",
11888 }
11889
11890 apex_key {
11891 name: "apex30.key",
11892 public_key: "testkey.avbpubkey",
11893 private_key: "testkey.pem",
11894 }
11895
11896 `, android.FixtureMergeMockFs(android.MockFS{
11897 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11898 }),
11899 )
11900
11901 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11902 checkMinSdkVersion(t, baseModule, "30")
11903
11904 // Override module, but uses same min_sdk_version
11905 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11906 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11907 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11908 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11909
11910 // Override module, uses different min_sdk_version
11911 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11912 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11913 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11914 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11915}
Spandan Das0b28fa02024-05-28 23:40:17 +000011916
11917func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011918 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011919 context := android.GroupFixturePreparers(
11920 android.PrepareForIntegrationTestWithAndroid,
11921 PrepareForTestWithApexBuildComponents,
11922 android.FixtureMergeMockFs(android.MockFS{
11923 "system/sepolicy/apex/foo-file_contexts": nil,
11924 }),
11925 )
11926 res := context.RunTestWithBp(t, `
11927 apex {
11928 name: "foo",
11929 key: "myapex.key",
11930 apex_available_name: "com.android.foo",
11931 variant_version: "0",
11932 updatable: false,
11933 }
11934 apex_key {
11935 name: "myapex.key",
11936 public_key: "testkey.avbpubkey",
11937 private_key: "testkey.pem",
11938 }
11939 prebuilt_apex {
11940 name: "foo",
11941 src: "foo.apex",
11942 prefer: true,
11943 }
11944 override_apex {
11945 name: "myoverrideapex",
11946 base: "foo",
11947 }
11948 `)
11949
11950 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11951}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011952
11953func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011954 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011955 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`, `
11956 apex {
11957 name: "myapex",
11958 key: "myapex.key",
11959 updatable: true,
11960 min_sdk_version: "current",
11961 }
11962
11963 apex_key {
11964 name: "myapex.key",
11965 public_key: "testkey.avbpubkey",
11966 private_key: "testkey.pem",
11967 }
11968 `)
11969}
Spandan Das2f68f192024-07-22 19:25:50 +000011970
11971func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011972 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011973 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11974 result := android.GroupFixturePreparers(
11975 prepareForApexTest,
11976 android.PrepareForTestWithAndroidMk,
11977 android.PrepareForTestWithMakevars,
11978 android.FixtureMergeMockFs(fs),
11979 ).RunTest(t)
11980
11981 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011982 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011983
11984 installRules := result.InstallMakeRulesForTesting(t)
11985
11986 var installedlibRule *android.InstallMakeRule
11987 for i, rule := range installRules {
11988 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11989 if installedlibRule != nil {
11990 t.Errorf("Duplicate install rules for %s", rule.Target)
11991 }
11992 installedlibRule = &installRules[i]
11993 }
11994 }
11995 if installedlibRule == nil {
11996 t.Errorf("No install rule found for installedlib")
11997 return
11998 }
11999
12000 if expectLibfooOnSystemLib {
12001 android.AssertStringListContains(t,
12002 "installedlib doesn't have install dependency on libfoo impl",
12003 installedlibRule.OrderOnlyDeps,
12004 "out/target/product/test_device/system/lib/libfoo.so")
12005 } else {
12006 android.AssertStringListDoesNotContain(t,
12007 "installedlib has install dependency on libfoo stub",
12008 installedlibRule.Deps,
12009 "out/target/product/test_device/system/lib/libfoo.so")
12010 android.AssertStringListDoesNotContain(t,
12011 "installedlib has order-only install dependency on libfoo stub",
12012 installedlibRule.OrderOnlyDeps,
12013 "out/target/product/test_device/system/lib/libfoo.so")
12014 }
12015 }
12016
12017 prebuiltLibfooBp := []byte(`
12018 cc_prebuilt_library {
12019 name: "libfoo",
12020 prefer: true,
12021 srcs: ["libfoo.so"],
12022 stubs: {
12023 versions: ["1"],
12024 },
12025 apex_available: ["apexfoo"],
12026 }
12027 `)
12028
12029 apexfooBp := []byte(`
12030 apex {
12031 name: "apexfoo",
12032 key: "apexfoo.key",
12033 native_shared_libs: ["libfoo"],
12034 updatable: false,
12035 compile_multilib: "both",
12036 }
12037 apex_key {
12038 name: "apexfoo.key",
12039 public_key: "testkey.avbpubkey",
12040 private_key: "testkey.pem",
12041 }
12042 `)
12043
12044 installedlibBp := []byte(`
12045 cc_library {
12046 name: "installedlib",
12047 shared_libs: ["libfoo"],
12048 }
12049 `)
12050
12051 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012052 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000012053 testFunc(
12054 t,
12055 /*expectLibfooOnSystemLib=*/ false,
12056 android.MockFS{
12057 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12058 "apexfoo/Android.bp": apexfooBp,
12059 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12060 "Android.bp": installedlibBp,
12061 },
12062 )
12063 })
12064
12065 disabledSourceLibfooBp := []byte(`
12066 cc_library {
12067 name: "libfoo",
12068 enabled: false,
12069 stubs: {
12070 versions: ["1"],
12071 },
12072 apex_available: ["apexfoo"],
12073 }
12074 `)
12075
12076 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012077 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000012078 testFunc(
12079 t,
12080 /*expectLibfooOnSystemLib=*/ false,
12081 android.MockFS{
12082 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12083 "impl/Android.bp": disabledSourceLibfooBp,
12084 "apexfoo/Android.bp": apexfooBp,
12085 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12086 "Android.bp": installedlibBp,
12087 },
12088 )
12089 })
12090}
Jihoon Kange246bb72024-09-18 22:26:22 +000012091
12092func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012093 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000012094 // This test case tests that listing the impl lib instead of the top level java_sdk_library
12095 // in libs of android_app and java_library does not lead to class loader context device/host
12096 // path mismatch errors.
12097 android.GroupFixturePreparers(
12098 prepareForApexTest,
12099 android.PrepareForIntegrationTestWithAndroid,
12100 PrepareForTestWithApexBuildComponents,
12101 android.FixtureModifyEnv(func(env map[string]string) {
12102 env["DISABLE_CONTAINER_CHECK"] = "true"
12103 }),
12104 withFiles(filesForSdkLibrary),
12105 android.FixtureMergeMockFs(android.MockFS{
12106 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
12107 }),
12108 ).RunTestWithBp(t, `
12109 apex {
12110 name: "com.android.foo30",
12111 key: "myapex.key",
12112 updatable: true,
12113 bootclasspath_fragments: [
12114 "foo-bootclasspath-fragment",
12115 ],
12116 java_libs: [
12117 "bar",
12118 ],
12119 apps: [
12120 "bar-app",
12121 ],
12122 min_sdk_version: "30",
12123 }
12124 apex_key {
12125 name: "myapex.key",
12126 public_key: "testkey.avbpubkey",
12127 private_key: "testkey.pem",
12128 }
12129 bootclasspath_fragment {
12130 name: "foo-bootclasspath-fragment",
12131 contents: [
12132 "framework-foo",
12133 ],
12134 apex_available: [
12135 "com.android.foo30",
12136 ],
12137 hidden_api: {
12138 split_packages: ["*"]
12139 },
12140 }
12141
12142 java_sdk_library {
12143 name: "framework-foo",
12144 srcs: [
12145 "A.java"
12146 ],
12147 unsafe_ignore_missing_latest_api: true,
12148 apex_available: [
12149 "com.android.foo30",
12150 ],
12151 compile_dex: true,
12152 sdk_version: "core_current",
12153 shared_library: false,
12154 }
12155
12156 java_library {
12157 name: "bar",
12158 srcs: [
12159 "A.java"
12160 ],
12161 libs: [
12162 "framework-foo.impl",
12163 ],
12164 apex_available: [
12165 "com.android.foo30",
12166 ],
12167 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012168 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012169 }
12170
12171 java_library {
12172 name: "baz",
12173 srcs: [
12174 "A.java"
12175 ],
12176 libs: [
12177 "bar",
12178 ],
12179 sdk_version: "core_current",
12180 }
12181
12182 android_app {
12183 name: "bar-app",
12184 srcs: [
12185 "A.java"
12186 ],
12187 libs: [
12188 "baz",
12189 "framework-foo.impl",
12190 ],
12191 apex_available: [
12192 "com.android.foo30",
12193 ],
12194 sdk_version: "core_current",
12195 min_sdk_version: "30",
12196 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012197 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012198 }
12199 `)
12200}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012201
12202// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12203func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012204 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012205 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12206 apex {
12207 name: "myapex",
12208 key: "myapex.key",
12209 systemserverclasspath_fragments: [
12210 "mysystemserverclasspathfragment",
12211 ],
12212 min_sdk_version: "29",
12213 updatable: true,
12214 system_ext_specific: true,
12215 }
12216
12217 apex_key {
12218 name: "myapex.key",
12219 public_key: "testkey.avbpubkey",
12220 private_key: "testkey.pem",
12221 }
12222
12223 java_library {
12224 name: "foo",
12225 srcs: ["b.java"],
12226 min_sdk_version: "29",
12227 installable: true,
12228 apex_available: [
12229 "myapex",
12230 ],
12231 sdk_version: "current",
12232 }
12233
12234 systemserverclasspath_fragment {
12235 name: "mysystemserverclasspathfragment",
12236 contents: [
12237 "foo",
12238 ],
12239 apex_available: [
12240 "myapex",
12241 ],
12242 }
12243 `,
12244 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12245 )
12246}
Spandan Das72d86c62024-10-15 19:27:41 +000012247
12248// partitions should not package the artifacts that are included inside the apex.
12249func TestFilesystemWithApexDeps(t *testing.T) {
12250 t.Parallel()
12251 result := testApex(t, `
12252 android_filesystem {
12253 name: "myfilesystem",
12254 deps: ["myapex"],
12255 }
12256 apex {
12257 name: "myapex",
12258 key: "myapex.key",
12259 binaries: ["binfoo"],
12260 native_shared_libs: ["libfoo"],
12261 apps: ["appfoo"],
12262 updatable: false,
12263 }
12264 apex_key {
12265 name: "myapex.key",
12266 }
12267 cc_binary {
12268 name: "binfoo",
12269 apex_available: ["myapex"],
12270 }
12271 cc_library {
12272 name: "libfoo",
12273 apex_available: ["myapex"],
12274 }
12275 android_app {
12276 name: "appfoo",
12277 sdk_version: "current",
12278 apex_available: ["myapex"],
12279 }
12280 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12281
12282 partition := result.ModuleForTests("myfilesystem", "android_common")
12283 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12284 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12285}
Colin Crossb614cd42024-10-11 12:52:21 -070012286
12287func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12288 t.Parallel()
12289
12290 extractDepenencyPathFromErrors := func(errs []error) []string {
12291 i := slices.IndexFunc(errs, func(err error) bool {
12292 return strings.Contains(err.Error(), "dependency path:")
12293 })
12294 if i < 0 {
12295 return nil
12296 }
12297 var dependencyPath []string
12298 for _, err := range errs[i+1:] {
12299 s := err.Error()
12300 lastSpace := strings.LastIndexByte(s, ' ')
12301 if lastSpace >= 0 {
12302 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12303 }
12304 }
12305 return dependencyPath
12306 }
12307
12308 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12309 return func(t *testing.T, result *android.TestResult) {
12310 t.Helper()
12311 if len(result.Errs) == 0 {
12312 t.Fatalf("expected errors")
12313 }
12314 t.Log("found errors:")
12315 for _, err := range result.Errs {
12316 t.Log(err)
12317 }
12318 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12319 t.Fatalf("expected error %q, got %q", w, g)
12320 }
12321 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12322 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12323 t.Errorf("expected dependency path %q, got %q", w, g)
12324 }
12325 }
12326 }
12327
12328 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12329 return func(bp *bpmodify.Blueprint) {
12330 m := bp.ModulesByName(module)
12331 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12332 if err != nil {
12333 panic(err)
12334 }
12335 props.AddStringToList(lib)
12336 }
12337 }
12338
12339 bpTemplate := `
12340 apex {
12341 name: "myapex",
12342 key: "myapex.key",
12343 native_shared_libs: ["mylib"],
12344 rust_dyn_libs: ["libmyrust"],
12345 binaries: ["mybin", "myrustbin"],
12346 jni_libs: ["libjni"],
12347 apps: ["myapp"],
12348 updatable: false,
12349 }
12350
12351 apex {
12352 name: "otherapex",
12353 key: "myapex.key",
12354 native_shared_libs: ["libotherapex"],
12355 updatable: false,
12356 }
12357
12358 apex_key {
12359 name: "myapex.key",
12360 public_key: "testkey.avbpubkey",
12361 private_key: "testkey.pem",
12362 }
12363
12364 cc_library {
12365 name: "mylib",
12366 srcs: ["foo.cpp"],
12367 apex_available: ["myapex"],
12368 }
12369
12370 cc_binary {
12371 name: "mybin",
12372 srcs: ["foo.cpp"],
12373 apex_available: ["myapex"],
12374 }
12375
12376 rust_library {
12377 name: "libmyrust",
12378 crate_name: "myrust",
12379 srcs: ["src/lib.rs"],
12380 rustlibs: ["libmyrust_transitive_dylib"],
12381 rlibs: ["libmyrust_transitive_rlib"],
12382 apex_available: ["myapex"],
12383 }
12384
12385 rust_library{
12386 name: "libmyrust_transitive_dylib",
12387 crate_name: "myrust_transitive_dylib",
12388 srcs: ["src/lib.rs"],
12389 apex_available: ["myapex"],
12390 }
12391
12392 rust_library {
12393 name: "libmyrust_transitive_rlib",
12394 crate_name: "myrust_transitive_rlib",
12395 srcs: ["src/lib.rs"],
12396 apex_available: ["myapex"],
12397 }
12398
12399 rust_binary {
12400 name: "myrustbin",
12401 srcs: ["src/main.rs"],
12402 apex_available: ["myapex"],
12403 }
12404
12405 cc_library {
12406 name: "libbar",
12407 sdk_version: "current",
12408 srcs: ["bar.cpp"],
12409 apex_available: ["myapex"],
12410 stl: "none",
12411 }
12412
12413 android_app {
12414 name: "myapp",
12415 jni_libs: ["libembeddedjni"],
12416 use_embedded_native_libs: true,
12417 sdk_version: "current",
12418 apex_available: ["myapex"],
12419 }
12420
12421 cc_library {
12422 name: "libembeddedjni",
12423 sdk_version: "current",
12424 srcs: ["bar.cpp"],
12425 apex_available: ["myapex"],
12426 stl: "none",
12427 }
12428
12429 cc_library {
12430 name: "libjni",
12431 sdk_version: "current",
12432 srcs: ["bar.cpp"],
12433 apex_available: ["myapex"],
12434 stl: "none",
12435 }
12436
12437 cc_library {
12438 name: "libotherapex",
12439 sdk_version: "current",
12440 srcs: ["otherapex.cpp"],
12441 apex_available: ["otherapex"],
12442 stubs: {
12443 symbol_file: "libotherapex.map.txt",
12444 versions: ["1", "2", "3"],
12445 },
12446 stl: "none",
12447 }
12448
12449 cc_library {
12450 name: "libplatform",
12451 sdk_version: "current",
12452 srcs: ["libplatform.cpp"],
12453 stubs: {
12454 symbol_file: "libplatform.map.txt",
12455 versions: ["1", "2", "3"],
12456 },
12457 stl: "none",
12458 system_shared_libs: [],
12459 }
12460 `
12461
12462 testCases := []struct {
12463 name string
12464 bpModifier func(bp *bpmodify.Blueprint)
12465 dependencyPath []string
12466 }{
12467 {
12468 name: "library dependency in other apex",
12469 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12470 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12471 },
12472 {
12473 name: "transitive library dependency in other apex",
12474 bpModifier: func(bp *bpmodify.Blueprint) {
12475 addToSharedLibs("mylib", "libbar")(bp)
12476 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12477 },
12478 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12479 },
12480 {
12481 name: "library dependency in platform",
12482 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12483 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12484 },
12485 {
12486 name: "jni library dependency in other apex",
12487 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12488 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12489 },
12490 {
12491 name: "transitive jni library dependency in other apex",
12492 bpModifier: func(bp *bpmodify.Blueprint) {
12493 addToSharedLibs("libjni", "libbar")(bp)
12494 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12495 },
12496 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12497 },
12498 {
12499 name: "jni library dependency in platform",
12500 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12501 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12502 },
12503 {
12504 name: "transitive jni library dependency in platform",
12505 bpModifier: func(bp *bpmodify.Blueprint) {
12506 addToSharedLibs("libjni", "libbar")(bp)
12507 addToSharedLibs("libbar", "libplatform#impl")(bp)
12508 },
12509 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12510 },
Spandan Das10c41362024-12-03 01:33:09 +000012511 {
12512 name: "app jni library dependency in other apex",
12513 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12514 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12515 },
12516 {
12517 name: "transitive app jni library dependency in other apex",
12518 bpModifier: func(bp *bpmodify.Blueprint) {
12519 addToSharedLibs("libembeddedjni", "libbar")(bp)
12520 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12521 },
12522 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12523 },
12524 {
12525 name: "app jni library dependency in platform",
12526 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12527 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12528 },
12529 {
12530 name: "transitive app jni library dependency in platform",
12531 bpModifier: func(bp *bpmodify.Blueprint) {
12532 addToSharedLibs("libembeddedjni", "libbar")(bp)
12533 addToSharedLibs("libbar", "libplatform#impl")(bp)
12534 },
12535 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12536 },
Colin Crossb614cd42024-10-11 12:52:21 -070012537 {
12538 name: "binary dependency in other apex",
12539 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12540 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12541 },
12542 {
12543 name: "transitive binary dependency in other apex",
12544 bpModifier: func(bp *bpmodify.Blueprint) {
12545 addToSharedLibs("mybin", "libbar")(bp)
12546 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12547 },
12548 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12549 },
12550 {
12551 name: "binary dependency in platform",
12552 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12553 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12554 },
12555 {
12556 name: "transitive binary dependency in platform",
12557 bpModifier: func(bp *bpmodify.Blueprint) {
12558 addToSharedLibs("mybin", "libbar")(bp)
12559 addToSharedLibs("libbar", "libplatform#impl")(bp)
12560 },
12561 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12562 },
12563
12564 {
12565 name: "rust library dependency in other apex",
12566 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12567 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12568 },
12569 {
12570 name: "transitive rust library dependency in other apex",
12571 bpModifier: func(bp *bpmodify.Blueprint) {
12572 addToSharedLibs("libmyrust", "libbar")(bp)
12573 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12574 },
12575 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12576 },
12577 {
12578 name: "rust library dependency in platform",
12579 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12580 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12581 },
12582 {
12583 name: "transitive rust library dependency in platform",
12584 bpModifier: func(bp *bpmodify.Blueprint) {
12585 addToSharedLibs("libmyrust", "libbar")(bp)
12586 addToSharedLibs("libbar", "libplatform#impl")(bp)
12587 },
12588 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12589 },
12590 {
12591 name: "transitive rust library dylib dependency in other apex",
12592 bpModifier: func(bp *bpmodify.Blueprint) {
12593 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12594 },
12595 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12596 },
12597 {
12598 name: "transitive rust library dylib dependency in platform",
12599 bpModifier: func(bp *bpmodify.Blueprint) {
12600 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12601 },
12602 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12603 },
12604 {
12605 name: "transitive rust library rlib dependency in other apex",
12606 bpModifier: func(bp *bpmodify.Blueprint) {
12607 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12608 },
12609 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12610 },
12611 {
12612 name: "transitive rust library rlib dependency in platform",
12613 bpModifier: func(bp *bpmodify.Blueprint) {
12614 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12615 },
12616 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12617 },
12618 {
12619 name: "rust binary dependency in other apex",
12620 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12621 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12622 },
12623 {
12624 name: "transitive rust binary dependency in other apex",
12625 bpModifier: func(bp *bpmodify.Blueprint) {
12626 addToSharedLibs("myrustbin", "libbar")(bp)
12627 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12628 },
12629 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12630 },
12631 {
12632 name: "rust binary dependency in platform",
12633 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12634 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12635 },
12636 {
12637 name: "transitive rust binary dependency in platform",
12638 bpModifier: func(bp *bpmodify.Blueprint) {
12639 addToSharedLibs("myrustbin", "libbar")(bp)
12640 addToSharedLibs("libbar", "libplatform#impl")(bp)
12641 },
12642 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12643 },
12644 }
12645
12646 for _, testCase := range testCases {
12647 t.Run(testCase.name, func(t *testing.T) {
12648 t.Parallel()
12649 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12650 if err != nil {
12651 t.Fatal(err)
12652 }
12653 if testCase.bpModifier != nil {
12654 func() {
12655 defer func() {
12656 if r := recover(); r != nil {
12657 t.Fatalf("panic in bpModifier: %v", r)
12658 }
12659 }()
12660 testCase.bpModifier(bp)
12661 }()
12662 }
12663 android.GroupFixturePreparers(
12664 android.PrepareForTestWithAndroidBuildComponents,
12665 cc.PrepareForTestWithCcBuildComponents,
12666 java.PrepareForTestWithDexpreopt,
12667 rust.PrepareForTestWithRustDefaultModules,
12668 PrepareForTestWithApexBuildComponents,
12669 prepareForTestWithMyapex,
12670 prepareForTestWithOtherapex,
12671 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12672 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12673 }),
12674 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12675 RunTestWithBp(t, bp.String())
12676 })
12677 }
12678}