blob: 282cd1dd3b780c47529010a2b1928814ed9a0f32 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
900 native_shared_libs: ["mylib", "mylib3"],
Jiyong Park105dc322021-06-11 17:22:09 +0900901 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000902 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900903 }
904
905 apex_key {
906 name: "myapex.key",
907 public_key: "testkey.avbpubkey",
908 private_key: "testkey.pem",
909 }
910
911 cc_library {
912 name: "mylib",
913 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -0800914 shared_libs: ["mylib2", "mylib3#impl", "my_prebuilt_platform_lib", "my_prebuilt_platform_stub_only_lib"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900915 system_shared_libs: [],
916 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000917 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900918 }
919
920 cc_library {
921 name: "mylib2",
922 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900923 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900924 system_shared_libs: [],
925 stl: "none",
926 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000927 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900928 versions: ["1", "2", "3"],
929 },
930 }
931
932 cc_library {
933 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900934 srcs: ["mylib.cpp"],
935 shared_libs: ["mylib4"],
936 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900937 stl: "none",
938 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000939 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900940 versions: ["10", "11", "12"],
941 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000942 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900943 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900944
945 cc_library {
946 name: "mylib4",
947 srcs: ["mylib.cpp"],
948 system_shared_libs: [],
949 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000950 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900951 }
Jiyong Park105dc322021-06-11 17:22:09 +0900952
Spandan Das357ffcc2024-07-24 18:07:48 +0000953 cc_prebuilt_library_shared {
954 name: "my_prebuilt_platform_lib",
955 stubs: {
956 symbol_file: "my_prebuilt_platform_lib.map.txt",
957 versions: ["1", "2", "3"],
958 },
959 srcs: ["foo.so"],
960 }
961
962 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
963 cc_prebuilt_library_shared {
964 name: "my_prebuilt_platform_stub_only_lib",
965 stubs: {
966 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
967 versions: ["1", "2", "3"],
968 }
969 }
970
Jiyong Park105dc322021-06-11 17:22:09 +0900971 rust_binary {
972 name: "foo.rust",
973 srcs: ["foo.rs"],
974 shared_libs: ["libfoo.shared_from_rust"],
975 prefer_rlib: true,
976 apex_available: ["myapex"],
977 }
978
979 cc_library_shared {
980 name: "libfoo.shared_from_rust",
981 srcs: ["mylib.cpp"],
982 system_shared_libs: [],
983 stl: "none",
984 stubs: {
985 versions: ["10", "11", "12"],
986 },
987 }
988
Jiyong Park25fc6a92018-11-18 18:02:45 +0900989 `)
990
Jooyung Hana0503a52023-08-23 13:12:50 +0900991 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900992 copyCmds := apexRule.Args["copy_commands"]
993
994 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -0800995 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900996
997 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -0800998 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900999
1000 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001001 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001002
Colin Crossaede88c2020-08-11 12:17:01 -07001003 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001004
1005 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001006 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001007 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001008 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001009
Colin Crossea91a172024-11-05 16:14:05 -08001010 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001011 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001012 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001013 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001014
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001015 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1016 // is replaced by sharing of "cFlags" in cc/builder.go.
1017 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1018 // module variable representing "cflags". So it was not detected by ensureNotContains.
1019 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1020 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1021 // including the original cflags's "-include mylib.h".
1022 //
Jiyong Park64379952018-12-13 18:37:29 +09001023 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001024 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1025 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001026
Jiyong Park85cc35a2022-07-17 11:30:47 +09001027 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1028 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1029 // Ensure that genstub for apex-provided lib is invoked with --apex
1030 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001031
Jooyung Hana0503a52023-08-23 13:12:50 +09001032 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001033 "lib64/mylib.so",
1034 "lib64/mylib3.so",
1035 "lib64/mylib4.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001036 "bin/foo.rust",
1037 "lib64/libc++.so", // by the implicit dependency from foo.rust
1038 "lib64/liblog.so", // by the implicit dependency from foo.rust
Jooyung Han671f1ce2019-12-17 12:47:13 +09001039 })
Jiyong Park105dc322021-06-11 17:22:09 +09001040
1041 // Ensure that stub dependency from a rust module is not included
1042 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1043 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001044 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001045 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1046 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001047
Jooyung Hana0503a52023-08-23 13:12:50 +09001048 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001049 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001050
1051 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1052 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1053 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1054 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1055 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1056 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1057
1058 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1059 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1060 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1061 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1062 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1063 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001064}
1065
Jooyung Han20348752023-12-05 15:23:56 +09001066func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001067 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001068 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1069 apex {
1070 name: "myapex",
1071 key: "myapex.key",
1072 vendor: true,
1073 updatable: false,
1074 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1075 }
1076
1077 apex_key {
1078 name: "myapex.key",
1079 public_key: "testkey.avbpubkey",
1080 private_key: "testkey.pem",
1081 }
1082
1083 cc_library {
1084 name: "libbar",
1085 srcs: ["mylib.cpp"],
1086 llndk: {
1087 symbol_file: "libbar.map.txt",
1088 }
1089 }
1090 `)
1091}
1092
Jiyong Park1bc84122021-06-22 20:23:05 +09001093func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001094 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001095 ctx := testApex(t, `
1096 apex {
1097 name: "myapex",
1098 key: "myapex.key",
1099 native_shared_libs: ["mylib"],
1100 binaries: ["foo.rust"],
1101 updatable: false,
1102 platform_apis: true,
1103 }
1104
1105 apex_key {
1106 name: "myapex.key",
1107 public_key: "testkey.avbpubkey",
1108 private_key: "testkey.pem",
1109 }
1110
1111 cc_library {
1112 name: "mylib",
1113 srcs: ["mylib.cpp"],
1114 shared_libs: ["mylib2"],
1115 system_shared_libs: [],
1116 stl: "none",
1117 apex_available: [ "myapex" ],
1118 }
1119
1120 cc_library {
1121 name: "mylib2",
1122 srcs: ["mylib.cpp"],
1123 cflags: ["-include mylib.h"],
1124 system_shared_libs: [],
1125 stl: "none",
1126 stubs: {
1127 versions: ["1", "2", "3"],
1128 },
1129 }
1130
1131 rust_binary {
1132 name: "foo.rust",
1133 srcs: ["foo.rs"],
1134 shared_libs: ["libfoo.shared_from_rust"],
1135 prefer_rlib: true,
1136 apex_available: ["myapex"],
1137 }
1138
1139 cc_library_shared {
1140 name: "libfoo.shared_from_rust",
1141 srcs: ["mylib.cpp"],
1142 system_shared_libs: [],
1143 stl: "none",
1144 stubs: {
1145 versions: ["10", "11", "12"],
1146 },
1147 }
1148 `)
1149
Jooyung Hana0503a52023-08-23 13:12:50 +09001150 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001151 copyCmds := apexRule.Args["copy_commands"]
1152
1153 // Ensure that indirect stubs dep is not included
1154 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1155 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1156
1157 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1158 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001159 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001160 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1161 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001162 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001163 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1164 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
1165}
1166
Colin Cross7812fd32020-09-25 12:35:10 -07001167func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1168 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001169 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001170 apex {
1171 name: "myapex",
1172 key: "myapex.key",
1173 native_shared_libs: ["mylib", "mylib3"],
1174 min_sdk_version: "29",
1175 }
1176
1177 apex_key {
1178 name: "myapex.key",
1179 public_key: "testkey.avbpubkey",
1180 private_key: "testkey.pem",
1181 }
1182
1183 cc_library {
1184 name: "mylib",
1185 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001186 shared_libs: ["mylib2", "mylib3#impl"],
Colin Cross7812fd32020-09-25 12:35:10 -07001187 system_shared_libs: [],
1188 stl: "none",
1189 apex_available: [ "myapex" ],
1190 min_sdk_version: "28",
1191 }
1192
1193 cc_library {
1194 name: "mylib2",
1195 srcs: ["mylib.cpp"],
1196 cflags: ["-include mylib.h"],
1197 system_shared_libs: [],
1198 stl: "none",
1199 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001200 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001201 versions: ["28", "29", "30", "current"],
1202 },
1203 min_sdk_version: "28",
1204 }
1205
1206 cc_library {
1207 name: "mylib3",
1208 srcs: ["mylib.cpp"],
1209 shared_libs: ["mylib4"],
1210 system_shared_libs: [],
1211 stl: "none",
1212 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001213 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001214 versions: ["28", "29", "30", "current"],
1215 },
1216 apex_available: [ "myapex" ],
1217 min_sdk_version: "28",
1218 }
1219
1220 cc_library {
1221 name: "mylib4",
1222 srcs: ["mylib.cpp"],
1223 system_shared_libs: [],
1224 stl: "none",
1225 apex_available: [ "myapex" ],
1226 min_sdk_version: "28",
1227 }
1228 `)
1229
Jooyung Hana0503a52023-08-23 13:12:50 +09001230 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001231 copyCmds := apexRule.Args["copy_commands"]
1232
1233 // Ensure that direct non-stubs dep is always included
1234 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1235
1236 // Ensure that indirect stubs dep is not included
1237 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
1238
1239 // Ensure that direct stubs dep is included
1240 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1241
1242 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1243
Jiyong Park55549df2021-02-26 23:57:23 +09001244 // Ensure that mylib is linking with the latest version of stub for mylib2
1245 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001246 // ... and not linking to the non-stub (impl) variant of mylib2
1247 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
1248
Colin Crossea91a172024-11-05 16:14:05 -08001249 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001250 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
1251 // .. and not linking to the stubs variant of mylib3
1252 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
1253
1254 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001255 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001256 ensureNotContains(t, mylib2Cflags, "-include ")
1257
Jiyong Park85cc35a2022-07-17 11:30:47 +09001258 // Ensure that genstub is invoked with --systemapi
1259 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001260
Jooyung Hana0503a52023-08-23 13:12:50 +09001261 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001262 "lib64/mylib.so",
1263 "lib64/mylib3.so",
1264 "lib64/mylib4.so",
1265 })
1266}
1267
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001268func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1269 t.Parallel()
1270 // myapex (Z)
1271 // mylib -----------------.
1272 // |
1273 // otherapex (29) |
1274 // libstub's versions: 29 Z current
1275 // |
1276 // <platform> |
1277 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001278 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001279 apex {
1280 name: "myapex",
1281 key: "myapex.key",
1282 native_shared_libs: ["mylib"],
1283 min_sdk_version: "Z", // non-final
1284 }
1285
1286 cc_library {
1287 name: "mylib",
1288 srcs: ["mylib.cpp"],
1289 shared_libs: ["libstub"],
1290 apex_available: ["myapex"],
1291 min_sdk_version: "Z",
1292 }
1293
1294 apex_key {
1295 name: "myapex.key",
1296 public_key: "testkey.avbpubkey",
1297 private_key: "testkey.pem",
1298 }
1299
1300 apex {
1301 name: "otherapex",
1302 key: "myapex.key",
1303 native_shared_libs: ["libstub"],
1304 min_sdk_version: "29",
1305 }
1306
1307 cc_library {
1308 name: "libstub",
1309 srcs: ["mylib.cpp"],
1310 stubs: {
1311 versions: ["29", "Z", "current"],
1312 },
1313 apex_available: ["otherapex"],
1314 min_sdk_version: "29",
1315 }
1316
1317 // platform module depending on libstub from otherapex should use the latest stub("current")
1318 cc_library {
1319 name: "libplatform",
1320 srcs: ["mylib.cpp"],
1321 shared_libs: ["libstub"],
1322 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001323 `,
1324 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1325 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1326 variables.Platform_sdk_final = proptools.BoolPtr(false)
1327 variables.Platform_version_active_codenames = []string{"Z"}
1328 }),
1329 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001330
Jiyong Park55549df2021-02-26 23:57:23 +09001331 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001332 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001333 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001334 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001335 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001336
1337 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1338 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1339 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
1340 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1341 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
1342}
1343
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001344func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001345 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001346 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001347 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001348 name: "myapex2",
1349 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001350 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001351 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001352 }
1353
1354 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001355 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001356 public_key: "testkey.avbpubkey",
1357 private_key: "testkey.pem",
1358 }
1359
1360 cc_library {
1361 name: "mylib",
1362 srcs: ["mylib.cpp"],
1363 shared_libs: ["libfoo#10"],
Jiyong Park678c8812020-02-07 17:25:49 +09001364 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001365 system_shared_libs: [],
1366 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001367 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001368 }
1369
1370 cc_library {
1371 name: "libfoo",
1372 srcs: ["mylib.cpp"],
1373 shared_libs: ["libbar"],
1374 system_shared_libs: [],
1375 stl: "none",
1376 stubs: {
1377 versions: ["10", "20", "30"],
1378 },
1379 }
1380
1381 cc_library {
1382 name: "libbar",
1383 srcs: ["mylib.cpp"],
1384 system_shared_libs: [],
1385 stl: "none",
1386 }
1387
Jiyong Park678c8812020-02-07 17:25:49 +09001388 cc_library_static {
1389 name: "libbaz",
1390 srcs: ["mylib.cpp"],
1391 system_shared_libs: [],
1392 stl: "none",
1393 apex_available: [ "myapex2" ],
1394 }
1395
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001396 `)
1397
Jooyung Hana0503a52023-08-23 13:12:50 +09001398 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001399 copyCmds := apexRule.Args["copy_commands"]
1400
1401 // Ensure that direct non-stubs dep is always included
1402 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1403
1404 // Ensure that indirect stubs dep is not included
1405 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1406
1407 // Ensure that dependency of stubs is not included
1408 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
1409
Colin Crossaede88c2020-08-11 12:17:01 -07001410 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001411
1412 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001413 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001414 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001415 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001416
Jiyong Park3ff16992019-12-27 14:11:47 +09001417 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001418
1419 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1420 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001421
Colin Crossf61d03d2023-11-02 16:56:39 -07001422 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1423 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001424 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001425
Colin Crossf61d03d2023-11-02 16:56:39 -07001426 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1427 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001428 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001429}
1430
Jooyung Hand3639552019-08-09 12:57:43 +09001431func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001432 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001433 /*
1434 myapex
1435 |
1436 v (runtime_libs)
1437 mylib ------+------> libfoo [provides stub]
1438 |
1439 `------> libbar
1440 */
Colin Cross1c460562021-02-16 17:55:47 -08001441 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001442 apex {
1443 name: "myapex",
1444 key: "myapex.key",
1445 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001446 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001447 }
1448
1449 apex_key {
1450 name: "myapex.key",
1451 public_key: "testkey.avbpubkey",
1452 private_key: "testkey.pem",
1453 }
1454
1455 cc_library {
1456 name: "mylib",
1457 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001458 static_libs: ["libstatic"],
1459 shared_libs: ["libshared"],
Jooyung Hand3639552019-08-09 12:57:43 +09001460 runtime_libs: ["libfoo", "libbar"],
1461 system_shared_libs: [],
1462 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001463 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001464 }
1465
1466 cc_library {
1467 name: "libfoo",
1468 srcs: ["mylib.cpp"],
1469 system_shared_libs: [],
1470 stl: "none",
1471 stubs: {
1472 versions: ["10", "20", "30"],
1473 },
1474 }
1475
1476 cc_library {
1477 name: "libbar",
1478 srcs: ["mylib.cpp"],
1479 system_shared_libs: [],
1480 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001481 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001482 }
1483
Liz Kammer5f108fa2023-05-11 14:33:17 -04001484 cc_library {
1485 name: "libstatic",
1486 srcs: ["mylib.cpp"],
1487 system_shared_libs: [],
1488 stl: "none",
1489 apex_available: [ "myapex" ],
1490 runtime_libs: ["libstatic_to_runtime"],
1491 }
1492
1493 cc_library {
1494 name: "libshared",
1495 srcs: ["mylib.cpp"],
1496 system_shared_libs: [],
1497 stl: "none",
1498 apex_available: [ "myapex" ],
1499 runtime_libs: ["libshared_to_runtime"],
1500 }
1501
1502 cc_library {
1503 name: "libstatic_to_runtime",
1504 srcs: ["mylib.cpp"],
1505 system_shared_libs: [],
1506 stl: "none",
1507 apex_available: [ "myapex" ],
1508 }
1509
1510 cc_library {
1511 name: "libshared_to_runtime",
1512 srcs: ["mylib.cpp"],
1513 system_shared_libs: [],
1514 stl: "none",
1515 apex_available: [ "myapex" ],
1516 }
Jooyung Hand3639552019-08-09 12:57:43 +09001517 `)
1518
Jooyung Hana0503a52023-08-23 13:12:50 +09001519 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001520 copyCmds := apexRule.Args["copy_commands"]
1521
1522 // Ensure that direct non-stubs dep is always included
1523 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1524
1525 // Ensure that indirect stubs dep is not included
1526 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
1527
1528 // Ensure that runtime_libs dep in included
1529 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001530 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1531 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1532
1533 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001534
Jooyung Hana0503a52023-08-23 13:12:50 +09001535 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001536 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1537 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001538}
1539
Paul Duffina02cae32021-03-09 01:44:06 +00001540var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1541 cc.PrepareForTestWithCcBuildComponents,
1542 PrepareForTestWithApexBuildComponents,
1543 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001544 apex {
1545 name: "com.android.runtime",
1546 key: "com.android.runtime.key",
1547 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001548 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001549 }
1550
1551 apex_key {
1552 name: "com.android.runtime.key",
1553 public_key: "testkey.avbpubkey",
1554 private_key: "testkey.pem",
1555 }
Paul Duffina02cae32021-03-09 01:44:06 +00001556 `),
1557 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1558)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001559
Paul Duffina02cae32021-03-09 01:44:06 +00001560func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001561 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001562 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001563 cc_library {
1564 name: "libc",
1565 no_libcrt: true,
1566 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001567 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001568 stl: "none",
1569 system_shared_libs: [],
1570 stubs: { versions: ["1"] },
1571 apex_available: ["com.android.runtime"],
1572
1573 sanitize: {
1574 hwaddress: true,
1575 }
1576 }
1577
1578 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001579 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001580 no_libcrt: true,
1581 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001582 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001583 stl: "none",
1584 system_shared_libs: [],
1585 srcs: [""],
1586 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001587 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001588
1589 sanitize: {
1590 never: true,
1591 },
Spandan Das4de7b492023-05-05 21:13:01 +00001592 apex_available: [
1593 "//apex_available:anyapex",
1594 "//apex_available:platform",
1595 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001596 } `)
1597 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001598
Jooyung Hana0503a52023-08-23 13:12:50 +09001599 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001600 "lib64/bionic/libc.so",
1601 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1602 })
1603
Colin Cross4c4c1be2022-02-10 11:41:18 -08001604 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001605
1606 installed := hwasan.Description("install libclang_rt.hwasan")
1607 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1608
1609 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1610 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1611 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1612}
1613
1614func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001615 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001616 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001617 prepareForTestOfRuntimeApexWithHwasan,
1618 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1619 variables.SanitizeDevice = []string{"hwaddress"}
1620 }),
1621 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001622 cc_library {
1623 name: "libc",
1624 no_libcrt: true,
1625 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001626 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001627 stl: "none",
1628 system_shared_libs: [],
1629 stubs: { versions: ["1"] },
1630 apex_available: ["com.android.runtime"],
1631 }
1632
1633 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001634 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001635 no_libcrt: true,
1636 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001637 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001638 stl: "none",
1639 system_shared_libs: [],
1640 srcs: [""],
1641 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001642 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001643
1644 sanitize: {
1645 never: true,
1646 },
Spandan Das4de7b492023-05-05 21:13:01 +00001647 apex_available: [
1648 "//apex_available:anyapex",
1649 "//apex_available:platform",
1650 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001651 }
Paul Duffina02cae32021-03-09 01:44:06 +00001652 `)
1653 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001654
Jooyung Hana0503a52023-08-23 13:12:50 +09001655 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001656 "lib64/bionic/libc.so",
1657 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1658 })
1659
Colin Cross4c4c1be2022-02-10 11:41:18 -08001660 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001661
1662 installed := hwasan.Description("install libclang_rt.hwasan")
1663 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1664
1665 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1666 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1667 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1668}
1669
Jooyung Han61b66e92020-03-21 14:21:46 +00001670func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001671 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001672 testcases := []struct {
1673 name string
1674 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001675 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001676 shouldLink string
1677 shouldNotLink []string
1678 }{
1679 {
Jiyong Park55549df2021-02-26 23:57:23 +09001680 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001681 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001682 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001683 shouldLink: "current",
1684 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001685 },
1686 {
Jiyong Park55549df2021-02-26 23:57:23 +09001687 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001688 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001689 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001690 shouldLink: "current",
1691 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001692 },
1693 }
1694 for _, tc := range testcases {
1695 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001696 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001697 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001698 apex {
1699 name: "myapex",
1700 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001701 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001702 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001703 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001704 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001705
Jooyung Han61b66e92020-03-21 14:21:46 +00001706 apex_key {
1707 name: "myapex.key",
1708 public_key: "testkey.avbpubkey",
1709 private_key: "testkey.pem",
1710 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001711
Jooyung Han61b66e92020-03-21 14:21:46 +00001712 cc_library {
1713 name: "mylib",
1714 srcs: ["mylib.cpp"],
1715 vendor_available: true,
1716 shared_libs: ["libbar"],
1717 system_shared_libs: [],
1718 stl: "none",
1719 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001720 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001721 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001722
Jooyung Han61b66e92020-03-21 14:21:46 +00001723 cc_library {
1724 name: "libbar",
1725 srcs: ["mylib.cpp"],
1726 system_shared_libs: [],
1727 stl: "none",
1728 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001729 llndk: {
1730 symbol_file: "libbar.map.txt",
1731 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001732 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001733 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001734 withUnbundledBuild,
1735 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001736
Jooyung Han61b66e92020-03-21 14:21:46 +00001737 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001738 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001739 "lib64/mylib.so",
1740 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001741
Jooyung Han61b66e92020-03-21 14:21:46 +00001742 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001743 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001744 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1745 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001746
Steven Moreland2c4000c2021-04-27 02:08:49 +00001747 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1748 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001749 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001750 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001751 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001752
Steven Moreland2c4000c2021-04-27 02:08:49 +00001753 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001754 ver := tc.shouldLink
1755 if tc.shouldLink == "current" {
1756 ver = strconv.Itoa(android.FutureApiLevelInt)
1757 }
1758 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001759 })
1760 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001761}
1762
Jiyong Park25fc6a92018-11-18 18:02:45 +09001763func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001764 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001765 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001766 apex {
1767 name: "myapex",
1768 key: "myapex.key",
1769 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001770 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001771 }
1772
1773 apex_key {
1774 name: "myapex.key",
1775 public_key: "testkey.avbpubkey",
1776 private_key: "testkey.pem",
1777 }
1778
1779 cc_library {
1780 name: "mylib",
1781 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001782 system_shared_libs: ["libc"],
1783 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001784 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001785 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001786 }
1787
1788 cc_library_shared {
1789 name: "mylib_shared",
1790 srcs: ["mylib.cpp"],
1791 shared_libs: ["libdl#27"],
1792 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001793 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09001794 }
1795
1796 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09001797 name: "libBootstrap",
1798 srcs: ["mylib.cpp"],
1799 stl: "none",
1800 bootstrap: true,
1801 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09001802 `)
1803
Jooyung Hana0503a52023-08-23 13:12:50 +09001804 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001805 copyCmds := apexRule.Args["copy_commands"]
1806
1807 // Ensure that mylib, libm, libdl are included.
Alex Light5098a612018-11-29 17:12:15 -08001808 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09001809 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
1810 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001811
1812 // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09001813 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001814
Colin Crossaede88c2020-08-11 12:17:01 -07001815 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
1816 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
1817 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001818
1819 // For dependency to libc
1820 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001821 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001822 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001823 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001824 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001825 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
1826 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001827
1828 // For dependency to libm
1829 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001830 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001831 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09001832 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001833 // ... and is not compiling with the stub
1834 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
1835 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
1836
1837 // For dependency to libdl
1838 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001839 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001840 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09001841 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
1842 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001843 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07001844 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001845 // ... Cflags from stub is correctly exported to mylib
1846 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
1847 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09001848
1849 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08001850 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1851 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
1852 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
1853 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001854}
Jiyong Park7c2ee712018-12-07 00:42:25 +09001855
Jooyung Han749dc692020-04-15 11:03:39 +09001856func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001857 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09001858 // there are three links between liba --> libz.
1859 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09001860 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09001861 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08001862 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09001863 apex {
1864 name: "myapex",
1865 key: "myapex.key",
1866 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09001867 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001868 }
1869
1870 apex {
1871 name: "otherapex",
1872 key: "myapex.key",
1873 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09001874 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09001875 }
1876
1877 apex_key {
1878 name: "myapex.key",
1879 public_key: "testkey.avbpubkey",
1880 private_key: "testkey.pem",
1881 }
1882
1883 cc_library {
1884 name: "libx",
1885 shared_libs: ["liba"],
1886 system_shared_libs: [],
1887 stl: "none",
1888 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001889 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001890 }
1891
1892 cc_library {
1893 name: "liby",
1894 shared_libs: ["liba"],
1895 system_shared_libs: [],
1896 stl: "none",
1897 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001898 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001899 }
1900
1901 cc_library {
1902 name: "liba",
1903 shared_libs: ["libz"],
1904 system_shared_libs: [],
1905 stl: "none",
1906 apex_available: [
1907 "//apex_available:anyapex",
1908 "//apex_available:platform",
1909 ],
Jooyung Han749dc692020-04-15 11:03:39 +09001910 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09001911 }
1912
1913 cc_library {
1914 name: "libz",
1915 system_shared_libs: [],
1916 stl: "none",
1917 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09001918 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09001919 },
1920 }
Jooyung Han749dc692020-04-15 11:03:39 +09001921 `)
Jooyung Han03b51852020-02-26 22:45:42 +09001922
1923 expectLink := func(from, from_variant, to, to_variant string) {
1924 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1925 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1926 }
1927 expectNoLink := func(from, from_variant, to, to_variant string) {
1928 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1929 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1930 }
1931 // platform liba is linked to non-stub version
1932 expectLink("liba", "shared", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001933 // liba in myapex is linked to current
1934 expectLink("liba", "shared_apex29", "libz", "shared_current")
1935 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09001936 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07001937 expectNoLink("liba", "shared_apex29", "libz", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001938 // liba in otherapex is linked to current
1939 expectLink("liba", "shared_apex30", "libz", "shared_current")
1940 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07001941 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
1942 expectNoLink("liba", "shared_apex30", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09001943}
1944
Jooyung Hanaed150d2020-04-02 01:41:41 +09001945func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001946 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001947 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09001948 apex {
1949 name: "myapex",
1950 key: "myapex.key",
1951 native_shared_libs: ["libx"],
1952 min_sdk_version: "R",
1953 }
1954
1955 apex_key {
1956 name: "myapex.key",
1957 public_key: "testkey.avbpubkey",
1958 private_key: "testkey.pem",
1959 }
1960
1961 cc_library {
1962 name: "libx",
1963 shared_libs: ["libz"],
1964 system_shared_libs: [],
1965 stl: "none",
1966 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001967 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09001968 }
1969
1970 cc_library {
1971 name: "libz",
1972 system_shared_libs: [],
1973 stl: "none",
1974 stubs: {
1975 versions: ["29", "R"],
1976 },
1977 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001978 `,
1979 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1980 variables.Platform_version_active_codenames = []string{"R"}
1981 }),
1982 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09001983
1984 expectLink := func(from, from_variant, to, to_variant string) {
1985 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1986 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1987 }
1988 expectNoLink := func(from, from_variant, to, to_variant string) {
1989 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
1990 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
1991 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001992 expectLink("libx", "shared_apex10000", "libz", "shared_current")
1993 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07001994 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
1995 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09001996}
1997
Jooyung Han4c4da062021-06-23 10:23:16 +09001998func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001999 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002000 testApex(t, `
2001 apex {
2002 name: "myapex",
2003 key: "myapex.key",
2004 java_libs: ["libx"],
2005 min_sdk_version: "S",
2006 }
2007
2008 apex_key {
2009 name: "myapex.key",
2010 public_key: "testkey.avbpubkey",
2011 private_key: "testkey.pem",
2012 }
2013
2014 java_library {
2015 name: "libx",
2016 srcs: ["a.java"],
2017 apex_available: [ "myapex" ],
2018 sdk_version: "current",
2019 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002020 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002021 }
2022 `,
2023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2024 variables.Platform_version_active_codenames = []string{"S"}
2025 variables.Platform_sdk_codename = proptools.StringPtr("S")
2026 }),
2027 )
2028}
2029
Jooyung Han749dc692020-04-15 11:03:39 +09002030func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002031 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002032 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002033 apex {
2034 name: "myapex",
2035 key: "myapex.key",
2036 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002037 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002038 }
2039
2040 apex_key {
2041 name: "myapex.key",
2042 public_key: "testkey.avbpubkey",
2043 private_key: "testkey.pem",
2044 }
2045
2046 cc_library {
2047 name: "libx",
2048 shared_libs: ["libz"],
2049 system_shared_libs: [],
2050 stl: "none",
2051 apex_available: [ "myapex" ],
2052 }
2053
2054 cc_library {
2055 name: "libz",
2056 system_shared_libs: [],
2057 stl: "none",
2058 stubs: {
2059 versions: ["1", "2"],
2060 },
2061 }
2062 `)
2063
2064 expectLink := func(from, from_variant, to, to_variant string) {
2065 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2066 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2067 }
2068 expectNoLink := func(from, from_variant, to, to_variant string) {
2069 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2070 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2071 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002072 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002073 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002074 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002075 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002076}
2077
Jooyung Handfc864c2023-03-20 18:19:07 +09002078func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002079 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002080 ctx := testApex(t, `
2081 apex {
2082 name: "myapex",
2083 key: "myapex.key",
2084 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002085 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002086 vendor: true,
2087 min_sdk_version: "29",
2088 }
2089
2090 apex_key {
2091 name: "myapex.key",
2092 public_key: "testkey.avbpubkey",
2093 private_key: "testkey.pem",
2094 }
2095
2096 cc_library {
2097 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002098 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002099 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002100 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002101 shared_libs: ["libbar"],
2102 }
2103
2104 cc_library {
2105 name: "libbar",
2106 stubs: { versions: ["29", "30"] },
2107 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002108 }
2109 `)
2110
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002111 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002112
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002113 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002114
2115 // Ensure that mylib links with "current" LLNDK
2116 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002117 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002118
2119 // Ensure that mylib is targeting 29
2120 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2121 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2122
2123 // Ensure that the correct variant of crtbegin_so is used.
2124 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2125 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002126
2127 // Ensure that the crtbegin_so used by the APEX is targeting 29
2128 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2129 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2130}
2131
Jooyung Han4495f842023-04-25 16:39:59 +09002132func TestTrackAllowedDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002133 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002134 ctx := testApex(t, `
2135 apex {
2136 name: "myapex",
2137 key: "myapex.key",
2138 updatable: true,
2139 native_shared_libs: [
2140 "mylib",
2141 "yourlib",
2142 ],
2143 min_sdk_version: "29",
2144 }
2145
2146 apex {
2147 name: "myapex2",
2148 key: "myapex.key",
2149 updatable: false,
2150 native_shared_libs: ["yourlib"],
2151 }
2152
2153 apex_key {
2154 name: "myapex.key",
2155 public_key: "testkey.avbpubkey",
2156 private_key: "testkey.pem",
2157 }
2158
2159 cc_library {
2160 name: "mylib",
2161 srcs: ["mylib.cpp"],
2162 shared_libs: ["libbar"],
2163 min_sdk_version: "29",
2164 apex_available: ["myapex"],
2165 }
2166
2167 cc_library {
2168 name: "libbar",
2169 stubs: { versions: ["29", "30"] },
2170 }
2171
2172 cc_library {
2173 name: "yourlib",
2174 srcs: ["mylib.cpp"],
2175 min_sdk_version: "29",
2176 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2177 }
2178 `, withFiles(android.MockFS{
2179 "packages/modules/common/build/allowed_deps.txt": nil,
2180 }))
2181
2182 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2183 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2184 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002185 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002186 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002187 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002188
Jooyung Hana0503a52023-08-23 13:12:50 +09002189 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07002190 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2191 myapex.Output("depsinfo/flatlist.txt")), "\n")
Jooyung Han4495f842023-04-25 16:39:59 +09002192 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2193 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2194 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2195 flatlist, "mylib:(minSdkVersion:29)")
2196 android.AssertStringListContains(t, "track platform-available lib",
2197 flatlist, "yourlib(minSdkVersion:29)")
2198}
2199
Nouby Mohamed8609a552024-09-04 22:19:51 +00002200func TestTrackCustomAllowedDepsInvalidDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002201 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002202 ctx := testApex(t, `
2203 apex {
2204 name: "myapex",
2205 key: "myapex.key",
2206 updatable: true,
2207 native_shared_libs: [
2208 "mylib",
2209 "yourlib",
2210 ],
2211 min_sdk_version: "29",
2212 }
2213
2214 apex {
2215 name: "myapex2",
2216 key: "myapex.key",
2217 updatable: false,
2218 native_shared_libs: ["yourlib"],
2219 }
2220
2221 apex_key {
2222 name: "myapex.key",
2223 public_key: "testkey.avbpubkey",
2224 private_key: "testkey.pem",
2225 }
2226
2227 cc_library {
2228 name: "mylib",
2229 srcs: ["mylib.cpp"],
2230 shared_libs: ["libbar"],
2231 min_sdk_version: "29",
2232 apex_available: ["myapex"],
2233 }
2234
2235 cc_library {
2236 name: "libbar",
2237 stubs: { versions: ["29", "30"] },
2238 }
2239
2240 cc_library {
2241 name: "yourlib",
2242 srcs: ["mylib.cpp"],
2243 min_sdk_version: "29",
2244 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2245 }
2246 `, withFiles(android.MockFS{
2247 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2248 }),
2249 android.FixtureModifyProductVariables(
2250 func(variables android.FixtureProductVariables) {
2251 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2252 },
2253 ))
2254
2255 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2256 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2257 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2258 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2259 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2260 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2261
2262 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2263 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2264 myapex.Output("depsinfo/flatlist.txt")), "\n")
2265 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2266 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2267 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2268 flatlist, "mylib:(minSdkVersion:29)")
2269 android.AssertStringListContains(t, "track platform-available lib",
2270 flatlist, "yourlib(minSdkVersion:29)")
2271}
2272
2273func TestTrackCustomAllowedDepsWithDefaultTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002274 t.Parallel()
Nouby Mohamed8609a552024-09-04 22:19:51 +00002275 ctx := testApex(t, `
2276 apex {
2277 name: "myapex",
2278 key: "myapex.key",
2279 updatable: true,
2280 native_shared_libs: [
2281 "mylib",
2282 "yourlib",
2283 ],
2284 min_sdk_version: "29",
2285 }
2286
2287 apex {
2288 name: "myapex2",
2289 key: "myapex.key",
2290 updatable: false,
2291 native_shared_libs: ["yourlib"],
2292 }
2293
2294 apex_key {
2295 name: "myapex.key",
2296 public_key: "testkey.avbpubkey",
2297 private_key: "testkey.pem",
2298 }
2299
2300 cc_library {
2301 name: "mylib",
2302 srcs: ["mylib.cpp"],
2303 shared_libs: ["libbar"],
2304 min_sdk_version: "29",
2305 apex_available: ["myapex"],
2306 }
2307
2308 cc_library {
2309 name: "libbar",
2310 stubs: { versions: ["29", "30"] },
2311 }
2312
2313 cc_library {
2314 name: "yourlib",
2315 srcs: ["mylib.cpp"],
2316 min_sdk_version: "29",
2317 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2318 }
2319 `, withFiles(android.MockFS{
2320 "packages/modules/common/build/custom_allowed_deps.txt": nil,
2321 "packages/modules/common/build/allowed_deps.txt": nil,
2322 }),
2323 android.FixtureModifyProductVariables(
2324 func(variables android.FixtureProductVariables) {
2325 variables.ExtraAllowedDepsTxt = proptools.StringPtr("packages/modules/common/build/custom_allowed_deps.txt")
2326 },
2327 ))
2328
2329 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2330 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2331 android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
2332 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
2333 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2334 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2335
2336 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
2337 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2338 myapex.Output("depsinfo/flatlist.txt")), "\n")
2339 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2340 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2341 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2342 flatlist, "mylib:(minSdkVersion:29)")
2343 android.AssertStringListContains(t, "track platform-available lib",
2344 flatlist, "yourlib(minSdkVersion:29)")
2345}
2346
Jooyung Han4495f842023-04-25 16:39:59 +09002347func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002348 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002349 ctx := testApex(t, `
2350 apex {
2351 name: "myapex",
2352 key: "myapex.key",
2353 updatable: true,
2354 min_sdk_version: "29",
2355 }
2356
2357 apex_key {
2358 name: "myapex.key",
2359 public_key: "testkey.avbpubkey",
2360 private_key: "testkey.pem",
2361 }
2362 `)
2363 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2364 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2365 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2366 }
2367}
2368
Jooyung Han03b51852020-02-26 22:45:42 +09002369func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002371 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002372 apex {
2373 name: "myapex",
2374 key: "myapex.key",
2375 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002376 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002377 }
2378
2379 apex_key {
2380 name: "myapex.key",
2381 public_key: "testkey.avbpubkey",
2382 private_key: "testkey.pem",
2383 }
2384
2385 cc_library {
2386 name: "libx",
2387 system_shared_libs: [],
2388 stl: "none",
2389 apex_available: [ "myapex" ],
2390 stubs: {
2391 versions: ["1", "2"],
2392 },
2393 }
2394
2395 cc_library {
2396 name: "libz",
2397 shared_libs: ["libx"],
2398 system_shared_libs: [],
2399 stl: "none",
2400 }
2401 `)
2402
2403 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002404 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002405 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2406 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2407 }
2408 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002409 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002410 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2411 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2412 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002413 expectLink("libz", "shared", "libx", "shared_current")
2414 expectNoLink("libz", "shared", "libx", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002415 expectNoLink("libz", "shared", "libz", "shared_1")
2416 expectNoLink("libz", "shared", "libz", "shared")
2417}
2418
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002419var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2420 func(variables android.FixtureProductVariables) {
2421 variables.SanitizeDevice = []string{"hwaddress"}
2422 },
2423)
2424
Jooyung Han75568392020-03-20 04:29:24 +09002425func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002426 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002427 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002428 apex {
2429 name: "myapex",
2430 key: "myapex.key",
2431 native_shared_libs: ["libx"],
2432 min_sdk_version: "29",
2433 }
2434
2435 apex_key {
2436 name: "myapex.key",
2437 public_key: "testkey.avbpubkey",
2438 private_key: "testkey.pem",
2439 }
2440
2441 cc_library {
2442 name: "libx",
2443 shared_libs: ["libbar"],
2444 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002445 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002446 }
2447
2448 cc_library {
2449 name: "libbar",
2450 stubs: {
2451 versions: ["29", "30"],
2452 },
2453 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002454 `,
2455 prepareForTestWithSantitizeHwaddress,
2456 )
Jooyung Han03b51852020-02-26 22:45:42 +09002457 expectLink := func(from, from_variant, to, to_variant string) {
2458 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2459 libFlags := ld.Args["libFlags"]
2460 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2461 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002462 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002463}
2464
Jooyung Han75568392020-03-20 04:29:24 +09002465func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002466 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002467 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002468 apex {
2469 name: "myapex",
2470 key: "myapex.key",
2471 native_shared_libs: ["libx"],
2472 min_sdk_version: "29",
2473 }
2474
2475 apex_key {
2476 name: "myapex.key",
2477 public_key: "testkey.avbpubkey",
2478 private_key: "testkey.pem",
2479 }
2480
2481 cc_library {
2482 name: "libx",
2483 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002484 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002485 }
Jooyung Han75568392020-03-20 04:29:24 +09002486 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002487
2488 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002489 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002490 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002491 // note that platform variant is not.
2492 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002493 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002494}
2495
Jooyung Han749dc692020-04-15 11:03:39 +09002496func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002497 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002498 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002499 apex {
2500 name: "myapex",
2501 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002502 native_shared_libs: ["mylib"],
2503 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002504 }
2505
2506 apex_key {
2507 name: "myapex.key",
2508 public_key: "testkey.avbpubkey",
2509 private_key: "testkey.pem",
2510 }
Jooyung Han749dc692020-04-15 11:03:39 +09002511
2512 cc_library {
2513 name: "mylib",
2514 srcs: ["mylib.cpp"],
2515 system_shared_libs: [],
2516 stl: "none",
2517 apex_available: [
2518 "myapex",
2519 ],
2520 min_sdk_version: "30",
2521 }
2522 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002523
2524 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2525 apex {
2526 name: "myapex",
2527 key: "myapex.key",
2528 native_shared_libs: ["libfoo.ffi"],
2529 min_sdk_version: "29",
2530 }
2531
2532 apex_key {
2533 name: "myapex.key",
2534 public_key: "testkey.avbpubkey",
2535 private_key: "testkey.pem",
2536 }
2537
2538 rust_ffi_shared {
2539 name: "libfoo.ffi",
2540 srcs: ["foo.rs"],
2541 crate_name: "foo",
2542 apex_available: [
2543 "myapex",
2544 ],
2545 min_sdk_version: "30",
2546 }
2547 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002548
2549 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2550 apex {
2551 name: "myapex",
2552 key: "myapex.key",
2553 java_libs: ["libfoo"],
2554 min_sdk_version: "29",
2555 }
2556
2557 apex_key {
2558 name: "myapex.key",
2559 public_key: "testkey.avbpubkey",
2560 private_key: "testkey.pem",
2561 }
2562
2563 java_import {
2564 name: "libfoo",
2565 jars: ["libfoo.jar"],
2566 apex_available: [
2567 "myapex",
2568 ],
2569 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002570 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002571 }
2572 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002573
2574 // Skip check for modules compiling against core API surface
2575 testApex(t, `
2576 apex {
2577 name: "myapex",
2578 key: "myapex.key",
2579 java_libs: ["libfoo"],
2580 min_sdk_version: "29",
2581 }
2582
2583 apex_key {
2584 name: "myapex.key",
2585 public_key: "testkey.avbpubkey",
2586 private_key: "testkey.pem",
2587 }
2588
2589 java_library {
2590 name: "libfoo",
2591 srcs: ["Foo.java"],
2592 apex_available: [
2593 "myapex",
2594 ],
2595 // Compile against core API surface
2596 sdk_version: "core_current",
2597 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002598 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002599 }
2600 `)
2601
Jooyung Han749dc692020-04-15 11:03:39 +09002602}
2603
2604func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002605 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002606 testApex(t, `
2607 apex {
2608 name: "myapex",
2609 key: "myapex.key",
2610 native_shared_libs: ["libfoo"],
2611 java_libs: ["libbar"],
2612 min_sdk_version: "29",
2613 }
2614
2615 apex_key {
2616 name: "myapex.key",
2617 public_key: "testkey.avbpubkey",
2618 private_key: "testkey.pem",
2619 }
2620
2621 cc_library {
2622 name: "libfoo",
2623 srcs: ["mylib.cpp"],
2624 shared_libs: ["libfoo_dep"],
2625 apex_available: ["myapex"],
2626 min_sdk_version: "29",
2627 }
2628
2629 cc_library {
2630 name: "libfoo_dep",
2631 srcs: ["mylib.cpp"],
2632 apex_available: ["myapex"],
2633 min_sdk_version: "29",
2634 }
2635
2636 java_library {
2637 name: "libbar",
2638 sdk_version: "current",
2639 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002640 static_libs: [
2641 "libbar_dep",
2642 "libbar_import_dep",
2643 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002644 apex_available: ["myapex"],
2645 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002646 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002647 }
2648
2649 java_library {
2650 name: "libbar_dep",
2651 sdk_version: "current",
2652 srcs: ["a.java"],
2653 apex_available: ["myapex"],
2654 min_sdk_version: "29",
2655 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002656
2657 java_import {
2658 name: "libbar_import_dep",
2659 jars: ["libbar.jar"],
2660 apex_available: ["myapex"],
2661 min_sdk_version: "29",
2662 }
Jooyung Han03b51852020-02-26 22:45:42 +09002663 `)
2664}
2665
Colin Cross8ca61c12022-10-06 21:00:14 -07002666func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002667 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002668 // Tests that an apex dependency with min_sdk_version higher than the
2669 // min_sdk_version of the apex is allowed as long as the dependency's
2670 // min_sdk_version is less than or equal to the api level that the
2671 // architecture was introduced in. In this case, arm64 didn't exist
2672 // until api level 21, so the arm64 code will never need to run on
2673 // an api level 20 device, even if other architectures of the apex
2674 // will.
2675 testApex(t, `
2676 apex {
2677 name: "myapex",
2678 key: "myapex.key",
2679 native_shared_libs: ["libfoo"],
2680 min_sdk_version: "20",
2681 }
2682
2683 apex_key {
2684 name: "myapex.key",
2685 public_key: "testkey.avbpubkey",
2686 private_key: "testkey.pem",
2687 }
2688
2689 cc_library {
2690 name: "libfoo",
2691 srcs: ["mylib.cpp"],
2692 apex_available: ["myapex"],
2693 min_sdk_version: "21",
2694 stl: "none",
2695 }
2696 `)
2697}
2698
Artur Satayev8cf899a2020-04-15 17:29:42 +01002699func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002700 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002701 testCases := []struct {
2702 name string
2703 expectedError string
2704 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002705 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002706 }{
2707 {
2708 name: "Non-updatable apex with non-stable dep",
2709 bp: `
2710 apex {
2711 name: "myapex",
2712 java_libs: ["myjar"],
2713 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002714 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002715 }
2716 apex_key {
2717 name: "myapex.key",
2718 public_key: "testkey.avbpubkey",
2719 private_key: "testkey.pem",
2720 }
2721 java_library {
2722 name: "myjar",
2723 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002724 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002725 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002726 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002727 }
2728 `,
2729 },
2730 {
2731 name: "Updatable apex with stable dep",
2732 bp: `
2733 apex {
2734 name: "myapex",
2735 java_libs: ["myjar"],
2736 key: "myapex.key",
2737 updatable: true,
2738 min_sdk_version: "29",
2739 }
2740 apex_key {
2741 name: "myapex.key",
2742 public_key: "testkey.avbpubkey",
2743 private_key: "testkey.pem",
2744 }
2745 java_library {
2746 name: "myjar",
2747 srcs: ["foo/bar/MyClass.java"],
2748 sdk_version: "current",
2749 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002750 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002751 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002752 }
2753 `,
2754 },
2755 {
2756 name: "Updatable apex with non-stable dep",
2757 expectedError: "cannot depend on \"myjar\"",
2758 bp: `
2759 apex {
2760 name: "myapex",
2761 java_libs: ["myjar"],
2762 key: "myapex.key",
2763 updatable: true,
2764 }
2765 apex_key {
2766 name: "myapex.key",
2767 public_key: "testkey.avbpubkey",
2768 private_key: "testkey.pem",
2769 }
2770 java_library {
2771 name: "myjar",
2772 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002773 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002774 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002775 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002776 }
2777 `,
2778 },
2779 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002780 name: "Updatable apex with non-stable legacy core platform dep",
2781 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
2782 bp: `
2783 apex {
2784 name: "myapex",
2785 java_libs: ["myjar-uses-legacy"],
2786 key: "myapex.key",
2787 updatable: true,
2788 }
2789 apex_key {
2790 name: "myapex.key",
2791 public_key: "testkey.avbpubkey",
2792 private_key: "testkey.pem",
2793 }
2794 java_library {
2795 name: "myjar-uses-legacy",
2796 srcs: ["foo/bar/MyClass.java"],
2797 sdk_version: "core_platform",
2798 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002799 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002800 }
2801 `,
2802 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
2803 },
2804 {
Paul Duffin043f5e72021-03-05 00:00:01 +00002805 name: "Updatable apex with non-stable transitive dep",
2806 // This is not actually detecting that the transitive dependency is unstable, rather it is
2807 // detecting that the transitive dependency is building against a wider API surface than the
2808 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09002809 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002810 bp: `
2811 apex {
2812 name: "myapex",
2813 java_libs: ["myjar"],
2814 key: "myapex.key",
2815 updatable: true,
2816 }
2817 apex_key {
2818 name: "myapex.key",
2819 public_key: "testkey.avbpubkey",
2820 private_key: "testkey.pem",
2821 }
2822 java_library {
2823 name: "myjar",
2824 srcs: ["foo/bar/MyClass.java"],
2825 sdk_version: "current",
2826 apex_available: ["myapex"],
2827 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08002828 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002829 }
2830 java_library {
2831 name: "transitive-jar",
2832 srcs: ["foo/bar/MyClass.java"],
2833 sdk_version: "core_platform",
2834 apex_available: ["myapex"],
2835 }
2836 `,
2837 },
2838 }
2839
2840 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002841 if test.name != "Updatable apex with non-stable legacy core platform dep" {
2842 continue
2843 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01002844 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002845 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002846 errorHandler := android.FixtureExpectsNoErrors
2847 if test.expectedError != "" {
2848 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002849 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002850 android.GroupFixturePreparers(
2851 java.PrepareForTestWithJavaDefaultModules,
2852 PrepareForTestWithApexBuildComponents,
2853 prepareForTestWithMyapex,
2854 android.OptionalFixturePreparer(test.preparer),
2855 ).
2856 ExtendWithErrorHandler(errorHandler).
2857 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01002858 })
2859 }
2860}
2861
Jooyung Han749dc692020-04-15 11:03:39 +09002862func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
2863 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
2864 apex {
2865 name: "myapex",
2866 key: "myapex.key",
2867 native_shared_libs: ["mylib"],
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 cc_library {
2878 name: "mylib",
2879 srcs: ["mylib.cpp"],
2880 shared_libs: ["mylib2"],
2881 system_shared_libs: [],
2882 stl: "none",
2883 apex_available: [
2884 "myapex",
2885 ],
2886 min_sdk_version: "29",
2887 }
2888
2889 // indirect part of the apex
2890 cc_library {
2891 name: "mylib2",
2892 srcs: ["mylib.cpp"],
2893 system_shared_libs: [],
2894 stl: "none",
2895 apex_available: [
2896 "myapex",
2897 ],
2898 min_sdk_version: "30",
2899 }
2900 `)
2901}
2902
2903func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002904 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002905 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
2906 apex {
2907 name: "myapex",
2908 key: "myapex.key",
2909 apps: ["AppFoo"],
2910 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00002911 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09002912 }
2913
2914 apex_key {
2915 name: "myapex.key",
2916 public_key: "testkey.avbpubkey",
2917 private_key: "testkey.pem",
2918 }
2919
2920 android_app {
2921 name: "AppFoo",
2922 srcs: ["foo/bar/MyClass.java"],
2923 sdk_version: "current",
2924 min_sdk_version: "29",
2925 system_modules: "none",
2926 stl: "none",
2927 static_libs: ["bar"],
2928 apex_available: [ "myapex" ],
2929 }
2930
2931 java_library {
2932 name: "bar",
2933 sdk_version: "current",
2934 srcs: ["a.java"],
2935 apex_available: [ "myapex" ],
2936 }
2937 `)
2938}
2939
2940func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002941 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002942 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09002943 apex {
2944 name: "myapex",
2945 key: "myapex.key",
2946 native_shared_libs: ["mylib"],
2947 min_sdk_version: "29",
2948 }
2949
2950 apex_key {
2951 name: "myapex.key",
2952 public_key: "testkey.avbpubkey",
2953 private_key: "testkey.pem",
2954 }
2955
Colin Crossea91a172024-11-05 16:14:05 -08002956 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09002957 cc_library {
2958 name: "mylib",
2959 srcs: ["mylib.cpp"],
2960 shared_libs: ["mylib2"],
2961 system_shared_libs: [],
2962 stl: "none",
2963 apex_available: ["myapex", "otherapex"],
2964 min_sdk_version: "29",
2965 }
2966
2967 cc_library {
2968 name: "mylib2",
2969 srcs: ["mylib.cpp"],
2970 system_shared_libs: [],
2971 stl: "none",
2972 apex_available: ["otherapex"],
2973 stubs: { versions: ["29", "30"] },
2974 min_sdk_version: "30",
2975 }
2976
2977 apex {
2978 name: "otherapex",
2979 key: "myapex.key",
2980 native_shared_libs: ["mylib", "mylib2"],
2981 min_sdk_version: "30",
2982 }
2983 `)
2984 expectLink := func(from, from_variant, to, to_variant string) {
2985 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2986 libFlags := ld.Args["libFlags"]
2987 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2988 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002989 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08002990 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09002991}
2992
Jooyung Haned124c32021-01-26 11:43:46 +09002993func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002994 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002995 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
2996 func(variables android.FixtureProductVariables) {
2997 variables.Platform_sdk_codename = proptools.StringPtr("S")
2998 variables.Platform_version_active_codenames = []string{"S"}
2999 },
3000 )
Jooyung Haned124c32021-01-26 11:43:46 +09003001 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3002 apex {
3003 name: "myapex",
3004 key: "myapex.key",
3005 native_shared_libs: ["libfoo"],
3006 min_sdk_version: "S",
3007 }
3008 apex_key {
3009 name: "myapex.key",
3010 public_key: "testkey.avbpubkey",
3011 private_key: "testkey.pem",
3012 }
3013 cc_library {
3014 name: "libfoo",
3015 shared_libs: ["libbar"],
3016 apex_available: ["myapex"],
3017 min_sdk_version: "29",
3018 }
3019 cc_library {
3020 name: "libbar",
3021 apex_available: ["myapex"],
3022 }
3023 `, withSAsActiveCodeNames)
3024}
3025
3026func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003027 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003028 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3029 variables.Platform_sdk_codename = proptools.StringPtr("S")
3030 variables.Platform_version_active_codenames = []string{"S", "T"}
3031 })
Colin Cross1c460562021-02-16 17:55:47 -08003032 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003033 apex {
3034 name: "myapex",
3035 key: "myapex.key",
3036 native_shared_libs: ["libfoo"],
3037 min_sdk_version: "S",
3038 }
3039 apex_key {
3040 name: "myapex.key",
3041 public_key: "testkey.avbpubkey",
3042 private_key: "testkey.pem",
3043 }
3044 cc_library {
3045 name: "libfoo",
3046 shared_libs: ["libbar"],
3047 apex_available: ["myapex"],
3048 min_sdk_version: "S",
3049 }
3050 cc_library {
3051 name: "libbar",
3052 stubs: {
3053 symbol_file: "libbar.map.txt",
3054 versions: ["30", "S", "T"],
3055 },
3056 }
3057 `, withSAsActiveCodeNames)
3058
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003059 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003060 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3061 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003062 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003063}
3064
Jiyong Park7c2ee712018-12-07 00:42:25 +09003065func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003066 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003067 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003068 apex {
3069 name: "myapex",
3070 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003071 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003072 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003073 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003074 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003075 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003076 }
3077
3078 apex_key {
3079 name: "myapex.key",
3080 public_key: "testkey.avbpubkey",
3081 private_key: "testkey.pem",
3082 }
3083
3084 prebuilt_etc {
3085 name: "myetc",
3086 src: "myprebuilt",
3087 sub_dir: "foo/bar",
3088 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003089
3090 cc_library {
3091 name: "mylib",
3092 srcs: ["mylib.cpp"],
3093 relative_install_path: "foo/bar",
3094 system_shared_libs: [],
3095 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003096 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003097 }
3098
3099 cc_binary {
3100 name: "mybin",
3101 srcs: ["mylib.cpp"],
3102 relative_install_path: "foo/bar",
3103 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003104 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003105 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003106 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003107
3108 rust_binary {
3109 name: "mybin.rust",
3110 srcs: ["foo.rs"],
3111 relative_install_path: "rust_subdir",
3112 apex_available: [ "myapex" ],
3113 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003114 `)
3115
Jooyung Hana0503a52023-08-23 13:12:50 +09003116 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003117 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003118
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003119 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003120 ensureContains(t, cmd, "/etc ")
3121 ensureContains(t, cmd, "/etc/foo ")
3122 ensureContains(t, cmd, "/etc/foo/bar ")
3123 ensureContains(t, cmd, "/lib64 ")
3124 ensureContains(t, cmd, "/lib64/foo ")
3125 ensureContains(t, cmd, "/lib64/foo/bar ")
3126 ensureContains(t, cmd, "/lib ")
3127 ensureContains(t, cmd, "/lib/foo ")
3128 ensureContains(t, cmd, "/lib/foo/bar ")
3129 ensureContains(t, cmd, "/bin ")
3130 ensureContains(t, cmd, "/bin/foo ")
3131 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003132 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003133}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003134
Jooyung Han35155c42020-02-06 17:33:20 +09003135func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003136 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003137 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003138 apex {
3139 name: "myapex",
3140 key: "myapex.key",
3141 multilib: {
3142 both: {
3143 native_shared_libs: ["mylib"],
3144 binaries: ["mybin"],
3145 },
3146 },
3147 compile_multilib: "both",
3148 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003149 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 cc_library {
3159 name: "mylib",
3160 relative_install_path: "foo/bar",
3161 system_shared_libs: [],
3162 stl: "none",
3163 apex_available: [ "myapex" ],
3164 native_bridge_supported: true,
3165 }
3166
3167 cc_binary {
3168 name: "mybin",
3169 relative_install_path: "foo/bar",
3170 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003171 stl: "none",
3172 apex_available: [ "myapex" ],
3173 native_bridge_supported: true,
3174 compile_multilib: "both", // default is "first" for binary
3175 multilib: {
3176 lib64: {
3177 suffix: "64",
3178 },
3179 },
3180 }
Spandan Das45e40012024-12-02 22:45:48 +00003181 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003182 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003183 "bin/foo/bar/mybin",
3184 "bin/foo/bar/mybin64",
3185 "bin/arm/foo/bar/mybin",
3186 "bin/arm64/foo/bar/mybin64",
3187 "lib/foo/bar/mylib.so",
3188 "lib/arm/foo/bar/mylib.so",
3189 "lib64/foo/bar/mylib.so",
3190 "lib64/arm64/foo/bar/mylib.so",
3191 })
3192}
3193
Jooyung Han85d61762020-06-24 23:50:26 +09003194func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003195 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003196 result := android.GroupFixturePreparers(
3197 prepareForApexTest,
3198 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3199 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003200 apex {
3201 name: "myapex",
3202 key: "myapex.key",
3203 binaries: ["mybin"],
3204 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003205 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003206 }
3207 apex_key {
3208 name: "myapex.key",
3209 public_key: "testkey.avbpubkey",
3210 private_key: "testkey.pem",
3211 }
3212 cc_binary {
3213 name: "mybin",
3214 vendor: true,
3215 shared_libs: ["libfoo"],
3216 }
3217 cc_library {
3218 name: "libfoo",
3219 proprietary: true,
3220 }
3221 `)
3222
Jooyung Hana0503a52023-08-23 13:12:50 +09003223 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003224 "bin/mybin",
3225 "lib64/libfoo.so",
3226 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3227 "lib64/libc++.so",
3228 })
3229
Jooyung Hana0503a52023-08-23 13:12:50 +09003230 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003231 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003232 name := apexBundle.BaseModuleName()
3233 prefix := "TARGET_"
3234 var builder strings.Builder
3235 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003236 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003237 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003238 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003239
Jooyung Hana0503a52023-08-23 13:12:50 +09003240 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003241 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3242 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003243}
3244
Justin Yun13decfb2021-03-08 19:25:55 +09003245func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003246 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003247 ctx := testApex(t, `
3248 apex {
3249 name: "myapex",
3250 key: "myapex.key",
3251 updatable: false,
3252 product_specific: true,
3253 binaries: ["foo"],
3254 }
3255
3256 apex_key {
3257 name: "myapex.key",
3258 public_key: "testkey.avbpubkey",
3259 private_key: "testkey.pem",
3260 }
3261
3262 cc_binary {
3263 name: "foo",
3264 product_available: true,
3265 apex_available: ["myapex"],
3266 srcs: ["foo.cpp"],
3267 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003268 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003269
3270 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003271 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003272 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3273 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3274 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3275 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3276}
3277
Jooyung Han8e5685d2020-09-21 11:02:57 +09003278func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003279 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003280 testCases := []struct {
3281 name string
3282 additionalProp string
3283 }{
3284 {"system apex with prebuilt_firmware", ""},
3285 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3286 }
3287 for _, tc := range testCases {
3288 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003289 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003290 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003291 apex {
3292 name: "myapex",
3293 key: "myapex.key",
3294 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003295 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003296 `+tc.additionalProp+`
3297 }
3298 apex_key {
3299 name: "myapex.key",
3300 public_key: "testkey.avbpubkey",
3301 private_key: "testkey.pem",
3302 }
3303 prebuilt_firmware {
3304 name: "myfirmware",
3305 src: "myfirmware.bin",
3306 filename_from_src: true,
3307 `+tc.additionalProp+`
3308 }
3309 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003310 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003311 "etc/firmware/myfirmware.bin",
3312 })
3313 })
3314 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003315}
3316
Jooyung Hanefb184e2020-06-25 17:14:25 +09003317func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003318 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003319 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003320 apex {
3321 name: "myapex",
3322 key: "myapex.key",
3323 vendor: true,
3324 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003325 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003326 }
3327
3328 apex_key {
3329 name: "myapex.key",
3330 public_key: "testkey.avbpubkey",
3331 private_key: "testkey.pem",
3332 }
3333
3334 cc_library {
3335 name: "mylib",
3336 vendor_available: true,
3337 }
3338 `)
3339
Jooyung Hana0503a52023-08-23 13:12:50 +09003340 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003341 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003342 name := apexBundle.BaseModuleName()
3343 prefix := "TARGET_"
3344 var builder strings.Builder
3345 data.Custom(&builder, name, prefix, "", data)
3346 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003347 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 +09003348}
3349
Jooyung Han2ed99d02020-06-24 23:26:26 +09003350func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003351 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003352 apex {
3353 name: "myapex",
3354 key: "myapex.key",
3355 vintf_fragments: ["fragment.xml"],
3356 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003357 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003358 }
3359 apex_key {
3360 name: "myapex.key",
3361 public_key: "testkey.avbpubkey",
3362 private_key: "testkey.pem",
3363 }
3364 cc_binary {
3365 name: "mybin",
3366 }
3367 `)
3368
Jooyung Hana0503a52023-08-23 13:12:50 +09003369 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003370 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003371 name := apexBundle.BaseModuleName()
3372 prefix := "TARGET_"
3373 var builder strings.Builder
3374 data.Custom(&builder, name, prefix, "", data)
3375 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003376 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003377 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003378}
3379
Jiyong Park16e91a02018-12-20 18:18:08 +09003380func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003381 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003382 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003383 apex {
3384 name: "myapex",
3385 key: "myapex.key",
3386 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 srcs: ["mylib.cpp"],
3399 system_shared_libs: [],
3400 stl: "none",
3401 stubs: {
3402 versions: ["1", "2", "3"],
3403 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003404 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003405 }
3406
3407 cc_binary {
3408 name: "not_in_apex",
3409 srcs: ["mylib.cpp"],
3410 static_libs: ["mylib"],
3411 static_executable: true,
3412 system_shared_libs: [],
3413 stl: "none",
3414 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003415 `)
3416
Colin Cross7113d202019-11-20 16:39:12 -08003417 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003418
3419 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003420 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003421}
Jiyong Park9335a262018-12-24 11:31:58 +09003422
3423func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003424 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003425 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003426 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003427 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003428 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003429 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003430 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003431 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003432 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003433 }
3434
3435 cc_library {
3436 name: "mylib",
3437 srcs: ["mylib.cpp"],
3438 system_shared_libs: [],
3439 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003440 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003441 }
3442
3443 apex_key {
3444 name: "myapex.key",
3445 public_key: "testkey.avbpubkey",
3446 private_key: "testkey.pem",
3447 }
3448
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003449 android_app_certificate {
3450 name: "myapex.certificate",
3451 certificate: "testkey",
3452 }
3453
3454 android_app_certificate {
3455 name: "myapex.certificate.override",
3456 certificate: "testkey.override",
3457 }
3458
Jiyong Park9335a262018-12-24 11:31:58 +09003459 `)
3460
3461 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003462 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003463
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003464 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3465 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003466 "vendor/foo/devkeys/testkey.avbpubkey")
3467 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003468 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3469 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003470 "vendor/foo/devkeys/testkey.pem")
3471 }
3472
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003473 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003474 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003475 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003476 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003477 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003478 }
3479}
Jiyong Park58e364a2019-01-19 19:24:06 +09003480
Jooyung Hanf121a652019-12-17 14:30:11 +09003481func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003482 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003483 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003485 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003489 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003490 }
3491 apex_key {
3492 name: "myapex.key",
3493 public_key: "testkey.avbpubkey",
3494 private_key: "testkey.pem",
3495 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003496 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003497 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3498 if actual := rule.Args["certificates"]; actual != expected {
3499 t.Errorf("certificates should be %q, not %q", expected, actual)
3500 }
3501 })
3502 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003503 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003504 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003505 apex {
3506 name: "myapex_keytest",
3507 key: "myapex.key",
3508 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003509 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003510 }
3511 apex_key {
3512 name: "myapex.key",
3513 public_key: "testkey.avbpubkey",
3514 private_key: "testkey.pem",
3515 }
3516 android_app_certificate {
3517 name: "myapex.certificate.override",
3518 certificate: "testkey.override",
3519 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003520 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003521 expected := "testkey.override.x509.pem testkey.override.pk8"
3522 if actual := rule.Args["certificates"]; actual != expected {
3523 t.Errorf("certificates should be %q, not %q", expected, actual)
3524 }
3525 })
3526 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003534 }
3535 apex_key {
3536 name: "myapex.key",
3537 public_key: "testkey.avbpubkey",
3538 private_key: "testkey.pem",
3539 }
3540 android_app_certificate {
3541 name: "myapex.certificate",
3542 certificate: "testkey",
3543 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003544 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003545 expected := "testkey.x509.pem testkey.pk8"
3546 if actual := rule.Args["certificates"]; actual != expected {
3547 t.Errorf("certificates should be %q, not %q", expected, actual)
3548 }
3549 })
3550 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003551 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003552 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003553 apex {
3554 name: "myapex_keytest",
3555 key: "myapex.key",
3556 file_contexts: ":myapex-file_contexts",
3557 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003558 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003559 }
3560 apex_key {
3561 name: "myapex.key",
3562 public_key: "testkey.avbpubkey",
3563 private_key: "testkey.pem",
3564 }
3565 android_app_certificate {
3566 name: "myapex.certificate.override",
3567 certificate: "testkey.override",
3568 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003569 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003570 expected := "testkey.override.x509.pem testkey.override.pk8"
3571 if actual := rule.Args["certificates"]; actual != expected {
3572 t.Errorf("certificates should be %q, not %q", expected, actual)
3573 }
3574 })
3575 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003576 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003577 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003578 apex {
3579 name: "myapex",
3580 key: "myapex.key",
3581 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003582 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003583 }
3584 apex_key {
3585 name: "myapex.key",
3586 public_key: "testkey.avbpubkey",
3587 private_key: "testkey.pem",
3588 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003589 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003590 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3591 if actual := rule.Args["certificates"]; actual != expected {
3592 t.Errorf("certificates should be %q, not %q", expected, actual)
3593 }
3594 })
3595 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003596 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003597 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003598 apex {
3599 name: "myapex_keytest",
3600 key: "myapex.key",
3601 file_contexts: ":myapex-file_contexts",
3602 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003603 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003604 }
3605 apex_key {
3606 name: "myapex.key",
3607 public_key: "testkey.avbpubkey",
3608 private_key: "testkey.pem",
3609 }
3610 android_app_certificate {
3611 name: "myapex.certificate.override",
3612 certificate: "testkey.override",
3613 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003614 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003615 expected := "testkey.override.x509.pem testkey.override.pk8"
3616 if actual := rule.Args["certificates"]; actual != expected {
3617 t.Errorf("certificates should be %q, not %q", expected, actual)
3618 }
3619 })
3620}
3621
Jiyong Park58e364a2019-01-19 19:24:06 +09003622func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003623 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003624 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003625 apex {
3626 name: "myapex",
3627 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003628 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003629 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003630 }
3631
3632 apex {
3633 name: "otherapex",
3634 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003635 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003636 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003637 }
3638
3639 apex_key {
3640 name: "myapex.key",
3641 public_key: "testkey.avbpubkey",
3642 private_key: "testkey.pem",
3643 }
3644
3645 cc_library {
3646 name: "mylib",
3647 srcs: ["mylib.cpp"],
3648 system_shared_libs: [],
3649 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003650 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003651 "myapex",
3652 "otherapex",
3653 ],
Jooyung Han24282772020-03-21 23:20:55 +09003654 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003655 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003656 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003657 cc_library {
3658 name: "mylib2",
3659 srcs: ["mylib.cpp"],
3660 system_shared_libs: [],
3661 stl: "none",
3662 apex_available: [
3663 "myapex",
3664 "otherapex",
3665 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003666 static_libs: ["mylib3"],
3667 recovery_available: true,
3668 min_sdk_version: "29",
3669 }
3670 cc_library {
3671 name: "mylib3",
3672 srcs: ["mylib.cpp"],
3673 system_shared_libs: [],
3674 stl: "none",
3675 apex_available: [
3676 "myapex",
3677 "otherapex",
3678 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003679 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003680 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003681 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003682 `)
3683
Jooyung Hanc87a0592020-03-02 17:44:33 +09003684 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003685 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003686 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003687
Vinh Tranf9754732023-01-19 22:41:46 -05003688 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003689 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003690 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003691
Vinh Tranf9754732023-01-19 22:41:46 -05003692 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003693 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003694 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003695
Colin Crossaede88c2020-08-11 12:17:01 -07003696 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3697 // each variant defines additional macros to distinguish which apex variant it is built for
3698
3699 // non-APEX variant does not have __ANDROID_APEX__ defined
3700 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3701 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3702
Vinh Tranf9754732023-01-19 22:41:46 -05003703 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003704 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3705 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003706
Jooyung Hanc87a0592020-03-02 17:44:33 +09003707 // non-APEX variant does not have __ANDROID_APEX__ defined
3708 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3709 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3710
Vinh Tranf9754732023-01-19 22:41:46 -05003711 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003712 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003713 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003714}
Jiyong Park7e636d02019-01-28 16:16:54 +09003715
3716func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003717 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003718 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003719 apex {
3720 name: "myapex",
3721 key: "myapex.key",
3722 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003723 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003724 }
3725
3726 apex_key {
3727 name: "myapex.key",
3728 public_key: "testkey.avbpubkey",
3729 private_key: "testkey.pem",
3730 }
3731
3732 cc_library_headers {
3733 name: "mylib_headers",
3734 export_include_dirs: ["my_include"],
3735 system_shared_libs: [],
3736 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003737 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003738 }
3739
3740 cc_library {
3741 name: "mylib",
3742 srcs: ["mylib.cpp"],
3743 system_shared_libs: [],
3744 stl: "none",
3745 header_libs: ["mylib_headers"],
3746 export_header_lib_headers: ["mylib_headers"],
3747 stubs: {
3748 versions: ["1", "2", "3"],
3749 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003750 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003751 }
3752
3753 cc_library {
3754 name: "otherlib",
3755 srcs: ["mylib.cpp"],
3756 system_shared_libs: [],
3757 stl: "none",
3758 shared_libs: ["mylib"],
3759 }
3760 `)
3761
Colin Cross7113d202019-11-20 16:39:12 -08003762 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09003763
3764 // Ensure that the include path of the header lib is exported to 'otherlib'
3765 ensureContains(t, cFlags, "-Imy_include")
3766}
Alex Light9670d332019-01-29 18:07:33 -08003767
Jiyong Park7cd10e32020-01-14 09:22:18 +09003768type fileInApex struct {
3769 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00003770 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09003771 isLink bool
3772}
3773
Jooyung Han1724d582022-12-21 10:17:44 +09003774func (f fileInApex) String() string {
3775 return f.src + ":" + f.path
3776}
3777
3778func (f fileInApex) match(expectation string) bool {
3779 parts := strings.Split(expectation, ":")
3780 if len(parts) == 1 {
3781 match, _ := path.Match(parts[0], f.path)
3782 return match
3783 }
3784 if len(parts) == 2 {
3785 matchSrc, _ := path.Match(parts[0], f.src)
3786 matchDst, _ := path.Match(parts[1], f.path)
3787 return matchSrc && matchDst
3788 }
3789 panic("invalid expected file specification: " + expectation)
3790}
3791
Jooyung Hana57af4a2020-01-23 05:36:59 +00003792func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09003793 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09003794 module := ctx.ModuleForTests(moduleName, variant)
3795 apexRule := module.MaybeRule("apexRule")
3796 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09003797 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003798 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09003799 for _, cmd := range strings.Split(copyCmds, "&&") {
3800 cmd = strings.TrimSpace(cmd)
3801 if cmd == "" {
3802 continue
3803 }
3804 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00003805 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09003806 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09003807 switch terms[0] {
3808 case "mkdir":
3809 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09003810 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09003811 t.Fatal("copyCmds contains invalid cp command", cmd)
3812 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003813 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003814 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003815 isLink = false
3816 case "ln":
3817 if len(terms) != 3 && len(terms) != 4 {
3818 // ln LINK TARGET or ln -s LINK TARGET
3819 t.Fatal("copyCmds contains invalid ln command", cmd)
3820 }
3821 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003822 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09003823 isLink = true
3824 default:
3825 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
3826 }
3827 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09003828 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09003829 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09003830 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09003831 }
Jooyung Han1724d582022-12-21 10:17:44 +09003832 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00003833 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09003834 }
3835 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003836 return ret
3837}
3838
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003839func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00003840 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09003841 var failed bool
3842 var surplus []string
3843 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003844 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003845 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003846 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09003847 if file.match(expected) {
3848 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09003849 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09003850 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09003851 }
3852 }
Jooyung Han1724d582022-12-21 10:17:44 +09003853 if !matchFound {
3854 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09003855 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09003856 }
Jooyung Han31c470b2019-10-18 16:26:59 +09003857
Jooyung Han31c470b2019-10-18 16:26:59 +09003858 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003859 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09003860 t.Log("surplus files", surplus)
3861 failed = true
3862 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09003863
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003864 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003865 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003866 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09003867 if !filesMatched[expected] {
3868 missing = append(missing, expected)
3869 }
3870 }
3871 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09003872 t.Log("missing files", missing)
3873 failed = true
3874 }
3875 if failed {
3876 t.Fail()
3877 }
3878}
3879
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003880func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
3881 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
3882}
3883
3884func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00003885 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08003886 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
3887 if deapexer.Output != nil {
3888 outputs = append(outputs, deapexer.Output.String())
3889 }
3890 for _, output := range deapexer.ImplicitOutputs {
3891 outputs = append(outputs, output.String())
3892 }
3893 actualFiles := make([]fileInApex, 0, len(outputs))
3894 for _, output := range outputs {
3895 dir := "/deapexer/"
3896 pos := strings.LastIndex(output, dir)
3897 if pos == -1 {
3898 t.Fatal("Unknown deapexer output ", output)
3899 }
3900 path := output[pos+len(dir):]
3901 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
3902 }
3903 assertFileListEquals(t, files, actualFiles)
3904}
3905
Jooyung Han39edb6c2019-11-06 16:53:07 +09003906func vndkLibrariesTxtFiles(vers ...string) (result string) {
3907 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09003908 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09003909 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003910 prebuilt_etc {
3911 name: "` + txt + `.libraries.` + v + `.txt",
3912 src: "dummy.txt",
3913 }
3914 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09003915 }
3916 }
3917 return
3918}
3919
Jooyung Han344d5432019-08-23 11:17:39 +09003920func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003921 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003922 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09003923 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08003924 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09003925 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003926 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09003927 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003928 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09003929 }
3930
3931 apex_key {
3932 name: "myapex.key",
3933 public_key: "testkey.avbpubkey",
3934 private_key: "testkey.pem",
3935 }
3936
Jooyung Han31c470b2019-10-18 16:26:59 +09003937 vndk_prebuilt_shared {
3938 name: "libvndk27",
3939 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09003940 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003941 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003942 vndk: {
3943 enabled: true,
3944 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003945 target_arch: "arm64",
3946 arch: {
3947 arm: {
3948 srcs: ["libvndk27_arm.so"],
3949 },
3950 arm64: {
3951 srcs: ["libvndk27_arm64.so"],
3952 },
3953 },
Colin Cross2807f002021-03-02 10:15:29 -08003954 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09003955 }
3956
3957 vndk_prebuilt_shared {
3958 name: "libvndk27",
3959 version: "27",
3960 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09003961 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09003962 vndk: {
3963 enabled: true,
3964 },
Jooyung Han31c470b2019-10-18 16:26:59 +09003965 target_arch: "x86_64",
3966 arch: {
3967 x86: {
3968 srcs: ["libvndk27_x86.so"],
3969 },
3970 x86_64: {
3971 srcs: ["libvndk27_x86_64.so"],
3972 },
3973 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09003974 }
3975 `+vndkLibrariesTxtFiles("27"),
3976 withFiles(map[string][]byte{
3977 "libvndk27_arm.so": nil,
3978 "libvndk27_arm64.so": nil,
3979 "libvndk27_x86.so": nil,
3980 "libvndk27_x86_64.so": nil,
3981 }))
Jooyung Han344d5432019-08-23 11:17:39 +09003982
Jooyung Hana0503a52023-08-23 13:12:50 +09003983 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09003984 "lib/libvndk27_arm.so",
3985 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09003986 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09003987 })
Jooyung Han344d5432019-08-23 11:17:39 +09003988}
3989
Jooyung Han90eee022019-10-01 20:02:42 +09003990func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003991 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003992 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09003993 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003994 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09003995 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09003996 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003997 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003998 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09003999 }
4000 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004001 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004002 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004003 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004004 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004005 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004006 }
4007 apex_key {
4008 name: "myapex.key",
4009 public_key: "testkey.avbpubkey",
4010 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004011 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004012
4013 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004014 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004015 apexManifestRule := module.Rule("apexManifestRule")
4016 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004017 }
4018
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004019 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004020 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004021}
4022
Jooyung Han344d5432019-08-23 11:17:39 +09004023func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004024 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004025 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004026 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004027 name: "com.android.vndk.v30",
4028 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004029 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004030 native_bridge_supported: true,
4031 }
4032
4033 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004034 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004035 public_key: "testkey.avbpubkey",
4036 private_key: "testkey.pem",
4037 }
4038
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004039 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004040 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004041 version: "30",
4042 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004043 srcs: ["mylib.cpp"],
4044 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004045 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004046 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004047 vndk: {
4048 enabled: true,
4049 },
Jooyung Han344d5432019-08-23 11:17:39 +09004050 }
4051 `)
4052}
4053
Jooyung Han31c470b2019-10-18 16:26:59 +09004054func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004055 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004056 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004057 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004058 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004059 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004060 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004061 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004062 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004063 }
4064
4065 apex_key {
4066 name: "myapex.key",
4067 public_key: "testkey.avbpubkey",
4068 private_key: "testkey.pem",
4069 }
4070
4071 vndk_prebuilt_shared {
4072 name: "libvndk27",
4073 version: "27",
4074 target_arch: "arm",
4075 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004076 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004077 vndk: {
4078 enabled: true,
4079 },
4080 arch: {
4081 arm: {
4082 srcs: ["libvndk27.so"],
4083 }
4084 },
4085 }
4086
4087 vndk_prebuilt_shared {
4088 name: "libvndk27",
4089 version: "27",
4090 target_arch: "arm",
4091 binder32bit: true,
4092 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004093 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004094 vndk: {
4095 enabled: true,
4096 },
4097 arch: {
4098 arm: {
4099 srcs: ["libvndk27binder32.so"],
4100 }
4101 },
Colin Cross2807f002021-03-02 10:15:29 -08004102 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004103 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004104 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004105 withFiles(map[string][]byte{
4106 "libvndk27.so": nil,
4107 "libvndk27binder32.so": nil,
4108 }),
4109 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004110 android.FixtureModifyConfig(func(config android.Config) {
4111 target := android.Target{
4112 Os: android.Android,
4113 Arch: android.Arch{
4114 ArchType: android.Arm,
4115 ArchVariant: "armv7-a-neon",
4116 Abi: []string{"armeabi-v7a"},
4117 },
4118 NativeBridge: android.NativeBridgeDisabled,
4119 NativeBridgeHostArchName: "",
4120 NativeBridgeRelativePath: "",
4121 }
4122 config.Targets[android.Android] = []android.Target{target}
4123 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004124 }),
4125 )
4126
Jooyung Hana0503a52023-08-23 13:12:50 +09004127 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004128 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004129 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004130 })
4131}
4132
Jooyung Hane1633032019-08-01 17:41:43 +09004133func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004134 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004135 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004136 apex {
4137 name: "myapex_nodep",
4138 key: "myapex.key",
4139 native_shared_libs: ["lib_nodep"],
4140 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004141 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004142 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004143 }
4144
4145 apex {
4146 name: "myapex_dep",
4147 key: "myapex.key",
4148 native_shared_libs: ["lib_dep"],
4149 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004150 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004151 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004152 }
4153
4154 apex {
4155 name: "myapex_provider",
4156 key: "myapex.key",
4157 native_shared_libs: ["libfoo"],
4158 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004159 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004160 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004161 }
4162
4163 apex {
4164 name: "myapex_selfcontained",
4165 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004166 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004167 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004168 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004169 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004170 }
4171
4172 apex_key {
4173 name: "myapex.key",
4174 public_key: "testkey.avbpubkey",
4175 private_key: "testkey.pem",
4176 }
4177
4178 cc_library {
4179 name: "lib_nodep",
4180 srcs: ["mylib.cpp"],
4181 system_shared_libs: [],
4182 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004183 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004184 }
4185
4186 cc_library {
4187 name: "lib_dep",
4188 srcs: ["mylib.cpp"],
4189 shared_libs: ["libfoo"],
4190 system_shared_libs: [],
4191 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004192 apex_available: [
4193 "myapex_dep",
4194 "myapex_provider",
4195 "myapex_selfcontained",
4196 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004197 }
4198
4199 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004200 name: "lib_dep_on_bar",
4201 srcs: ["mylib.cpp"],
4202 shared_libs: ["libbar"],
4203 system_shared_libs: [],
4204 stl: "none",
4205 apex_available: [
4206 "myapex_selfcontained",
4207 ],
4208 }
4209
4210
4211 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004212 name: "libfoo",
4213 srcs: ["mytest.cpp"],
4214 stubs: {
4215 versions: ["1"],
4216 },
4217 system_shared_libs: [],
4218 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004219 apex_available: [
4220 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004221 ],
4222 }
4223
4224 cc_library {
4225 name: "libbar",
4226 srcs: ["mytest.cpp"],
4227 stubs: {
4228 versions: ["1"],
4229 },
4230 system_shared_libs: [],
4231 stl: "none",
4232 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004233 "myapex_selfcontained",
4234 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004235 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004236
Jooyung Hane1633032019-08-01 17:41:43 +09004237 `)
4238
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004239 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004240 var provideNativeLibs, requireNativeLibs []string
4241
Jooyung Hana0503a52023-08-23 13:12:50 +09004242 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004243 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4244 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004245 ensureListEmpty(t, provideNativeLibs)
4246 ensureListEmpty(t, requireNativeLibs)
4247
Jooyung Hana0503a52023-08-23 13:12:50 +09004248 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004249 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4250 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004251 ensureListEmpty(t, provideNativeLibs)
4252 ensureListContains(t, requireNativeLibs, "libfoo.so")
4253
Jooyung Hana0503a52023-08-23 13:12:50 +09004254 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004255 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4256 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004257 ensureListContains(t, provideNativeLibs, "libfoo.so")
4258 ensureListEmpty(t, requireNativeLibs)
4259
Jooyung Hana0503a52023-08-23 13:12:50 +09004260 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004261 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4262 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004263 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004264 ensureListEmpty(t, requireNativeLibs)
4265}
4266
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004267func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004268 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004269 ctx := testApex(t, `
4270 apex {
4271 name: "myapex",
4272 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004273 native_shared_libs: ["mylib"],
4274 updatable: false,
4275 }
4276
4277 apex_key {
4278 name: "myapex.key",
4279 public_key: "testkey.avbpubkey",
4280 private_key: "testkey.pem",
4281 }
4282
4283 cc_library {
4284 name: "mylib",
4285 srcs: ["mylib.cpp"],
4286 system_shared_libs: [],
4287 stl: "none",
4288 apex_available: [
4289 "//apex_available:platform",
4290 "myapex",
4291 ],
4292 }
4293 `, android.FixtureMergeEnv(map[string]string{
4294 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4295 }))
4296
Jooyung Hana0503a52023-08-23 13:12:50 +09004297 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004298 apexManifestRule := module.Rule("apexManifestRule")
4299 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4300}
4301
Vinh Tran8f5310f2022-10-07 18:16:47 -04004302func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004303 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004304 testCases := []struct {
4305 compileMultiLibProp string
4306 containedLibs []string
4307 notContainedLibs []string
4308 }{
4309 {
4310 containedLibs: []string{
4311 "image.apex/lib64/mylib.so",
4312 "image.apex/lib/mylib.so",
4313 },
4314 compileMultiLibProp: `compile_multilib: "both",`,
4315 },
4316 {
4317 containedLibs: []string{"image.apex/lib64/mylib.so"},
4318 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4319 compileMultiLibProp: `compile_multilib: "first",`,
4320 },
4321 {
4322 containedLibs: []string{"image.apex/lib64/mylib.so"},
4323 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4324 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4325 },
4326 {
4327 containedLibs: []string{"image.apex/lib64/mylib.so"},
4328 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4329 compileMultiLibProp: `compile_multilib: "64",`,
4330 },
4331 {
4332 containedLibs: []string{"image.apex/lib/mylib.so"},
4333 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4334 compileMultiLibProp: `compile_multilib: "32",`,
4335 },
4336 }
4337 for _, testCase := range testCases {
4338 ctx := testApex(t, fmt.Sprintf(`
4339 apex {
4340 name: "myapex",
4341 key: "myapex.key",
4342 %s
4343 native_shared_libs: ["mylib"],
4344 updatable: false,
4345 }
4346 apex_key {
4347 name: "myapex.key",
4348 public_key: "testkey.avbpubkey",
4349 private_key: "testkey.pem",
4350 }
4351 cc_library {
4352 name: "mylib",
4353 srcs: ["mylib.cpp"],
4354 apex_available: [
4355 "//apex_available:platform",
4356 "myapex",
4357 ],
4358 }
4359 `, testCase.compileMultiLibProp),
4360 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004362 apexRule := module.Rule("apexRule")
4363 copyCmds := apexRule.Args["copy_commands"]
4364 for _, containedLib := range testCase.containedLibs {
4365 ensureContains(t, copyCmds, containedLib)
4366 }
4367 for _, notContainedLib := range testCase.notContainedLibs {
4368 ensureNotContains(t, copyCmds, notContainedLib)
4369 }
4370 }
4371}
4372
Alex Light0851b882019-02-07 13:20:53 -08004373func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004375 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004376 apex {
4377 name: "myapex",
4378 key: "myapex.key",
4379 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004380 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004381 }
4382
4383 apex_key {
4384 name: "myapex.key",
4385 public_key: "testkey.avbpubkey",
4386 private_key: "testkey.pem",
4387 }
4388
4389 cc_library {
4390 name: "mylib_common",
4391 srcs: ["mylib.cpp"],
4392 system_shared_libs: [],
4393 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004394 apex_available: [
4395 "//apex_available:platform",
4396 "myapex",
4397 ],
Alex Light0851b882019-02-07 13:20:53 -08004398 }
4399 `)
4400
Jooyung Hana0503a52023-08-23 13:12:50 +09004401 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004402 apexRule := module.Rule("apexRule")
4403 copyCmds := apexRule.Args["copy_commands"]
4404
4405 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4406 t.Log("Apex was a test apex!")
4407 t.Fail()
4408 }
4409 // Ensure that main rule creates an output
4410 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4411
4412 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004413 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004414
4415 // Ensure that both direct and indirect deps are copied into apex
4416 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4417
Colin Cross7113d202019-11-20 16:39:12 -08004418 // Ensure that the platform variant ends with _shared
4419 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004420
Colin Cross56a83212020-09-15 18:30:11 -07004421 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004422 t.Log("Found mylib_common not in any apex!")
4423 t.Fail()
4424 }
4425}
4426
4427func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004428 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004429 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004430 apex_test {
4431 name: "myapex",
4432 key: "myapex.key",
4433 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004434 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004435 }
4436
4437 apex_key {
4438 name: "myapex.key",
4439 public_key: "testkey.avbpubkey",
4440 private_key: "testkey.pem",
4441 }
4442
4443 cc_library {
4444 name: "mylib_common_test",
4445 srcs: ["mylib.cpp"],
4446 system_shared_libs: [],
4447 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004448 // TODO: remove //apex_available:platform
4449 apex_available: [
4450 "//apex_available:platform",
4451 "myapex",
4452 ],
Alex Light0851b882019-02-07 13:20:53 -08004453 }
4454 `)
4455
Jooyung Hana0503a52023-08-23 13:12:50 +09004456 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004457 apexRule := module.Rule("apexRule")
4458 copyCmds := apexRule.Args["copy_commands"]
4459
4460 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4461 t.Log("Apex was not a test apex!")
4462 t.Fail()
4463 }
4464 // Ensure that main rule creates an output
4465 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4466
4467 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004468 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004469
4470 // Ensure that both direct and indirect deps are copied into apex
4471 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4472
Colin Cross7113d202019-11-20 16:39:12 -08004473 // Ensure that the platform variant ends with _shared
4474 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004475}
4476
Jooyung Han85707de2023-12-01 14:21:13 +09004477func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004478 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004479 ctx := testApex(t, `
4480 apex {
4481 name: "myapex",
4482 key: "myapex.key",
4483 updatable: false,
4484 binaries: ["mybin"],
4485 }
4486 apex {
4487 name: "myvendorapex",
4488 key: "myapex.key",
4489 file_contexts: "myvendorapex_file_contexts",
4490 vendor: true,
4491 updatable: false,
4492 binaries: ["mybin"],
4493 }
4494 apex_key {
4495 name: "myapex.key",
4496 public_key: "testkey.avbpubkey",
4497 private_key: "testkey.pem",
4498 }
4499 cc_binary {
4500 name: "mybin",
4501 vendor_available: true,
4502 system_shared_libs: [],
4503 stl: "none",
4504 shared_libs: ["libz"],
4505 apex_available: ["//apex_available:anyapex"],
4506 }
4507 cc_library {
4508 name: "libz",
4509 vendor_available: true,
4510 system_shared_libs: [],
4511 stl: "none",
4512 stubs: {
4513 versions: ["28", "30"],
4514 },
4515 target: {
4516 vendor: {
4517 no_stubs: true,
4518 },
4519 },
4520 }
4521 `, withFiles(map[string][]byte{
4522 "myvendorapex_file_contexts": nil,
4523 }))
4524
4525 // libz provides stubs for core variant.
4526 {
4527 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4528 "bin/mybin",
4529 })
4530 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4531 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4532 }
4533 // libz doesn't provide stubs for vendor variant.
4534 {
4535 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4536 "bin/mybin",
4537 "lib64/libz.so",
4538 })
4539 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4540 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4541 }
4542}
4543
Alex Light9670d332019-01-29 18:07:33 -08004544func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004545 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004546 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004547 apex {
4548 name: "myapex",
4549 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004550 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004551 multilib: {
4552 first: {
4553 native_shared_libs: ["mylib_common"],
4554 }
4555 },
4556 target: {
4557 android: {
4558 multilib: {
4559 first: {
4560 native_shared_libs: ["mylib"],
4561 }
4562 }
4563 },
4564 host: {
4565 multilib: {
4566 first: {
4567 native_shared_libs: ["mylib2"],
4568 }
4569 }
4570 }
4571 }
4572 }
4573
4574 apex_key {
4575 name: "myapex.key",
4576 public_key: "testkey.avbpubkey",
4577 private_key: "testkey.pem",
4578 }
4579
4580 cc_library {
4581 name: "mylib",
4582 srcs: ["mylib.cpp"],
4583 system_shared_libs: [],
4584 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004585 // TODO: remove //apex_available:platform
4586 apex_available: [
4587 "//apex_available:platform",
4588 "myapex",
4589 ],
Alex Light9670d332019-01-29 18:07:33 -08004590 }
4591
4592 cc_library {
4593 name: "mylib_common",
4594 srcs: ["mylib.cpp"],
4595 system_shared_libs: [],
4596 stl: "none",
4597 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004598 // TODO: remove //apex_available:platform
4599 apex_available: [
4600 "//apex_available:platform",
4601 "myapex",
4602 ],
Alex Light9670d332019-01-29 18:07:33 -08004603 }
4604
4605 cc_library {
4606 name: "mylib2",
4607 srcs: ["mylib.cpp"],
4608 system_shared_libs: [],
4609 stl: "none",
4610 compile_multilib: "first",
4611 }
4612 `)
4613
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004615 copyCmds := apexRule.Args["copy_commands"]
4616
4617 // Ensure that main rule creates an output
4618 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4619
4620 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004621 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4622 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4623 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004624
4625 // Ensure that both direct and indirect deps are copied into apex
4626 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4627 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4628 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4629
Colin Cross7113d202019-11-20 16:39:12 -08004630 // Ensure that the platform variant ends with _shared
4631 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4632 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4633 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004634}
Jiyong Park04480cf2019-02-06 00:16:29 +09004635
Jiyong Park59140302020-12-14 18:44:04 +09004636func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004637 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004638 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004639 apex {
4640 name: "myapex",
4641 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004642 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004643 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004644 arch: {
4645 arm64: {
4646 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004647 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004648 },
4649 x86_64: {
4650 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004651 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004652 },
4653 }
4654 }
4655
4656 apex_key {
4657 name: "myapex.key",
4658 public_key: "testkey.avbpubkey",
4659 private_key: "testkey.pem",
4660 }
4661
4662 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004663 name: "mylib.generic",
4664 srcs: ["mylib.cpp"],
4665 system_shared_libs: [],
4666 stl: "none",
4667 // TODO: remove //apex_available:platform
4668 apex_available: [
4669 "//apex_available:platform",
4670 "myapex",
4671 ],
4672 }
4673
4674 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004675 name: "mylib.arm64",
4676 srcs: ["mylib.cpp"],
4677 system_shared_libs: [],
4678 stl: "none",
4679 // TODO: remove //apex_available:platform
4680 apex_available: [
4681 "//apex_available:platform",
4682 "myapex",
4683 ],
4684 }
4685
4686 cc_library {
4687 name: "mylib.x64",
4688 srcs: ["mylib.cpp"],
4689 system_shared_libs: [],
4690 stl: "none",
4691 // TODO: remove //apex_available:platform
4692 apex_available: [
4693 "//apex_available:platform",
4694 "myapex",
4695 ],
4696 }
4697 `)
4698
Jooyung Hana0503a52023-08-23 13:12:50 +09004699 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004700 copyCmds := apexRule.Args["copy_commands"]
4701
4702 // Ensure that apex variant is created for the direct dep
4703 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004704 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004705 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4706
4707 // Ensure that both direct and indirect deps are copied into apex
4708 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4709 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4710}
4711
Jiyong Park04480cf2019-02-06 00:16:29 +09004712func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004713 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004714 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004715 apex {
4716 name: "myapex",
4717 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004718 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004719 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004720 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004721 }
4722
4723 apex_key {
4724 name: "myapex.key",
4725 public_key: "testkey.avbpubkey",
4726 private_key: "testkey.pem",
4727 }
4728
4729 sh_binary {
4730 name: "myscript",
4731 src: "mylib.cpp",
4732 filename: "myscript.sh",
4733 sub_dir: "script",
4734 }
4735 `)
4736
Jooyung Hana0503a52023-08-23 13:12:50 +09004737 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004738 copyCmds := apexRule.Args["copy_commands"]
4739
4740 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4741}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004742
Jooyung Han91df2082019-11-20 01:49:42 +09004743func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004744 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004745 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004746 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09004747 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004748 {"", "system"},
4749 {"product_specific: true", "product"},
4750 {"soc_specific: true", "vendor"},
4751 {"proprietary: true", "vendor"},
4752 {"vendor: true", "vendor"},
4753 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09004754 }
4755 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004756 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004757 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004758 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09004759 apex {
4760 name: "myapex",
4761 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004762 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09004763 `+tc.propName+`
4764 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004765
Jooyung Han91df2082019-11-20 01:49:42 +09004766 apex_key {
4767 name: "myapex.key",
4768 public_key: "testkey.avbpubkey",
4769 private_key: "testkey.pem",
4770 }
4771 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004772
Jooyung Hana0503a52023-08-23 13:12:50 +09004773 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004774 expected := "out/soong/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01004775 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09004776 if actual != expected {
4777 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
4778 }
Jooyung Han91df2082019-11-20 01:49:42 +09004779 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004780 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004781}
Jiyong Park67882562019-03-21 01:11:21 +09004782
Jooyung Han580eb4f2020-06-24 19:33:06 +09004783func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004784 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004785 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004786 apex {
4787 name: "myapex",
4788 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004789 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004790 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004791
Jooyung Han580eb4f2020-06-24 19:33:06 +09004792 apex_key {
4793 name: "myapex.key",
4794 public_key: "testkey.avbpubkey",
4795 private_key: "testkey.pem",
4796 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004797 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09004798 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004799 rule := module.Output("file_contexts")
4800 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
4801}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004802
Jooyung Han580eb4f2020-06-24 19:33:06 +09004803func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004804 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004805 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004806 apex {
4807 name: "myapex",
4808 key: "myapex.key",
4809 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004810 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004811 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004812
Jooyung Han580eb4f2020-06-24 19:33:06 +09004813 apex_key {
4814 name: "myapex.key",
4815 public_key: "testkey.avbpubkey",
4816 private_key: "testkey.pem",
4817 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004818 `, withFiles(map[string][]byte{
4819 "my_own_file_contexts": nil,
4820 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09004821}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004822
Jooyung Han580eb4f2020-06-24 19:33:06 +09004823func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004824 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09004825 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004826 apex {
4827 name: "myapex",
4828 key: "myapex.key",
4829 product_specific: true,
4830 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004831 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004832 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004833
Jooyung Han580eb4f2020-06-24 19:33:06 +09004834 apex_key {
4835 name: "myapex.key",
4836 public_key: "testkey.avbpubkey",
4837 private_key: "testkey.pem",
4838 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004839 `)
4840
Colin Cross1c460562021-02-16 17:55:47 -08004841 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004842 apex {
4843 name: "myapex",
4844 key: "myapex.key",
4845 product_specific: true,
4846 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004847 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004848 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004849
Jooyung Han580eb4f2020-06-24 19:33:06 +09004850 apex_key {
4851 name: "myapex.key",
4852 public_key: "testkey.avbpubkey",
4853 private_key: "testkey.pem",
4854 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004855 `, withFiles(map[string][]byte{
4856 "product_specific_file_contexts": nil,
4857 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004858 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004859 rule := module.Output("file_contexts")
4860 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
4861}
Jooyung Han54aca7b2019-11-20 02:26:02 +09004862
Jooyung Han580eb4f2020-06-24 19:33:06 +09004863func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004864 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004865 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09004866 apex {
4867 name: "myapex",
4868 key: "myapex.key",
4869 product_specific: true,
4870 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004871 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09004872 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004873
Jooyung Han580eb4f2020-06-24 19:33:06 +09004874 apex_key {
4875 name: "myapex.key",
4876 public_key: "testkey.avbpubkey",
4877 private_key: "testkey.pem",
4878 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004879
Jooyung Han580eb4f2020-06-24 19:33:06 +09004880 filegroup {
4881 name: "my-file-contexts",
4882 srcs: ["product_specific_file_contexts"],
4883 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09004884 `, withFiles(map[string][]byte{
4885 "product_specific_file_contexts": nil,
4886 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09004887 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09004888 rule := module.Output("file_contexts")
4889 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09004890}
4891
Jiyong Park67882562019-03-21 01:11:21 +09004892func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004893 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004894 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09004895 apex_key {
4896 name: "myapex.key",
4897 public_key: ":my.avbpubkey",
4898 private_key: ":my.pem",
4899 product_specific: true,
4900 }
4901
4902 filegroup {
4903 name: "my.avbpubkey",
4904 srcs: ["testkey2.avbpubkey"],
4905 }
4906
4907 filegroup {
4908 name: "my.pem",
4909 srcs: ["testkey2.pem"],
4910 }
4911 `)
4912
4913 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
4914 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004915 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004916 if actual_pubkey != expected_pubkey {
4917 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
4918 }
4919 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08004920 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09004921 if actual_privkey != expected_privkey {
4922 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
4923 }
4924}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004925
4926func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004927 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004928 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004929 prebuilt_apex {
4930 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09004931 arch: {
4932 arm64: {
4933 src: "myapex-arm64.apex",
4934 },
4935 arm: {
4936 src: "myapex-arm.apex",
4937 },
4938 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004939 }
4940 `)
4941
Wei Li340ee8e2022-03-18 17:33:24 -07004942 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4943 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004944
Jiyong Parkc95714e2019-03-29 14:23:10 +09004945 expectedInput := "myapex-arm64.apex"
4946 if prebuilt.inputApex.String() != expectedInput {
4947 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
4948 }
Wei Li340ee8e2022-03-18 17:33:24 -07004949 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
4950 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
4951 rule := testingModule.Rule("genProvenanceMetaData")
4952 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
4953 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4954 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4955 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08004956
4957 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
4958 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07004959}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004960
Paul Duffinc0609c62021-03-01 17:27:16 +00004961func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004962 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01004963 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00004964 prebuilt_apex {
4965 name: "myapex",
4966 }
4967 `)
4968}
4969
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004970func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004971 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004972 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004973 prebuilt_apex {
4974 name: "myapex",
4975 src: "myapex-arm.apex",
4976 filename: "notmyapex.apex",
4977 }
4978 `)
4979
Wei Li340ee8e2022-03-18 17:33:24 -07004980 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
4981 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004982
4983 expected := "notmyapex.apex"
4984 if p.installFilename != expected {
4985 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
4986 }
Wei Li340ee8e2022-03-18 17:33:24 -07004987 rule := testingModule.Rule("genProvenanceMetaData")
4988 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
4989 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
4990 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
4991 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01004992}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07004993
Samiul Islam7c02e262021-09-08 17:48:28 +01004994func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004995 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01004996 testApex(t, `
4997 apex_set {
4998 name: "com.company.android.myapex",
4999 apex_name: "com.android.myapex",
5000 set: "company-myapex.apks",
5001 filename: "com.company.android.myapex.apex"
5002 }
5003 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5004
5005 testApex(t, `
5006 apex_set {
5007 name: "com.company.android.myapex",
5008 apex_name: "com.android.myapex",
5009 set: "company-myapex.apks",
5010 filename: "com.company.android.myapex.capex"
5011 }
5012 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5013
5014 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5015 apex_set {
5016 name: "com.company.android.myapex",
5017 apex_name: "com.android.myapex",
5018 set: "company-myapex.apks",
5019 filename: "some-random-suffix"
5020 }
5021 `)
5022}
5023
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005024func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005025 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005026 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005027 prebuilt_apex {
5028 name: "myapex.prebuilt",
5029 src: "myapex-arm.apex",
5030 overrides: [
5031 "myapex",
5032 ],
5033 }
5034 `)
5035
Wei Li340ee8e2022-03-18 17:33:24 -07005036 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5037 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005038
5039 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005040 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005041 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005042 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005043 }
Wei Li340ee8e2022-03-18 17:33:24 -07005044 rule := testingModule.Rule("genProvenanceMetaData")
5045 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5046 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5047 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5048 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005049}
5050
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005051func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005052 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005053 testApex(t, `
5054 prebuilt_apex {
5055 name: "com.company.android.myapex",
5056 apex_name: "com.android.myapex",
5057 src: "company-myapex-arm.apex",
5058 }
5059 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5060
5061 testApex(t, `
5062 apex_set {
5063 name: "com.company.android.myapex",
5064 apex_name: "com.android.myapex",
5065 set: "company-myapex.apks",
5066 }
5067 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5068}
5069
5070func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005071 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005072 _ = android.GroupFixturePreparers(
5073 java.PrepareForTestWithJavaDefaultModules,
5074 PrepareForTestWithApexBuildComponents,
5075 android.FixtureWithRootAndroidBp(`
5076 platform_bootclasspath {
5077 name: "platform-bootclasspath",
5078 fragments: [
5079 {
5080 apex: "com.android.art",
5081 module: "art-bootclasspath-fragment",
5082 },
5083 ],
5084 }
5085
5086 prebuilt_apex {
5087 name: "com.company.android.art",
5088 apex_name: "com.android.art",
5089 src: "com.company.android.art-arm.apex",
5090 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5091 }
5092
5093 prebuilt_bootclasspath_fragment {
5094 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005095 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005096 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005097 hidden_api: {
5098 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5099 metadata: "my-bootclasspath-fragment/metadata.csv",
5100 index: "my-bootclasspath-fragment/index.csv",
5101 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5102 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5103 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005104 }
5105
5106 java_import {
5107 name: "core-oj",
5108 jars: ["prebuilt.jar"],
5109 }
5110 `),
5111 ).RunTest(t)
5112}
5113
Spandan Das59a4a2b2024-01-09 21:35:56 +00005114// A minimal context object for use with DexJarBuildPath
5115type moduleErrorfTestCtx struct {
5116}
5117
5118func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5119}
5120
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005121func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005122 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005123 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005124 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005125 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5126 // is disabled.
5127 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005128
5129 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5130 // file creation.
5131 java.FixtureConfigureBootJars("platform:foo"),
5132 android.FixtureModifyMockFS(func(fs android.MockFS) {
5133 fs["platform/Android.bp"] = []byte(`
5134 java_library {
5135 name: "foo",
5136 srcs: ["Test.java"],
5137 compile_dex: true,
5138 }
5139 `)
5140 fs["platform/Test.java"] = nil
5141 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005142 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005143
Paul Duffin40a3f652021-07-19 13:11:24 +01005144 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005145 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005146 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005147 var rule android.TestingBuildParams
5148
5149 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5150 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005151 }
5152
Paul Duffin40a3f652021-07-19 13:11:24 +01005153 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5154 t.Helper()
5155 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5156 var rule android.TestingBuildParams
5157
5158 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5159 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5160 }
5161
Paul Duffin89f570a2021-06-16 01:42:33 +01005162 fragment := java.ApexVariantReference{
5163 Apex: proptools.StringPtr("myapex"),
5164 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5165 }
5166
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005167 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005168 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005169 bp := `
5170 prebuilt_apex {
5171 name: "myapex",
5172 arch: {
5173 arm64: {
5174 src: "myapex-arm64.apex",
5175 },
5176 arm: {
5177 src: "myapex-arm.apex",
5178 },
5179 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005180 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5181 }
5182
5183 prebuilt_bootclasspath_fragment {
5184 name: "my-bootclasspath-fragment",
5185 contents: ["libfoo", "libbar"],
5186 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005187 hidden_api: {
5188 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5189 metadata: "my-bootclasspath-fragment/metadata.csv",
5190 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005191 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5192 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5193 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005194 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005195 }
5196
Spandan Das52c01a12024-09-20 01:09:48 +00005197 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005198 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005199 public: {
5200 jars: ["libfoo.jar"],
5201 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005202 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005203 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005204 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005205 }
Paul Duffin37856732021-02-26 14:24:15 +00005206
5207 java_sdk_library_import {
5208 name: "libbar",
5209 public: {
5210 jars: ["libbar.jar"],
5211 },
5212 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005213 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005214 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005215 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005216 `
5217
Paul Duffin89f570a2021-06-16 01:42:33 +01005218 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005219
Paul Duffin537ea3d2021-05-14 10:38:00 +01005220 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005221 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005222 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005223 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005224 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005225 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 +01005226 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005227 })
5228
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005229 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005230 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005231 bp := `
5232 apex_set {
5233 name: "myapex",
5234 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005235 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005236 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5237 }
5238
Paul Duffin89f570a2021-06-16 01:42:33 +01005239 prebuilt_bootclasspath_fragment {
5240 name: "my-bootclasspath-fragment",
5241 contents: ["libfoo", "libbar"],
5242 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005243 hidden_api: {
5244 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5245 metadata: "my-bootclasspath-fragment/metadata.csv",
5246 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005247 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5248 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5249 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005250 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005251 }
5252
Liz Kammer2dc72442023-04-20 10:10:48 -04005253 prebuilt_systemserverclasspath_fragment {
5254 name: "my-systemserverclasspath-fragment",
5255 contents: ["libbaz"],
5256 apex_available: ["myapex"],
5257 }
5258
Spandan Das52c01a12024-09-20 01:09:48 +00005259 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005260 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005261 public: {
5262 jars: ["libfoo.jar"],
5263 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005264 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005265 shared_library: false,
5266 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005267 }
5268
Spandan Das52c01a12024-09-20 01:09:48 +00005269
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005270 java_sdk_library_import {
5271 name: "libbar",
5272 public: {
5273 jars: ["libbar.jar"],
5274 },
5275 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005276 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005277 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005278 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005279
5280 java_sdk_library_import {
5281 name: "libbaz",
5282 public: {
5283 jars: ["libbaz.jar"],
5284 },
5285 apex_available: ["myapex"],
5286 shared_library: false,
5287 permitted_packages: ["baz"],
5288 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005289 `
5290
Paul Duffin89f570a2021-06-16 01:42:33 +01005291 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005292
Paul Duffin537ea3d2021-05-14 10:38:00 +01005293 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005294 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005295 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005296 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005297 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005298 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 +01005299 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005300
5301 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5302
5303 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005304 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005305 "myjavalib.myapex",
5306 "libfoo.myapex",
5307 "libbar.myapex",
5308 "libbaz.myapex",
5309 }
5310 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5311 for i, e := range mkEntries {
5312 g := e.OverrideName
5313 if w := overrideNames[i]; w != g {
5314 t.Errorf("Expected override name %q, got %q", w, g)
5315 }
5316 }
5317
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005318 })
5319
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005320 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005321 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005322 bp := `
5323 prebuilt_apex {
5324 name: "myapex",
5325 arch: {
5326 arm64: {
5327 src: "myapex-arm64.apex",
5328 },
5329 arm: {
5330 src: "myapex-arm.apex",
5331 },
5332 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005333 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5334 }
5335
5336 prebuilt_bootclasspath_fragment {
5337 name: "my-bootclasspath-fragment",
5338 contents: ["libfoo", "libbar"],
5339 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005340 hidden_api: {
5341 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5342 metadata: "my-bootclasspath-fragment/metadata.csv",
5343 index: "my-bootclasspath-fragment/index.csv",
5344 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5345 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5346 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005347 }
5348
5349 java_import {
5350 name: "libfoo",
5351 jars: ["libfoo.jar"],
5352 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005353 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005354 }
5355
5356 java_library {
5357 name: "libfoo",
5358 srcs: ["foo/bar/MyClass.java"],
5359 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005360 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005361 }
Paul Duffin37856732021-02-26 14:24:15 +00005362
5363 java_sdk_library_import {
5364 name: "libbar",
5365 public: {
5366 jars: ["libbar.jar"],
5367 },
5368 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005369 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005370 }
5371
5372 java_sdk_library {
5373 name: "libbar",
5374 srcs: ["foo/bar/MyClass.java"],
5375 unsafe_ignore_missing_latest_api: true,
5376 apex_available: ["myapex"],
5377 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005378 `
5379
5380 // In this test the source (java_library) libfoo is active since the
5381 // prebuilt (java_import) defaults to prefer:false. However the
5382 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5383 // find the dex boot jar in it. We either need to disable the source libfoo
5384 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005385 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005386 // dexbootjar check is skipped if AllowMissingDependencies is true
5387 preparerAllowMissingDeps := android.GroupFixturePreparers(
5388 preparer,
5389 android.PrepareForTestWithAllowMissingDependencies,
5390 )
5391 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005392 })
5393
5394 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005395 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005397 apex {
5398 name: "myapex",
5399 key: "myapex.key",
5400 updatable: false,
5401 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5402 }
5403
5404 apex_key {
5405 name: "myapex.key",
5406 public_key: "testkey.avbpubkey",
5407 private_key: "testkey.pem",
5408 }
5409
5410 bootclasspath_fragment {
5411 name: "my-bootclasspath-fragment",
5412 contents: ["libfoo", "libbar"],
5413 apex_available: ["myapex"],
5414 hidden_api: {
5415 split_packages: ["*"],
5416 },
5417 }
5418
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005419 prebuilt_apex {
5420 name: "myapex",
5421 arch: {
5422 arm64: {
5423 src: "myapex-arm64.apex",
5424 },
5425 arm: {
5426 src: "myapex-arm.apex",
5427 },
5428 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005429 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5430 }
5431
5432 prebuilt_bootclasspath_fragment {
5433 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005434 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005435 contents: ["libfoo", "libbar"],
5436 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005437 hidden_api: {
5438 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5439 metadata: "my-bootclasspath-fragment/metadata.csv",
5440 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005441 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5442 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5443 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005444 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005445 }
5446
Spandan Das52c01a12024-09-20 01:09:48 +00005447 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 name: "libfoo",
5449 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005450 public: {
5451 jars: ["libfoo.jar"],
5452 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005453 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005454 shared_library: false,
5455 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005456 }
5457
5458 java_library {
5459 name: "libfoo",
5460 srcs: ["foo/bar/MyClass.java"],
5461 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005462 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005463 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005464 }
Paul Duffin37856732021-02-26 14:24:15 +00005465
5466 java_sdk_library_import {
5467 name: "libbar",
5468 prefer: true,
5469 public: {
5470 jars: ["libbar.jar"],
5471 },
5472 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005473 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005474 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005475 }
5476
5477 java_sdk_library {
5478 name: "libbar",
5479 srcs: ["foo/bar/MyClass.java"],
5480 unsafe_ignore_missing_latest_api: true,
5481 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005482 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005483 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005484 `
5485
Paul Duffin89f570a2021-06-16 01:42:33 +01005486 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005487
Paul Duffin537ea3d2021-05-14 10:38:00 +01005488 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005489 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005490 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005491 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005492 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005493 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 +01005494 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005495 })
5496
5497 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005498 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005499 bp := `
5500 apex {
5501 name: "myapex",
5502 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005503 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005504 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005505 }
5506
5507 apex_key {
5508 name: "myapex.key",
5509 public_key: "testkey.avbpubkey",
5510 private_key: "testkey.pem",
5511 }
5512
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005513 bootclasspath_fragment {
5514 name: "my-bootclasspath-fragment",
5515 contents: ["libfoo", "libbar"],
5516 apex_available: ["myapex"],
5517 hidden_api: {
5518 split_packages: ["*"],
5519 },
5520 }
5521
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005522 prebuilt_apex {
5523 name: "myapex",
5524 arch: {
5525 arm64: {
5526 src: "myapex-arm64.apex",
5527 },
5528 arm: {
5529 src: "myapex-arm.apex",
5530 },
5531 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005532 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5533 }
5534
5535 prebuilt_bootclasspath_fragment {
5536 name: "my-bootclasspath-fragment",
5537 contents: ["libfoo", "libbar"],
5538 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005539 hidden_api: {
5540 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5541 metadata: "my-bootclasspath-fragment/metadata.csv",
5542 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005543 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5544 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5545 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005546 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005547 }
5548
5549 java_import {
5550 name: "libfoo",
5551 jars: ["libfoo.jar"],
5552 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005553 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005554 }
5555
5556 java_library {
5557 name: "libfoo",
5558 srcs: ["foo/bar/MyClass.java"],
5559 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005560 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005561 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005562 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005563 }
Paul Duffin37856732021-02-26 14:24:15 +00005564
5565 java_sdk_library_import {
5566 name: "libbar",
5567 public: {
5568 jars: ["libbar.jar"],
5569 },
5570 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005571 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005572 }
5573
5574 java_sdk_library {
5575 name: "libbar",
5576 srcs: ["foo/bar/MyClass.java"],
5577 unsafe_ignore_missing_latest_api: true,
5578 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005579 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005580 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005581 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005582 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005583 `
5584
Paul Duffin89f570a2021-06-16 01:42:33 +01005585 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005586
Paul Duffin537ea3d2021-05-14 10:38:00 +01005587 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005588 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005589 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5590 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005591 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
5592 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 +01005593 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005594 })
5595
5596 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005597 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005598 bp := `
5599 apex {
5600 name: "myapex",
5601 enabled: false,
5602 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005603 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005604 }
5605
5606 apex_key {
5607 name: "myapex.key",
5608 public_key: "testkey.avbpubkey",
5609 private_key: "testkey.pem",
5610 }
5611
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005612 bootclasspath_fragment {
5613 name: "my-bootclasspath-fragment",
5614 enabled: false,
5615 contents: ["libfoo", "libbar"],
5616 apex_available: ["myapex"],
5617 hidden_api: {
5618 split_packages: ["*"],
5619 },
5620 }
5621
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005622 prebuilt_apex {
5623 name: "myapex",
5624 arch: {
5625 arm64: {
5626 src: "myapex-arm64.apex",
5627 },
5628 arm: {
5629 src: "myapex-arm.apex",
5630 },
5631 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005632 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5633 }
5634
5635 prebuilt_bootclasspath_fragment {
5636 name: "my-bootclasspath-fragment",
5637 contents: ["libfoo", "libbar"],
5638 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005639 hidden_api: {
5640 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5641 metadata: "my-bootclasspath-fragment/metadata.csv",
5642 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005643 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5644 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5645 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005646 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005647 }
5648
5649 java_import {
5650 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005651 jars: ["libfoo.jar"],
5652 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005653 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005654 }
5655
5656 java_library {
5657 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005658 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005659 srcs: ["foo/bar/MyClass.java"],
5660 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005661 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005662 }
Paul Duffin37856732021-02-26 14:24:15 +00005663
5664 java_sdk_library_import {
5665 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005666 public: {
5667 jars: ["libbar.jar"],
5668 },
5669 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005670 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005671 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005672 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005673 }
5674
5675 java_sdk_library {
5676 name: "libbar",
5677 srcs: ["foo/bar/MyClass.java"],
5678 unsafe_ignore_missing_latest_api: true,
5679 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005680 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005681 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005682 `
Cole Fausta963b942024-04-11 17:43:00 -07005683 // This test disables libbar, which causes the ComponentDepsMutator to add
5684 // deps on libbar.stubs and other sub-modules that don't exist. We can
5685 // enable AllowMissingDependencies to work around that, but enabling that
5686 // causes extra checks for missing source files to dex_bootjars, so add those
5687 // to the mock fs as well.
5688 preparer2 := android.GroupFixturePreparers(
5689 preparer,
5690 android.PrepareForTestWithAllowMissingDependencies,
5691 android.FixtureMergeMockFs(map[string][]byte{
5692 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005693 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005694 }),
5695 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005696
Cole Fausta963b942024-04-11 17:43:00 -07005697 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005698
Paul Duffin537ea3d2021-05-14 10:38:00 +01005699 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005700 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005701 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005702 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005703 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005704 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 +01005705 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706 })
Spandan Das3a392012024-01-17 18:26:27 +00005707
Spandan Dasf2c10572024-02-27 04:49:52 +00005708 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005709 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005710 bp := `
5711 // Source
5712 apex {
5713 name: "myapex",
5714 enabled: false,
5715 key: "myapex.key",
5716 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5717 }
5718
5719 apex_key {
5720 name: "myapex.key",
5721 public_key: "testkey.avbpubkey",
5722 private_key: "testkey.pem",
5723 }
5724
5725 // Prebuilt
5726 prebuilt_apex {
5727 name: "myapex.v1",
5728 source_apex_name: "myapex",
5729 arch: {
5730 arm64: {
5731 src: "myapex-arm64.apex",
5732 },
5733 arm: {
5734 src: "myapex-arm.apex",
5735 },
5736 },
5737 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5738 prefer: true,
5739 }
5740 prebuilt_apex {
5741 name: "myapex.v2",
5742 source_apex_name: "myapex",
5743 arch: {
5744 arm64: {
5745 src: "myapex-arm64.apex",
5746 },
5747 arm: {
5748 src: "myapex-arm.apex",
5749 },
5750 },
5751 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5752 prefer: true,
5753 }
5754
5755 prebuilt_bootclasspath_fragment {
5756 name: "my-bootclasspath-fragment",
5757 contents: ["libfoo", "libbar"],
5758 apex_available: ["myapex"],
5759 hidden_api: {
5760 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5761 metadata: "my-bootclasspath-fragment/metadata.csv",
5762 index: "my-bootclasspath-fragment/index.csv",
5763 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5764 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5765 },
5766 prefer: true,
5767 }
5768
5769 java_import {
5770 name: "libfoo",
5771 jars: ["libfoo.jar"],
5772 apex_available: ["myapex"],
5773 prefer: true,
5774 }
5775 java_import {
5776 name: "libbar",
5777 jars: ["libbar.jar"],
5778 apex_available: ["myapex"],
5779 prefer: true,
5780 }
5781 `
5782
Spandan Dasf2c10572024-02-27 04:49:52 +00005783 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 +00005784 })
5785
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005786}
5787
Roland Levillain630846d2019-06-26 12:48:34 +01005788func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005789 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005790 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01005791 apex_test {
5792 name: "myapex",
5793 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005794 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01005795 tests: [
5796 "mytest",
5797 ],
5798 }
5799
5800 apex_key {
5801 name: "myapex.key",
5802 public_key: "testkey.avbpubkey",
5803 private_key: "testkey.pem",
5804 }
5805
Liz Kammer1c14a212020-05-12 15:26:55 -07005806 filegroup {
5807 name: "fg",
5808 srcs: [
5809 "baz",
5810 "bar/baz"
5811 ],
5812 }
5813
Roland Levillain630846d2019-06-26 12:48:34 +01005814 cc_test {
5815 name: "mytest",
5816 gtest: false,
5817 srcs: ["mytest.cpp"],
5818 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005819 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01005820 system_shared_libs: [],
5821 static_executable: true,
5822 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07005823 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01005824 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01005825
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005826 cc_library {
5827 name: "mylib",
5828 srcs: ["mylib.cpp"],
5829 system_shared_libs: [],
5830 stl: "none",
5831 }
5832
Liz Kammer5bd365f2020-05-27 15:15:11 -07005833 filegroup {
5834 name: "fg2",
5835 srcs: [
5836 "testdata/baz"
5837 ],
5838 }
Roland Levillain630846d2019-06-26 12:48:34 +01005839 `)
5840
Jooyung Hana0503a52023-08-23 13:12:50 +09005841 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01005842 copyCmds := apexRule.Args["copy_commands"]
5843
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005844 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01005845 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09005846 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01005847
Liz Kammer1c14a212020-05-12 15:26:55 -07005848 //Ensure that test data are copied into apex.
5849 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
5850 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
5851
Roland Levillainf89cd092019-07-29 16:22:59 +01005852 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09005853 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07005854 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07005855 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01005856 prefix := "TARGET_"
5857 var builder strings.Builder
5858 data.Custom(&builder, name, prefix, "", data)
5859 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00005860 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01005861 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01005862}
5863
Jooyung Hand48f3c32019-08-23 11:18:57 +09005864func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005865 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09005866 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
5867 apex {
5868 name: "myapex",
5869 key: "myapex.key",
5870 native_shared_libs: ["libfoo"],
5871 }
5872
5873 apex_key {
5874 name: "myapex.key",
5875 public_key: "testkey.avbpubkey",
5876 private_key: "testkey.pem",
5877 }
5878
5879 cc_library {
5880 name: "libfoo",
5881 stl: "none",
5882 system_shared_libs: [],
5883 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005884 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09005885 }
5886 `)
5887 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
5888 apex {
5889 name: "myapex",
5890 key: "myapex.key",
5891 java_libs: ["myjar"],
5892 }
5893
5894 apex_key {
5895 name: "myapex.key",
5896 public_key: "testkey.avbpubkey",
5897 private_key: "testkey.pem",
5898 }
5899
5900 java_library {
5901 name: "myjar",
5902 srcs: ["foo/bar/MyClass.java"],
5903 sdk_version: "none",
5904 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09005905 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09005906 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08005907 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09005908 }
5909 `)
5910}
5911
Bill Peckhama41a6962021-01-11 10:58:54 -08005912func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08005913 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08005914 apex {
5915 name: "myapex",
5916 key: "myapex.key",
5917 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005918 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08005919 }
5920
5921 apex_key {
5922 name: "myapex.key",
5923 public_key: "testkey.avbpubkey",
5924 private_key: "testkey.pem",
5925 }
5926
5927 java_import {
5928 name: "myjavaimport",
5929 apex_available: ["myapex"],
5930 jars: ["my.jar"],
5931 compile_dex: true,
5932 }
5933 `)
5934
Jooyung Hana0503a52023-08-23 13:12:50 +09005935 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08005936 apexRule := module.Rule("apexRule")
5937 copyCmds := apexRule.Args["copy_commands"]
5938 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
5939}
5940
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005941func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005942 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005943 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005944 apex {
5945 name: "myapex",
5946 key: "myapex.key",
5947 apps: [
5948 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09005949 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005950 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005951 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005952 }
5953
5954 apex_key {
5955 name: "myapex.key",
5956 public_key: "testkey.avbpubkey",
5957 private_key: "testkey.pem",
5958 }
5959
5960 android_app {
5961 name: "AppFoo",
5962 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005963 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005964 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00005965 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09005966 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08005967 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005968 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005969 }
Jiyong Parkf7487312019-10-17 12:54:30 +09005970
5971 android_app {
5972 name: "AppFooPriv",
5973 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08005974 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09005975 system_modules: "none",
5976 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04005977 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08005978 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00005979 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09005980 }
Jiyong Park8be103b2019-11-08 15:53:48 +09005981
5982 cc_library_shared {
5983 name: "libjni",
5984 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09005985 shared_libs: ["libfoo"],
5986 stl: "none",
5987 system_shared_libs: [],
5988 apex_available: [ "myapex" ],
5989 sdk_version: "current",
5990 }
5991
5992 cc_library_shared {
5993 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09005994 stl: "none",
5995 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09005996 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08005997 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09005998 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09005999 `)
6000
Jooyung Hana0503a52023-08-23 13:12:50 +09006001 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006002 apexRule := module.Rule("apexRule")
6003 copyCmds := apexRule.Args["copy_commands"]
6004
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006005 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6006 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006007 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006008
Colin Crossaede88c2020-08-11 12:17:01 -07006009 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006010 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006011 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006012 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006013 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006014 // JNI libraries including transitive deps are
6015 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006016 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006017 // ... embedded inside APK (jnilibs.zip)
6018 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6019 // ... and not directly inside the APEX
6020 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6021 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006022
6023 apexBundle := module.Module().(*apexBundle)
6024 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6025 var builder strings.Builder
6026 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6027 androidMk := builder.String()
6028 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6029 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6030 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6031 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6032 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6033 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 +01006034}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006035
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006036func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006037 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006038 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6039 for _, id := range invalidBuildIds {
6040 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6041 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6042 variables.BuildId = proptools.StringPtr(id)
6043 })
6044 testApexError(t, message, `apex {
6045 name: "myapex",
6046 key: "myapex.key",
6047 apps: ["AppFooPrebuilt"],
6048 updatable: false,
6049 }
6050
6051 apex_key {
6052 name: "myapex.key",
6053 public_key: "testkey.avbpubkey",
6054 private_key: "testkey.pem",
6055 }
6056
6057 android_app_import {
6058 name: "AppFooPrebuilt",
6059 apk: "PrebuiltAppFoo.apk",
6060 presigned: true,
6061 apex_available: ["myapex"],
6062 }
6063 `, fixture)
6064 }
6065}
6066
Dario Frenicde2a032019-10-27 00:29:22 +01006067func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006068 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006069 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006070 apex {
6071 name: "myapex",
6072 key: "myapex.key",
6073 apps: [
6074 "AppFooPrebuilt",
6075 "AppFooPrivPrebuilt",
6076 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006077 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006078 }
6079
6080 apex_key {
6081 name: "myapex.key",
6082 public_key: "testkey.avbpubkey",
6083 private_key: "testkey.pem",
6084 }
6085
6086 android_app_import {
6087 name: "AppFooPrebuilt",
6088 apk: "PrebuiltAppFoo.apk",
6089 presigned: true,
6090 dex_preopt: {
6091 enabled: false,
6092 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006093 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006094 }
6095
6096 android_app_import {
6097 name: "AppFooPrivPrebuilt",
6098 apk: "PrebuiltAppFooPriv.apk",
6099 privileged: true,
6100 presigned: true,
6101 dex_preopt: {
6102 enabled: false,
6103 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006104 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006105 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006106 }
6107 `)
6108
Jooyung Hana0503a52023-08-23 13:12:50 +09006109 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006110 apexRule := module.Rule("apexRule")
6111 copyCmds := apexRule.Args["copy_commands"]
6112
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006113 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6114 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006115}
6116
6117func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006118 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006119 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006120 apex {
6121 name: "myapex",
6122 key: "myapex.key",
6123 apps: [
6124 "AppFoo",
6125 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006126 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006127 }
6128
6129 apex_key {
6130 name: "myapex.key",
6131 public_key: "testkey.avbpubkey",
6132 private_key: "testkey.pem",
6133 }
6134
6135 android_app {
6136 name: "AppFoo",
6137 srcs: ["foo/bar/MyClass.java"],
6138 sdk_version: "none",
6139 system_modules: "none",
6140 apex_available: [ "myapex" ],
6141 }
6142
6143 android_app_import {
6144 name: "AppFoo",
6145 apk: "AppFooPrebuilt.apk",
6146 filename: "AppFooPrebuilt.apk",
6147 presigned: true,
6148 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006149 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006150 }
6151 `, withFiles(map[string][]byte{
6152 "AppFooPrebuilt.apk": nil,
6153 }))
6154
Jooyung Hana0503a52023-08-23 13:12:50 +09006155 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006156 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006157 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006158}
6159
Dario Freni6f3937c2019-12-20 22:58:03 +00006160func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006161 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006162 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006163 apex {
6164 name: "myapex",
6165 key: "myapex.key",
6166 apps: [
6167 "TesterHelpAppFoo",
6168 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006169 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006170 }
6171
6172 apex_key {
6173 name: "myapex.key",
6174 public_key: "testkey.avbpubkey",
6175 private_key: "testkey.pem",
6176 }
6177
6178 android_test_helper_app {
6179 name: "TesterHelpAppFoo",
6180 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006181 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006182 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006183 }
6184
6185 `)
6186
Jooyung Hana0503a52023-08-23 13:12:50 +09006187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006188 apexRule := module.Rule("apexRule")
6189 copyCmds := apexRule.Args["copy_commands"]
6190
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006191 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006192}
6193
Jooyung Han18020ea2019-11-13 10:50:48 +09006194func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006195 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006196 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006197 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006198 apex {
6199 name: "myapex",
6200 key: "myapex.key",
6201 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006202 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006203 }
6204
6205 apex_key {
6206 name: "myapex.key",
6207 public_key: "testkey.avbpubkey",
6208 private_key: "testkey.pem",
6209 }
6210
6211 apex {
6212 name: "otherapex",
6213 key: "myapex.key",
6214 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006215 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006216 }
6217
6218 cc_defaults {
6219 name: "libfoo-defaults",
6220 apex_available: ["otherapex"],
6221 }
6222
6223 cc_library {
6224 name: "libfoo",
6225 defaults: ["libfoo-defaults"],
6226 stl: "none",
6227 system_shared_libs: [],
6228 }`)
6229}
6230
Paul Duffine52e66f2020-03-30 17:54:29 +01006231func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006232 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006233 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006234 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006235 apex {
6236 name: "myapex",
6237 key: "myapex.key",
6238 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006239 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006240 }
6241
6242 apex_key {
6243 name: "myapex.key",
6244 public_key: "testkey.avbpubkey",
6245 private_key: "testkey.pem",
6246 }
6247
6248 apex {
6249 name: "otherapex",
6250 key: "otherapex.key",
6251 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006252 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006253 }
6254
6255 apex_key {
6256 name: "otherapex.key",
6257 public_key: "testkey.avbpubkey",
6258 private_key: "testkey.pem",
6259 }
6260
6261 cc_library {
6262 name: "libfoo",
6263 stl: "none",
6264 system_shared_libs: [],
6265 apex_available: ["otherapex"],
6266 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006267
6268 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6269 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6270 testApex(t, `
6271 apex {
6272 name: "com.sdv.myapex",
6273 key: "myapex.key",
6274 native_shared_libs: ["libfoo"],
6275 updatable: false,
6276 product_specific: true,
6277 }
6278
6279 apex_key {
6280 name: "myapex.key",
6281 public_key: "testkey.avbpubkey",
6282 private_key: "testkey.pem",
6283 }
6284
6285 apex {
6286 name: "com.any.otherapex",
6287 key: "otherapex.key",
6288 native_shared_libs: ["libfoo"],
6289 updatable: false,
6290 }
6291
6292 apex_key {
6293 name: "otherapex.key",
6294 public_key: "testkey.avbpubkey",
6295 private_key: "testkey.pem",
6296 }
6297
6298 cc_library {
6299 name: "libfoo",
6300 stl: "none",
6301 system_shared_libs: [],
6302 apex_available: ["com.any.otherapex"],
6303 product_specific: true,
6304 }`,
6305 android.FixtureMergeMockFs(android.MockFS{
6306 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6307 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6308 }))
6309
6310 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6311 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6312 apex {
6313 name: "com.sdv.myapex",
6314 key: "myapex.key",
6315 native_shared_libs: ["libfoo"],
6316 updatable: false,
6317 }
6318
6319 apex_key {
6320 name: "myapex.key",
6321 public_key: "testkey.avbpubkey",
6322 private_key: "testkey.pem",
6323 }
6324
6325 apex {
6326 name: "com.any.otherapex",
6327 key: "otherapex.key",
6328 native_shared_libs: ["libfoo"],
6329 updatable: false,
6330 }
6331
6332 apex_key {
6333 name: "otherapex.key",
6334 public_key: "testkey.avbpubkey",
6335 private_key: "testkey.pem",
6336 }
6337
6338 cc_library {
6339 name: "libfoo",
6340 stl: "none",
6341 system_shared_libs: [],
6342 apex_available: ["com.any.otherapex"],
6343 }`,
6344 android.FixtureMergeMockFs(android.MockFS{
6345 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6346 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6347 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006348}
Jiyong Park127b40b2019-09-30 16:04:35 +09006349
Paul Duffine52e66f2020-03-30 17:54:29 +01006350func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006351 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006352 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006353 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006354.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006355.*-> libfoo.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006356.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006357.*-> libbar.*link:shared.*
Colin Cross6e511a92020-07-27 21:26:48 -07006358.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffin65347702020-03-31 15:23:40 +01006359.*-> libbaz.*link:shared.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006360 apex {
6361 name: "myapex",
6362 key: "myapex.key",
6363 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006364 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006365 }
6366
6367 apex_key {
6368 name: "myapex.key",
6369 public_key: "testkey.avbpubkey",
6370 private_key: "testkey.pem",
6371 }
6372
Jiyong Park127b40b2019-09-30 16:04:35 +09006373 cc_library {
6374 name: "libfoo",
6375 stl: "none",
6376 shared_libs: ["libbar"],
6377 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006378 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006379 }
6380
6381 cc_library {
6382 name: "libbar",
6383 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006384 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006385 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006386 apex_available: ["myapex"],
6387 }
6388
6389 cc_library {
6390 name: "libbaz",
6391 stl: "none",
6392 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006393 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006394
6395 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6396 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6397 testApex(t, `
6398 apex {
6399 name: "com.sdv.myapex",
6400 key: "myapex.key",
6401 native_shared_libs: ["libfoo"],
6402 updatable: false,
6403 product_specific: true,
6404 }
6405
6406 apex_key {
6407 name: "myapex.key",
6408 public_key: "testkey.avbpubkey",
6409 private_key: "testkey.pem",
6410 }
6411
6412 cc_library {
6413 name: "libfoo",
6414 stl: "none",
6415 shared_libs: ["libbar"],
6416 system_shared_libs: [],
6417 apex_available: ["com.sdv.myapex"],
6418 product_specific: true,
6419 }
6420
6421 cc_library {
6422 name: "libbar",
6423 stl: "none",
6424 shared_libs: ["libbaz"],
6425 system_shared_libs: [],
6426 apex_available: ["com.sdv.myapex"],
6427 product_specific: true,
6428 }
6429
6430 cc_library {
6431 name: "libbaz",
6432 stl: "none",
6433 system_shared_libs: [],
6434 product_specific: true,
6435 }`,
6436 android.FixtureMergeMockFs(android.MockFS{
6437 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6438 }))
6439
6440 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6441 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6442 apex {
6443 name: "com.sdv.myapex",
6444 key: "myapex.key",
6445 native_shared_libs: ["libfoo"],
6446 updatable: false,
6447 }
6448
6449 apex_key {
6450 name: "myapex.key",
6451 public_key: "testkey.avbpubkey",
6452 private_key: "testkey.pem",
6453 }
6454
6455 cc_library {
6456 name: "libfoo",
6457 stl: "none",
6458 shared_libs: ["libbar"],
6459 system_shared_libs: [],
6460 apex_available: ["com.sdv.myapex"],
6461 }
6462
6463 cc_library {
6464 name: "libbar",
6465 stl: "none",
6466 shared_libs: ["libbaz"],
6467 system_shared_libs: [],
6468 apex_available: ["com.sdv.myapex"],
6469 }
6470
6471 cc_library {
6472 name: "libbaz",
6473 stl: "none",
6474 system_shared_libs: [],
6475 }`,
6476 android.FixtureMergeMockFs(android.MockFS{
6477 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6478 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006479}
Jiyong Park127b40b2019-09-30 16:04:35 +09006480
Liz Kammer5f108fa2023-05-11 14:33:17 -04006481func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006482 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006483 testApex(t, `
6484 apex {
6485 name: "myapex",
6486 key: "myapex.key",
6487 native_shared_libs: ["libfoo"],
6488 updatable: false,
6489 }
6490
6491 apex_key {
6492 name: "myapex.key",
6493 public_key: "testkey.avbpubkey",
6494 private_key: "testkey.pem",
6495 }
6496
6497 cc_library {
6498 name: "libfoo",
6499 stl: "none",
6500 static_libs: ["libbar"],
6501 system_shared_libs: [],
6502 apex_available: ["myapex"],
6503 }
6504
6505 cc_library {
6506 name: "libbar",
6507 stl: "none",
6508 shared_libs: ["libbaz"],
6509 system_shared_libs: [],
6510 apex_available: ["myapex"],
6511 }
6512
6513 cc_library {
6514 name: "libbaz",
6515 stl: "none",
6516 system_shared_libs: [],
6517 }`)
6518
6519 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6520 apex {
6521 name: "myapex",
6522 key: "myapex.key",
6523 native_shared_libs: ["libfoo"],
6524 updatable: false,
6525 }
6526
6527 apex_key {
6528 name: "myapex.key",
6529 public_key: "testkey.avbpubkey",
6530 private_key: "testkey.pem",
6531 }
6532
6533 cc_library {
6534 name: "libfoo",
6535 stl: "none",
6536 static_libs: ["libbar"],
6537 system_shared_libs: [],
6538 apex_available: ["myapex"],
6539 }
6540
6541 cc_library {
6542 name: "libbar",
6543 stl: "none",
6544 system_shared_libs: [],
6545 }`)
6546}
6547
Paul Duffine52e66f2020-03-30 17:54:29 +01006548func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006549 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006550 testApexError(t, "\"otherapex\" is not a valid module name", `
6551 apex {
6552 name: "myapex",
6553 key: "myapex.key",
6554 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006555 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006556 }
6557
6558 apex_key {
6559 name: "myapex.key",
6560 public_key: "testkey.avbpubkey",
6561 private_key: "testkey.pem",
6562 }
6563
6564 cc_library {
6565 name: "libfoo",
6566 stl: "none",
6567 system_shared_libs: [],
6568 apex_available: ["otherapex"],
6569 }`)
6570
Paul Duffine52e66f2020-03-30 17:54:29 +01006571 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006572 apex {
6573 name: "myapex",
6574 key: "myapex.key",
6575 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006576 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006577 }
6578
6579 apex_key {
6580 name: "myapex.key",
6581 public_key: "testkey.avbpubkey",
6582 private_key: "testkey.pem",
6583 }
6584
6585 cc_library {
6586 name: "libfoo",
6587 stl: "none",
6588 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006589 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006590 apex_available: ["myapex"],
6591 }
6592
6593 cc_library {
6594 name: "libbar",
6595 stl: "none",
6596 system_shared_libs: [],
6597 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006598 }
6599
6600 cc_library {
6601 name: "libbaz",
6602 stl: "none",
6603 system_shared_libs: [],
6604 stubs: {
6605 versions: ["10", "20", "30"],
6606 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006607 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006608}
Jiyong Park127b40b2019-09-30 16:04:35 +09006609
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006610func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006611 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006612 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006613 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006614 testApexError(t, "expected an integer between 0-9; got -1", `
6615 apex {
6616 name: "myapex",
6617 key: "myapex.key",
6618 apex_available_name: "com.android.foo",
6619 variant_version: "-1",
6620 updatable: false,
6621 }
6622 apex_key {
6623 name: "myapex.key",
6624 public_key: "testkey.avbpubkey",
6625 private_key: "testkey.pem",
6626 }
6627 `)
6628 })
6629
6630 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006631 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006632 testApexError(t, "expected an integer between 0-9; got 10", `
6633 apex {
6634 name: "myapex",
6635 key: "myapex.key",
6636 apex_available_name: "com.android.foo",
6637 variant_version: "10",
6638 updatable: false,
6639 }
6640 apex_key {
6641 name: "myapex.key",
6642 public_key: "testkey.avbpubkey",
6643 private_key: "testkey.pem",
6644 }
6645 `)
6646 })
6647}
6648
6649func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006650 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006651 context := android.GroupFixturePreparers(
6652 android.PrepareForIntegrationTestWithAndroid,
6653 PrepareForTestWithApexBuildComponents,
6654 android.FixtureMergeMockFs(android.MockFS{
6655 "system/sepolicy/apex/foo-file_contexts": nil,
6656 "system/sepolicy/apex/bar-file_contexts": nil,
6657 }),
6658 )
6659 result := context.RunTestWithBp(t, `
6660 apex {
6661 name: "foo",
6662 key: "myapex.key",
6663 apex_available_name: "com.android.foo",
6664 variant_version: "0",
6665 updatable: false,
6666 }
6667 apex {
6668 name: "bar",
6669 key: "myapex.key",
6670 apex_available_name: "com.android.foo",
6671 variant_version: "3",
6672 updatable: false,
6673 }
6674 apex_key {
6675 name: "myapex.key",
6676 public_key: "testkey.avbpubkey",
6677 private_key: "testkey.pem",
6678 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006679 override_apex {
6680 name: "myoverrideapex",
6681 base: "bar",
6682 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006683 `)
6684
Jooyung Hana0503a52023-08-23 13:12:50 +09006685 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006686 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006687 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6688 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6689 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6690 }
6691
Jooyung Hana0503a52023-08-23 13:12:50 +09006692 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006693 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006694 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6695 barActualDefaultVersion := barManifestRule.Args["default_version"]
6696 if barActualDefaultVersion != barExpectedDefaultVersion {
6697 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6698 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006699
Spandan Das50801e22024-05-13 18:29:45 +00006700 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006701 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6702 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6703 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6704 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006705}
6706
Sam Delmericoca816532023-06-02 14:09:50 -04006707func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006708 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006709 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 -07006710 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006711 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6712 apex {
6713 name: "myapex_sminus",
6714 key: "myapex.key",
6715 apps: ["AppFoo"],
6716 apex_available_name: "myapex",
6717 updatable: false,
6718 }
6719 apex {
6720 name: "myapex",
6721 key: "myapex.key",
6722 apps: ["AppFoo"],
6723 updatable: false,
6724 }
6725 apex_key {
6726 name: "myapex.key",
6727 public_key: "testkey.avbpubkey",
6728 private_key: "testkey.pem",
6729 }
6730 android_app {
6731 name: "AppFoo",
6732 srcs: ["foo/bar/MyClass.java"],
6733 sdk_version: "none",
6734 system_modules: "none",
6735 apex_available: [ "myapex_sminus" ],
6736 }`,
6737 android.FixtureMergeMockFs(android.MockFS{
6738 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6739 }),
6740 )
6741 })
6742
6743 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 -07006744 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006745 testApex(t, `
6746 apex {
6747 name: "myapex_sminus",
6748 key: "myapex.key",
6749 apps: ["AppFoo"],
6750 apex_available_name: "myapex",
6751 updatable: false,
6752 }
6753 apex {
6754 name: "myapex",
6755 key: "myapex.key",
6756 apps: ["AppFoo"],
6757 updatable: false,
6758 }
6759 apex_key {
6760 name: "myapex.key",
6761 public_key: "testkey.avbpubkey",
6762 private_key: "testkey.pem",
6763 }
6764 android_app {
6765 name: "AppFoo",
6766 srcs: ["foo/bar/MyClass.java"],
6767 sdk_version: "none",
6768 system_modules: "none",
6769 apex_available: [ "myapex" ],
6770 }`,
6771 android.FixtureMergeMockFs(android.MockFS{
6772 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6773 }),
6774 )
6775 })
6776
6777 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006778 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006779 testApex(t, `
6780 override_apex {
6781 name: "myoverrideapex_sminus",
6782 base: "myapex_sminus",
6783 key: "myapex.key",
6784 apps: ["AppFooOverride"],
6785 }
6786 override_apex {
6787 name: "myoverrideapex",
6788 base: "myapex",
6789 key: "myapex.key",
6790 apps: ["AppFooOverride"],
6791 }
6792 apex {
6793 name: "myapex_sminus",
6794 key: "myapex.key",
6795 apps: ["AppFoo"],
6796 apex_available_name: "myapex",
6797 updatable: false,
6798 }
6799 apex {
6800 name: "myapex",
6801 key: "myapex.key",
6802 apps: ["AppFoo"],
6803 updatable: false,
6804 }
6805 apex_key {
6806 name: "myapex.key",
6807 public_key: "testkey.avbpubkey",
6808 private_key: "testkey.pem",
6809 }
6810 android_app {
6811 name: "AppFooOverride",
6812 srcs: ["foo/bar/MyClass.java"],
6813 sdk_version: "none",
6814 system_modules: "none",
6815 apex_available: [ "myapex" ],
6816 }
6817 android_app {
6818 name: "AppFoo",
6819 srcs: ["foo/bar/MyClass.java"],
6820 sdk_version: "none",
6821 system_modules: "none",
6822 apex_available: [ "myapex" ],
6823 }`,
6824 android.FixtureMergeMockFs(android.MockFS{
6825 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6826 }),
6827 )
6828 })
6829}
6830
6831func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006832 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006833 context := android.GroupFixturePreparers(
6834 android.PrepareForIntegrationTestWithAndroid,
6835 PrepareForTestWithApexBuildComponents,
6836 java.PrepareForTestWithDexpreopt,
6837 android.FixtureMergeMockFs(android.MockFS{
6838 "system/sepolicy/apex/myapex-file_contexts": nil,
6839 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6840 }),
6841 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6842 variables.BuildId = proptools.StringPtr("buildid")
6843 }),
6844 )
6845 context.RunTestWithBp(t, `
6846 override_apex {
6847 name: "myoverrideapex_sminus",
6848 base: "myapex_sminus",
6849 }
6850 override_apex {
6851 name: "myoverrideapex",
6852 base: "myapex",
6853 }
6854 apex {
6855 name: "myapex",
6856 key: "myapex.key",
6857 apps: ["AppFoo"],
6858 updatable: false,
6859 }
6860 apex {
6861 name: "myapex_sminus",
6862 apex_available_name: "myapex",
6863 key: "myapex.key",
6864 apps: ["AppFoo_sminus"],
6865 updatable: false,
6866 }
6867 apex_key {
6868 name: "myapex.key",
6869 public_key: "testkey.avbpubkey",
6870 private_key: "testkey.pem",
6871 }
6872 android_app {
6873 name: "AppFoo",
6874 srcs: ["foo/bar/MyClass.java"],
6875 sdk_version: "none",
6876 system_modules: "none",
6877 apex_available: [ "myapex" ],
6878 }
6879 android_app {
6880 name: "AppFoo_sminus",
6881 srcs: ["foo/bar/MyClass.java"],
6882 sdk_version: "none",
6883 min_sdk_version: "29",
6884 system_modules: "none",
6885 apex_available: [ "myapex" ],
6886 }`)
6887}
6888
Jiyong Park89e850a2020-04-07 16:37:39 +09006889func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006890 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006891 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006892 apex {
6893 name: "myapex",
6894 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09006895 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006896 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006897 }
6898
6899 apex_key {
6900 name: "myapex.key",
6901 public_key: "testkey.avbpubkey",
6902 private_key: "testkey.pem",
6903 }
6904
6905 cc_library {
6906 name: "libfoo",
6907 stl: "none",
6908 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09006909 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006910 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09006911 }
6912
6913 cc_library {
6914 name: "libfoo2",
6915 stl: "none",
6916 system_shared_libs: [],
6917 shared_libs: ["libbaz"],
6918 apex_available: ["//apex_available:platform"],
6919 }
6920
6921 cc_library {
6922 name: "libbar",
6923 stl: "none",
6924 system_shared_libs: [],
6925 apex_available: ["myapex"],
6926 }
6927
6928 cc_library {
6929 name: "libbaz",
6930 stl: "none",
6931 system_shared_libs: [],
6932 apex_available: ["myapex"],
6933 stubs: {
6934 versions: ["1"],
6935 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006936 }`)
6937
Jiyong Park89e850a2020-04-07 16:37:39 +09006938 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
6939 // because it depends on libbar which isn't available to platform
6940 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6941 if libfoo.NotAvailableForPlatform() != true {
6942 t.Errorf("%q shouldn't be available to platform", libfoo.String())
6943 }
6944
6945 // libfoo2 however can be available to platform because it depends on libbaz which provides
6946 // stubs
6947 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6948 if libfoo2.NotAvailableForPlatform() == true {
6949 t.Errorf("%q should be available to platform", libfoo2.String())
6950 }
Paul Duffine52e66f2020-03-30 17:54:29 +01006951}
Jiyong Parka90ca002019-10-07 15:47:24 +09006952
Paul Duffine52e66f2020-03-30 17:54:29 +01006953func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006954 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006955 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09006956 apex {
6957 name: "myapex",
6958 key: "myapex.key",
6959 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006960 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09006961 }
6962
6963 apex_key {
6964 name: "myapex.key",
6965 public_key: "testkey.avbpubkey",
6966 private_key: "testkey.pem",
6967 }
6968
6969 cc_library {
6970 name: "libfoo",
6971 stl: "none",
6972 system_shared_libs: [],
6973 apex_available: ["myapex"],
6974 static: {
6975 apex_available: ["//apex_available:platform"],
6976 },
6977 }`)
6978
Jiyong Park89e850a2020-04-07 16:37:39 +09006979 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
6980 if libfooShared.NotAvailableForPlatform() != true {
6981 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
6982 }
6983 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
6984 if libfooStatic.NotAvailableForPlatform() != false {
6985 t.Errorf("%q should be available to platform", libfooStatic.String())
6986 }
Jiyong Park127b40b2019-09-30 16:04:35 +09006987}
6988
Jooyung Han9a419e22024-08-16 17:14:21 +09006989func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006990 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09006991
6992 for _, tc := range []struct {
6993 name string
6994 apexAvailable string
6995 expectedError string
6996 }{
6997 {
6998 name: "prefix matches correctly",
6999 apexAvailable: "com.foo.*",
7000 },
7001 {
7002 name: "prefix doesn't match",
7003 apexAvailable: "com.bar.*",
7004 expectedError: `Consider .* "com.foo\.\*"`,
7005 },
7006 {
7007 name: "short prefix",
7008 apexAvailable: "com.*",
7009 expectedError: "requires two or more components",
7010 },
7011 {
7012 name: "wildcard not in the end",
7013 apexAvailable: "com.*.foo",
7014 expectedError: "should end with .*",
7015 },
7016 {
7017 name: "wildcard in the middle",
7018 apexAvailable: "com.foo*.*",
7019 expectedError: "not allowed in the middle",
7020 },
7021 {
7022 name: "hint with prefix pattern",
7023 apexAvailable: "//apex_available:platform",
7024 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7025 },
7026 } {
7027 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007028 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007029 errorHandler := android.FixtureExpectsNoErrors
7030 if tc.expectedError != "" {
7031 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7032 }
7033 context := android.GroupFixturePreparers(
7034 prepareForApexTest,
7035 android.FixtureMergeMockFs(android.MockFS{
7036 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7037 }),
7038 ).ExtendWithErrorHandler(errorHandler)
7039
7040 context.RunTestWithBp(t, `
7041 apex {
7042 name: "com.foo.bar",
7043 key: "myapex.key",
7044 native_shared_libs: ["libfoo"],
7045 updatable: false,
7046 }
7047
7048 apex_key {
7049 name: "myapex.key",
7050 public_key: "testkey.avbpubkey",
7051 private_key: "testkey.pem",
7052 }
7053
7054 cc_library {
7055 name: "libfoo",
7056 stl: "none",
7057 system_shared_libs: [],
7058 apex_available: ["`+tc.apexAvailable+`"],
7059 }`)
7060 })
7061 }
7062 testApexError(t, `Consider adding "com.foo" to`, `
7063 apex {
7064 name: "com.foo", // too short for a partner apex
7065 key: "myapex.key",
7066 native_shared_libs: ["libfoo"],
7067 updatable: false,
7068 }
7069
7070 apex_key {
7071 name: "myapex.key",
7072 public_key: "testkey.avbpubkey",
7073 private_key: "testkey.pem",
7074 }
7075
7076 cc_library {
7077 name: "libfoo",
7078 stl: "none",
7079 system_shared_libs: [],
7080 }
7081 `)
7082}
7083
Jooyung Hanb9518072024-11-22 14:05:20 +09007084func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7085 t.Parallel()
7086 ctx := testApex(t, `
7087 apex_test {
7088 name: "myapex",
7089 key: "myapex.key",
7090 skip_validations: {
7091 host_apex_verifier: true,
7092 },
7093 updatable: false,
7094 }
7095 apex_key {
7096 name: "myapex.key",
7097 public_key: "testkey.avbpubkey",
7098 private_key: "testkey.pem",
7099 }
7100 `)
7101
7102 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7103 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7104 t.Error("should not run host_apex_verifier")
7105 }
7106}
7107
7108func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7109 t.Parallel()
7110 ctx := testApex(t, `
7111 apex_test {
7112 name: "myapex",
7113 key: "myapex.key",
7114 updatable: false,
7115 }
7116 apex_key {
7117 name: "myapex.key",
7118 public_key: "testkey.avbpubkey",
7119 private_key: "testkey.pem",
7120 }
7121 `)
7122
7123 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7124 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7125 t.Error("should run host_apex_verifier")
7126 }
7127}
7128
Jiyong Park5d790c32019-11-15 18:40:32 +09007129func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007130 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007131 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007132 apex {
7133 name: "myapex",
7134 key: "myapex.key",
7135 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007136 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007137 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007138 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007139 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007140 }
7141
7142 override_apex {
7143 name: "override_myapex",
7144 base: "myapex",
7145 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007146 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007147 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007148 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007149 compile_multilib: "first",
7150 multilib: {
7151 lib32: {
7152 native_shared_libs: ["mylib32"],
7153 },
7154 lib64: {
7155 native_shared_libs: ["mylib64"],
7156 },
7157 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007158 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007159 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007160 key: "mynewapex.key",
7161 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007162 }
7163
7164 apex_key {
7165 name: "myapex.key",
7166 public_key: "testkey.avbpubkey",
7167 private_key: "testkey.pem",
7168 }
7169
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007170 apex_key {
7171 name: "mynewapex.key",
7172 public_key: "testkey2.avbpubkey",
7173 private_key: "testkey2.pem",
7174 }
7175
7176 android_app_certificate {
7177 name: "myapex.certificate",
7178 certificate: "testkey",
7179 }
7180
Jiyong Park5d790c32019-11-15 18:40:32 +09007181 android_app {
7182 name: "app",
7183 srcs: ["foo/bar/MyClass.java"],
7184 package_name: "foo",
7185 sdk_version: "none",
7186 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007187 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007188 }
7189
7190 override_android_app {
7191 name: "override_app",
7192 base: "app",
7193 package_name: "bar",
7194 }
markchien7c803b82021-08-26 22:10:06 +08007195
7196 bpf {
7197 name: "bpf",
7198 srcs: ["bpf.c"],
7199 }
7200
7201 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007202 name: "overrideBpf",
7203 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007204 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007205
7206 prebuilt_etc {
7207 name: "myetc",
7208 src: "myprebuilt",
7209 }
7210
7211 prebuilt_etc {
7212 name: "override_myetc",
7213 src: "override_myprebuilt",
7214 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007215
7216 cc_library {
7217 name: "mylib32",
7218 apex_available: [ "myapex" ],
7219 }
7220
7221 cc_library {
7222 name: "mylib64",
7223 apex_available: [ "myapex" ],
7224 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007225 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007226
Jooyung Hana0503a52023-08-23 13:12:50 +09007227 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007228 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007229 if originalVariant.GetOverriddenBy() != "" {
7230 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7231 }
7232 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7233 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7234 }
7235
Spandan Das50801e22024-05-13 18:29:45 +00007236 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007237 apexRule := module.Rule("apexRule")
7238 copyCmds := apexRule.Args["copy_commands"]
7239
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007240 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7241 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007242
markchien7c803b82021-08-26 22:10:06 +08007243 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007244 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007245
Daniel Norman5a3ce132021-08-26 15:44:43 -07007246 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7247 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7248
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007249 apexBundle := module.Module().(*apexBundle)
7250 name := apexBundle.Name()
7251 if name != "override_myapex" {
7252 t.Errorf("name should be \"override_myapex\", but was %q", name)
7253 }
7254
Baligh Uddin004d7172020-02-19 21:29:28 -08007255 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7256 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7257 }
7258
Jiyong Park20bacab2020-03-03 11:45:41 +09007259 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007260 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007261 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7262
7263 signApkRule := module.Rule("signapk")
7264 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007265
Colin Crossaa255532020-07-03 13:18:24 -07007266 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007267 var builder strings.Builder
7268 data.Custom(&builder, name, "TARGET_", "", data)
7269 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007270 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7271 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007272 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007273 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007274 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007275 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007276 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007277 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007278}
7279
Albert Martineefabcf2022-03-21 20:11:16 +00007280func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007281 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007282 // Override from 29 to 31
7283 minSdkOverride31 := "31"
7284 ctx := testApex(t, `
7285 apex {
7286 name: "myapex",
7287 key: "myapex.key",
7288 native_shared_libs: ["mylib"],
7289 updatable: true,
7290 min_sdk_version: "29"
7291 }
7292
7293 override_apex {
7294 name: "override_myapex",
7295 base: "myapex",
7296 logging_parent: "com.foo.bar",
7297 package_name: "test.overridden.package"
7298 }
7299
7300 apex_key {
7301 name: "myapex.key",
7302 public_key: "testkey.avbpubkey",
7303 private_key: "testkey.pem",
7304 }
7305
7306 cc_library {
7307 name: "mylib",
7308 srcs: ["mylib.cpp"],
7309 runtime_libs: ["libbar"],
7310 system_shared_libs: [],
7311 stl: "none",
7312 apex_available: [ "myapex" ],
7313 min_sdk_version: "apex_inherit"
7314 }
7315
7316 cc_library {
7317 name: "libbar",
7318 srcs: ["mylib.cpp"],
7319 system_shared_libs: [],
7320 stl: "none",
7321 apex_available: [ "myapex" ],
7322 min_sdk_version: "apex_inherit"
7323 }
7324
7325 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7326
Jooyung Hana0503a52023-08-23 13:12:50 +09007327 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007328 copyCmds := apexRule.Args["copy_commands"]
7329
7330 // Ensure that direct non-stubs dep is always included
7331 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7332
7333 // Ensure that runtime_libs dep in included
7334 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7335
7336 // Ensure libraries target overridden min_sdk_version value
7337 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7338}
7339
7340func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007341 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007342 // Attempt to override from 31 to 29, should be a NOOP
7343 minSdkOverride29 := "29"
7344 ctx := testApex(t, `
7345 apex {
7346 name: "myapex",
7347 key: "myapex.key",
7348 native_shared_libs: ["mylib"],
7349 updatable: true,
7350 min_sdk_version: "31"
7351 }
7352
7353 override_apex {
7354 name: "override_myapex",
7355 base: "myapex",
7356 logging_parent: "com.foo.bar",
7357 package_name: "test.overridden.package"
7358 }
7359
7360 apex_key {
7361 name: "myapex.key",
7362 public_key: "testkey.avbpubkey",
7363 private_key: "testkey.pem",
7364 }
7365
7366 cc_library {
7367 name: "mylib",
7368 srcs: ["mylib.cpp"],
7369 runtime_libs: ["libbar"],
7370 system_shared_libs: [],
7371 stl: "none",
7372 apex_available: [ "myapex" ],
7373 min_sdk_version: "apex_inherit"
7374 }
7375
7376 cc_library {
7377 name: "libbar",
7378 srcs: ["mylib.cpp"],
7379 system_shared_libs: [],
7380 stl: "none",
7381 apex_available: [ "myapex" ],
7382 min_sdk_version: "apex_inherit"
7383 }
7384
7385 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7386
Jooyung Hana0503a52023-08-23 13:12:50 +09007387 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007388 copyCmds := apexRule.Args["copy_commands"]
7389
7390 // Ensure that direct non-stubs dep is always included
7391 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7392
7393 // Ensure that runtime_libs dep in included
7394 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7395
7396 // Ensure libraries target the original min_sdk_version value rather than the overridden
7397 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7398}
7399
Jooyung Han214bf372019-11-12 13:03:50 +09007400func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007401 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007402 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007403 apex {
7404 name: "myapex",
7405 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007406 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007407 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007408 }
7409
7410 apex_key {
7411 name: "myapex.key",
7412 public_key: "testkey.avbpubkey",
7413 private_key: "testkey.pem",
7414 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007415
7416 cc_library {
7417 name: "mylib",
7418 srcs: ["mylib.cpp"],
7419 stl: "libc++",
7420 system_shared_libs: [],
7421 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007422 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007423 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007424 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007425
Jooyung Hana0503a52023-08-23 13:12:50 +09007426 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007427 args := module.Rule("apexRule").Args
7428 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Dario Frenie3546902020-01-14 23:50:25 +00007429 ensureNotContains(t, args["opt_flags"], "--no_hashtree")
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007430
7431 // The copies of the libraries in the apex should have one more dependency than
7432 // the ones outside the apex, namely the unwinder. Ideally we should check
7433 // the dependency names directly here but for some reason the names are blank in
7434 // this test.
7435 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007436 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007437 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7438 if len(apexImplicits) != len(nonApexImplicits)+1 {
7439 t.Errorf("%q missing unwinder dep", lib)
7440 }
7441 }
Jooyung Han214bf372019-11-12 13:03:50 +09007442}
7443
Paul Duffine05480a2021-03-08 15:07:14 +00007444var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007445 "api/current.txt": nil,
7446 "api/removed.txt": nil,
7447 "api/system-current.txt": nil,
7448 "api/system-removed.txt": nil,
7449 "api/test-current.txt": nil,
7450 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007451
Anton Hanssondff2c782020-12-21 17:10:01 +00007452 "100/public/api/foo.txt": nil,
7453 "100/public/api/foo-removed.txt": nil,
7454 "100/system/api/foo.txt": nil,
7455 "100/system/api/foo-removed.txt": nil,
7456
Paul Duffineedc5d52020-06-12 17:46:39 +01007457 // For java_sdk_library_import
7458 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007459}
7460
Jooyung Han58f26ab2019-12-18 15:34:32 +09007461func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007462 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007463 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007464 apex {
7465 name: "myapex",
7466 key: "myapex.key",
7467 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007468 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007469 }
7470
7471 apex_key {
7472 name: "myapex.key",
7473 public_key: "testkey.avbpubkey",
7474 private_key: "testkey.pem",
7475 }
7476
7477 java_sdk_library {
7478 name: "foo",
7479 srcs: ["a.java"],
7480 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007481 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007482 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007483
7484 prebuilt_apis {
7485 name: "sdk",
7486 api_dirs: ["100"],
7487 }
Paul Duffin9b879592020-05-26 13:21:35 +01007488 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007489
7490 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007491 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007492 "javalib/foo.jar",
7493 "etc/permissions/foo.xml",
7494 })
7495 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007496 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7497 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7498 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007499}
7500
Spandan Das3ee19692024-06-19 04:47:40 +00007501func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007502 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007503 ctx := testApex(t, `
7504 override_apex {
7505 name: "mycompanyapex",
7506 base: "myapex",
7507 }
7508 apex {
7509 name: "myapex",
7510 key: "myapex.key",
7511 java_libs: ["foo"],
7512 updatable: false,
7513 }
7514
7515 apex_key {
7516 name: "myapex.key",
7517 public_key: "testkey.avbpubkey",
7518 private_key: "testkey.pem",
7519 }
7520
7521 java_sdk_library {
7522 name: "foo",
7523 srcs: ["a.java"],
7524 api_packages: ["foo"],
7525 apex_available: [ "myapex" ],
7526 }
7527
7528 prebuilt_apis {
7529 name: "sdk",
7530 api_dirs: ["100"],
7531 }
7532 `, withFiles(filesForSdkLibrary))
7533
7534 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7535 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7536 // (com.android.foo), the filepath should not contain override apex name.
7537 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7538 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7539 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7540}
7541
Paul Duffin9b879592020-05-26 13:21:35 +01007542func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007543 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007544 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007545 apex {
7546 name: "myapex",
7547 key: "myapex.key",
7548 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007549 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007550 }
7551
7552 apex_key {
7553 name: "myapex.key",
7554 public_key: "testkey.avbpubkey",
7555 private_key: "testkey.pem",
7556 }
7557
7558 java_sdk_library {
7559 name: "foo",
7560 srcs: ["a.java"],
7561 api_packages: ["foo"],
7562 apex_available: ["myapex"],
7563 sdk_version: "none",
7564 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007565 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007566 }
7567
7568 java_library {
7569 name: "bar",
7570 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007571 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007572 apex_available: ["myapex"],
7573 sdk_version: "none",
7574 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007575 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007576 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007577
7578 prebuilt_apis {
7579 name: "sdk",
7580 api_dirs: ["100"],
7581 }
Paul Duffin9b879592020-05-26 13:21:35 +01007582 `, withFiles(filesForSdkLibrary))
7583
7584 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007585 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007586 "javalib/bar.jar",
7587 "javalib/foo.jar",
7588 "etc/permissions/foo.xml",
7589 })
7590
7591 // The bar library should depend on the implementation jar.
7592 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007593 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007594 t.Errorf("expected %q, found %#q", expected, actual)
7595 }
7596}
7597
7598func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007599 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007600 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007601 apex {
7602 name: "myapex",
7603 key: "myapex.key",
7604 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007605 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007606 }
7607
7608 apex_key {
7609 name: "myapex.key",
7610 public_key: "testkey.avbpubkey",
7611 private_key: "testkey.pem",
7612 }
7613
7614 java_sdk_library {
7615 name: "foo",
7616 srcs: ["a.java"],
7617 api_packages: ["foo"],
7618 apex_available: ["myapex"],
7619 sdk_version: "none",
7620 system_modules: "none",
7621 }
7622
7623 java_library {
7624 name: "bar",
7625 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007626 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007627 sdk_version: "none",
7628 system_modules: "none",
7629 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007630
7631 prebuilt_apis {
7632 name: "sdk",
7633 api_dirs: ["100"],
7634 }
Paul Duffin9b879592020-05-26 13:21:35 +01007635 `, withFiles(filesForSdkLibrary))
7636
7637 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007638 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007639 "javalib/foo.jar",
7640 "etc/permissions/foo.xml",
7641 })
7642
7643 // The bar library should depend on the stubs jar.
7644 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007645 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007646 t.Errorf("expected %q, found %#q", expected, actual)
7647 }
7648}
7649
Paul Duffineedc5d52020-06-12 17:46:39 +01007650func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007651 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007652 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007653 prebuilt_apis {
7654 name: "sdk",
7655 api_dirs: ["100"],
7656 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007657 withFiles(map[string][]byte{
7658 "apex/a.java": nil,
7659 "apex/apex_manifest.json": nil,
7660 "apex/Android.bp": []byte(`
7661 package {
7662 default_visibility: ["//visibility:private"],
7663 }
7664
7665 apex {
7666 name: "myapex",
7667 key: "myapex.key",
7668 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007669 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007670 }
7671
7672 apex_key {
7673 name: "myapex.key",
7674 public_key: "testkey.avbpubkey",
7675 private_key: "testkey.pem",
7676 }
7677
7678 java_library {
7679 name: "bar",
7680 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007681 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007682 apex_available: ["myapex"],
7683 sdk_version: "none",
7684 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007685 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007686 }
7687`),
7688 "source/a.java": nil,
7689 "source/api/current.txt": nil,
7690 "source/api/removed.txt": nil,
7691 "source/Android.bp": []byte(`
7692 package {
7693 default_visibility: ["//visibility:private"],
7694 }
7695
7696 java_sdk_library {
7697 name: "foo",
7698 visibility: ["//apex"],
7699 srcs: ["a.java"],
7700 api_packages: ["foo"],
7701 apex_available: ["myapex"],
7702 sdk_version: "none",
7703 system_modules: "none",
7704 public: {
7705 enabled: true,
7706 },
Colin Crosse4f34882024-11-14 12:26:00 -08007707 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007708 }
7709`),
7710 "prebuilt/a.jar": nil,
7711 "prebuilt/Android.bp": []byte(`
7712 package {
7713 default_visibility: ["//visibility:private"],
7714 }
7715
7716 java_sdk_library_import {
7717 name: "foo",
7718 visibility: ["//apex", "//source"],
7719 apex_available: ["myapex"],
7720 prefer: true,
7721 public: {
7722 jars: ["a.jar"],
7723 },
Colin Crosse4f34882024-11-14 12:26:00 -08007724 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007725 }
7726`),
Anton Hanssondff2c782020-12-21 17:10:01 +00007727 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01007728 )
7729
7730 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007731 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01007732 "javalib/bar.jar",
7733 "javalib/foo.jar",
7734 "etc/permissions/foo.xml",
7735 })
7736
7737 // The bar library should depend on the implementation jar.
7738 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007739 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01007740 t.Errorf("expected %q, found %#q", expected, actual)
7741 }
7742}
7743
7744func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007745 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01007746 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
7747 apex {
7748 name: "myapex",
7749 key: "myapex.key",
7750 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007751 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007752 }
7753
7754 apex_key {
7755 name: "myapex.key",
7756 public_key: "testkey.avbpubkey",
7757 private_key: "testkey.pem",
7758 }
7759
7760 java_sdk_library_import {
7761 name: "foo",
7762 apex_available: ["myapex"],
7763 prefer: true,
7764 public: {
7765 jars: ["a.jar"],
7766 },
7767 }
7768
7769 `, withFiles(filesForSdkLibrary))
7770}
7771
atrost6e126252020-01-27 17:01:16 +00007772func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007773 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01007774 result := android.GroupFixturePreparers(
7775 prepareForApexTest,
7776 java.PrepareForTestWithPlatformCompatConfig,
7777 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00007778 apex {
7779 name: "myapex",
7780 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00007781 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00007782 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007783 updatable: false,
atrost6e126252020-01-27 17:01:16 +00007784 }
7785
7786 apex_key {
7787 name: "myapex.key",
7788 public_key: "testkey.avbpubkey",
7789 private_key: "testkey.pem",
7790 }
7791
7792 platform_compat_config {
7793 name: "myjar-platform-compat-config",
7794 src: ":myjar",
7795 }
7796
7797 java_library {
7798 name: "myjar",
7799 srcs: ["foo/bar/MyClass.java"],
7800 sdk_version: "none",
7801 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00007802 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08007803 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00007804 }
Paul Duffin1b29e002021-03-16 15:06:54 +00007805
7806 // Make sure that a preferred prebuilt does not affect the apex contents.
7807 prebuilt_platform_compat_config {
7808 name: "myjar-platform-compat-config",
7809 metadata: "compat-config/metadata.xml",
7810 prefer: true,
7811 }
atrost6e126252020-01-27 17:01:16 +00007812 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00007813 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09007814 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00007815 "etc/compatconfig/myjar-platform-compat-config.xml",
7816 "javalib/myjar.jar",
7817 })
7818}
7819
Jooyung Han862c0d62022-12-21 10:15:37 +09007820func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007821 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09007822 android.GroupFixturePreparers(
7823 android.PrepareForTestWithAndroidBuildComponents,
7824 PrepareForTestWithApexBuildComponents,
7825 prepareForTestWithMyapex,
7826 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
7827 ).
7828 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
7829 RunTestWithBp(t, `
7830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
7833 prebuilts: ["foo", "bar"],
7834 updatable: false,
7835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 prebuilt_etc {
7844 name: "foo",
7845 src: "myprebuilt",
7846 filename_from_src: true,
7847 }
7848
7849 prebuilt_etc {
7850 name: "bar",
7851 src: "myprebuilt",
7852 filename_from_src: true,
7853 }
7854 `)
7855}
7856
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007857func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007858 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09007859 bp := `
7860 apex {
7861 name: "myapex",
7862 key: "myapex.key",
7863 native_shared_libs: ["libfoo"],
7864 updatable: false,
7865 unwanted_transitive_deps: ["libbar"],
7866 }
7867
7868 apex_key {
7869 name: "myapex.key",
7870 public_key: "testkey.avbpubkey",
7871 private_key: "testkey.pem",
7872 }
7873
7874 cc_library {
7875 name: "libfoo",
7876 srcs: ["foo.cpp"],
7877 shared_libs: ["libbar"],
7878 apex_available: ["myapex"],
7879 }
7880
7881 cc_library {
7882 name: "libbar",
7883 srcs: ["bar.cpp"],
7884 apex_available: ["myapex"],
7885 }`
7886 ctx := testApex(t, bp)
7887 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
7888 "*/libc++.so",
7889 "*/libfoo.so",
7890 // not libbar.so
7891 })
7892}
7893
Jiyong Park479321d2019-12-16 11:47:12 +09007894func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007895 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09007896 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
7897 apex {
7898 name: "myapex",
7899 key: "myapex.key",
7900 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007901 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09007902 }
7903
7904 apex_key {
7905 name: "myapex.key",
7906 public_key: "testkey.avbpubkey",
7907 private_key: "testkey.pem",
7908 }
7909
7910 java_library {
7911 name: "myjar",
7912 srcs: ["foo/bar/MyClass.java"],
7913 sdk_version: "none",
7914 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09007915 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09007916 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09007917 }
7918 `)
7919}
7920
Jiyong Park7cd10e32020-01-14 09:22:18 +09007921func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007922 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09007923 bp := `
7924 apex {
7925 name: "myapex",
7926 key: "myapex.key",
7927 native_shared_libs: ["mylib"],
7928 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007929 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09007930 }
7931
Jiyong Park9d677202020-02-19 16:29:35 +09007932 apex {
7933 name: "myapex.updatable",
7934 key: "myapex.key",
7935 native_shared_libs: ["mylib"],
7936 java_libs: ["myjar"],
7937 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00007938 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09007939 }
7940
Jiyong Park7cd10e32020-01-14 09:22:18 +09007941 apex_key {
7942 name: "myapex.key",
7943 public_key: "testkey.avbpubkey",
7944 private_key: "testkey.pem",
7945 }
7946
7947 cc_library {
7948 name: "mylib",
7949 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09007950 shared_libs: [
7951 "myotherlib",
7952 "myotherlib_ext",
7953 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007954 system_shared_libs: [],
7955 stl: "none",
7956 apex_available: [
7957 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007958 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007959 "//apex_available:platform",
7960 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007961 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007962 }
7963
7964 cc_library {
7965 name: "myotherlib",
7966 srcs: ["mylib.cpp"],
7967 system_shared_libs: [],
7968 stl: "none",
7969 apex_available: [
7970 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007971 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007972 "//apex_available:platform",
7973 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007974 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09007975 }
7976
Jiyong Parkce243632023-02-17 18:22:25 +09007977 cc_library {
7978 name: "myotherlib_ext",
7979 srcs: ["mylib.cpp"],
7980 system_shared_libs: [],
7981 system_ext_specific: true,
7982 stl: "none",
7983 apex_available: [
7984 "myapex",
7985 "myapex.updatable",
7986 "//apex_available:platform",
7987 ],
Spandan Das1a92db52023-04-06 18:55:06 +00007988 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09007989 }
7990
Jiyong Park7cd10e32020-01-14 09:22:18 +09007991 java_library {
7992 name: "myjar",
7993 srcs: ["foo/bar/MyClass.java"],
7994 sdk_version: "none",
7995 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00007996 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09007997 apex_available: [
7998 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09007999 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008000 "//apex_available:platform",
8001 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008002 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008003 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008004 }
8005
8006 java_library {
8007 name: "myotherjar",
8008 srcs: ["foo/bar/MyClass.java"],
8009 sdk_version: "none",
8010 system_modules: "none",
8011 apex_available: [
8012 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008013 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008014 "//apex_available:platform",
8015 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008016 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008017 }
8018 `
8019
8020 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8021 for _, f := range files {
8022 if f.path == file {
8023 if f.isLink {
8024 t.Errorf("%q is not a real file", file)
8025 }
8026 return
8027 }
8028 }
8029 t.Errorf("%q is not found", file)
8030 }
8031
Jiyong Parkce243632023-02-17 18:22:25 +09008032 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008033 for _, f := range files {
8034 if f.path == file {
8035 if !f.isLink {
8036 t.Errorf("%q is not a symlink", file)
8037 }
Jiyong Parkce243632023-02-17 18:22:25 +09008038 if f.src != target {
8039 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8040 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008041 return
8042 }
8043 }
8044 t.Errorf("%q is not found", file)
8045 }
8046
Jiyong Park9d677202020-02-19 16:29:35 +09008047 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8048 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008049 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008050 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008051 ensureRealfileExists(t, files, "javalib/myjar.jar")
8052 ensureRealfileExists(t, files, "lib64/mylib.so")
8053 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008054 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008055
Jooyung Hana0503a52023-08-23 13:12:50 +09008056 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008057 ensureRealfileExists(t, files, "javalib/myjar.jar")
8058 ensureRealfileExists(t, files, "lib64/mylib.so")
8059 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008060 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008061
8062 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008063 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008064 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008065 ensureRealfileExists(t, files, "javalib/myjar.jar")
8066 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008067 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8068 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008069
Jooyung Hana0503a52023-08-23 13:12:50 +09008070 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008071 ensureRealfileExists(t, files, "javalib/myjar.jar")
8072 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008073 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8074 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008075}
8076
Yo Chiange8128052020-07-23 20:09:18 +08008077func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008078 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008079 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008080 apex {
8081 name: "myapex",
8082 key: "myapex.key",
8083 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008084 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008085 }
8086
8087 apex_key {
8088 name: "myapex.key",
8089 public_key: "testkey.avbpubkey",
8090 private_key: "testkey.pem",
8091 }
8092
8093 cc_library_shared {
8094 name: "mylib",
8095 srcs: ["mylib.cpp"],
8096 shared_libs: ["myotherlib"],
8097 system_shared_libs: [],
8098 stl: "none",
8099 apex_available: [
8100 "myapex",
8101 "//apex_available:platform",
8102 ],
8103 }
8104
8105 cc_prebuilt_library_shared {
8106 name: "myotherlib",
8107 srcs: ["prebuilt.so"],
8108 system_shared_libs: [],
8109 stl: "none",
8110 apex_available: [
8111 "myapex",
8112 "//apex_available:platform",
8113 ],
8114 }
8115 `)
8116
Jooyung Hana0503a52023-08-23 13:12:50 +09008117 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008118 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008119 var builder strings.Builder
8120 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8121 androidMk := builder.String()
8122 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008123 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008124 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8125 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8126 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008127 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008128}
8129
Jooyung Han643adc42020-02-27 13:50:06 +09008130func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008131 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008132 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008133 apex {
8134 name: "myapex",
8135 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008136 binaries: ["mybin"],
8137 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008138 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008139 }
8140
8141 apex_key {
8142 name: "myapex.key",
8143 public_key: "testkey.avbpubkey",
8144 private_key: "testkey.pem",
8145 }
8146
8147 cc_library {
8148 name: "mylib",
8149 srcs: ["mylib.cpp"],
8150 shared_libs: ["mylib2"],
8151 system_shared_libs: [],
8152 stl: "none",
8153 apex_available: [ "myapex" ],
8154 }
8155
8156 cc_library {
8157 name: "mylib2",
8158 srcs: ["mylib.cpp"],
8159 system_shared_libs: [],
8160 stl: "none",
8161 apex_available: [ "myapex" ],
8162 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008163
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008164 // Used as both a JNI library and a regular shared library.
8165 cc_library {
8166 name: "mylib3",
8167 srcs: ["mylib.cpp"],
8168 system_shared_libs: [],
8169 stl: "none",
8170 apex_available: [ "myapex" ],
8171 }
8172
8173 cc_binary {
8174 name: "mybin",
8175 srcs: ["mybin.cpp"],
8176 shared_libs: ["mylib3"],
8177 system_shared_libs: [],
8178 stl: "none",
8179 apex_available: [ "myapex" ],
8180 }
8181
Jiyong Park34d5c332022-02-24 18:02:44 +09008182 rust_ffi_shared {
8183 name: "libfoo.rust",
8184 crate_name: "foo",
8185 srcs: ["foo.rs"],
8186 shared_libs: ["libfoo.shared_from_rust"],
8187 prefer_rlib: true,
8188 apex_available: ["myapex"],
8189 }
8190
8191 cc_library_shared {
8192 name: "libfoo.shared_from_rust",
8193 srcs: ["mylib.cpp"],
8194 system_shared_libs: [],
8195 stl: "none",
8196 stubs: {
8197 versions: ["10", "11", "12"],
8198 },
8199 }
8200
Jooyung Han643adc42020-02-27 13:50:06 +09008201 `)
8202
Jooyung Hana0503a52023-08-23 13:12:50 +09008203 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008204 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008205 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008206 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008207 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008208 "lib64/mylib.so",
8209 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008210 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008211 "lib64/libfoo.rust.so",
8212 "lib64/libc++.so", // auto-added to libfoo.rust by Soong
8213 "lib64/liblog.so", // auto-added to libfoo.rust by Soong
Jooyung Han643adc42020-02-27 13:50:06 +09008214 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008215
8216 // b/220397949
8217 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008218}
8219
Jooyung Han49f67012020-04-17 13:43:10 +09008220func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008221 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008222 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008223 apex {
8224 name: "myapex",
8225 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008226 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008227 }
8228 apex_key {
8229 name: "myapex.key",
8230 public_key: "testkey.avbpubkey",
8231 private_key: "testkey.pem",
8232 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008233 `,
8234 android.FixtureModifyConfig(func(config android.Config) {
8235 delete(config.Targets, android.Android)
8236 config.AndroidCommonTarget = android.Target{}
8237 }),
8238 )
Jooyung Han49f67012020-04-17 13:43:10 +09008239
8240 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8241 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8242 }
8243}
8244
Jiyong Parkbd159612020-02-28 15:22:21 +09008245func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008246 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008247 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008248 apex {
8249 name: "myapex",
8250 key: "myapex.key",
8251 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008252 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008253 }
8254
8255 apex_key {
8256 name: "myapex.key",
8257 public_key: "testkey.avbpubkey",
8258 private_key: "testkey.pem",
8259 }
8260
8261 android_app {
8262 name: "AppFoo",
8263 srcs: ["foo/bar/MyClass.java"],
8264 sdk_version: "none",
8265 system_modules: "none",
8266 apex_available: [ "myapex" ],
8267 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008268 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008269
Jooyung Hana0503a52023-08-23 13:12:50 +09008270 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008271 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008272
8273 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008274 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 +09008275}
8276
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008277func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008278 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008279 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008280 apex {
8281 name: "myapex",
8282 key: "myapex.key",
8283 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008284 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008285 }
8286
8287 apex_key {
8288 name: "myapex.key",
8289 public_key: "testkey.avbpubkey",
8290 private_key: "testkey.pem",
8291 }
8292
8293 android_app_set {
8294 name: "AppSet",
8295 set: "AppSet.apks",
8296 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008297 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008298 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008299 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008300 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8301 s := mod.Rule("apexRule").Args["copy_commands"]
8302 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008303 if len(copyCmds) != 4 {
8304 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008305 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008306 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8307 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008308 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8309 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008310
8311 // Ensure that canned_fs_config has an entry for the app set zip file
8312 generateFsRule := mod.Rule("generateFsConfig")
8313 cmd := generateFsRule.RuleParams.Command
8314 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008315}
8316
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008317func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008318 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008319 apex_set {
8320 name: "myapex",
8321 filename: "foo_v2.apex",
8322 sanitized: {
8323 none: { set: "myapex.apks", },
8324 hwaddress: { set: "myapex.hwasan.apks", },
8325 },
Paul Duffin24704672021-04-06 16:09:30 +01008326 }
8327 `
8328 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008329
Paul Duffin24704672021-04-06 16:09:30 +01008330 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008331 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008332
Spandan Das9d6e2092024-09-21 02:50:00 +00008333 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008334 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008335
Paul Duffin24704672021-04-06 16:09:30 +01008336 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8337
8338 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008339 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8340 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008341
8342 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008343}
8344
Pranav Guptaeba03b02022-09-27 00:27:08 +00008345func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008346 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008347 ctx := testApex(t, `
8348 apex_set {
8349 name: "myapex",
8350 set: ":myapex_apks_file",
8351 }
8352
8353 filegroup {
8354 name: "myapex_apks_file",
8355 srcs: ["myapex.apks"],
8356 }
8357 `)
8358
Spandan Das9d6e2092024-09-21 02:50:00 +00008359 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008360
8361 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008362 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008363 extractedApex := m.Output(extractorOutput)
8364
8365 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8366}
8367
Paul Duffin89f570a2021-06-16 01:42:33 +01008368func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008369 t.Helper()
8370
Paul Duffin55607122021-03-30 23:32:51 +01008371 fs := android.MockFS{
8372 "a.java": nil,
8373 "a.jar": nil,
8374 "apex_manifest.json": nil,
8375 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008376 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008377 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8378 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8379 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008380 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008381 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008382
Paul Duffin55607122021-03-30 23:32:51 +01008383 errorHandler := android.FixtureExpectsNoErrors
8384 if errmsg != "" {
8385 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008386 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008387
Paul Duffin55607122021-03-30 23:32:51 +01008388 result := android.GroupFixturePreparers(
8389 cc.PrepareForTestWithCcDefaultModules,
8390 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008391 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008392 java.PrepareForTestWithJavaSdkLibraryFiles,
8393 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008394 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008395 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008396 android.FixtureModifyMockFS(func(fs android.MockFS) {
8397 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8398 insert := ""
8399 for _, fragment := range fragments {
8400 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8401 }
8402 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8403 platform_bootclasspath {
8404 name: "platform-bootclasspath",
8405 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008406 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008407 %s
8408 ],
8409 }
8410 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008411 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008412 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008413 // Dexpreopt for boot jars requires the ART boot image profile.
8414 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8415 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008416 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008417 ).
8418 ExtendWithErrorHandler(errorHandler).
8419 RunTestWithBp(t, bp)
8420
8421 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008422}
8423
Jooyung Han548640b2020-04-27 12:10:30 +09008424func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008425 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008426 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8427 apex {
8428 name: "myapex",
8429 key: "myapex.key",
8430 updatable: true,
8431 }
8432
8433 apex_key {
8434 name: "myapex.key",
8435 public_key: "testkey.avbpubkey",
8436 private_key: "testkey.pem",
8437 }
8438 `)
8439}
8440
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008441func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008442 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008443 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8444 apex {
8445 name: "myapex",
8446 key: "myapex.key",
8447 }
8448
8449 apex_key {
8450 name: "myapex.key",
8451 public_key: "testkey.avbpubkey",
8452 private_key: "testkey.pem",
8453 }
8454 `)
8455}
8456
satayevb98371c2021-06-15 16:49:50 +01008457func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008458 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008459 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8460 apex {
8461 name: "myapex",
8462 key: "myapex.key",
8463 systemserverclasspath_fragments: [
8464 "mysystemserverclasspathfragment",
8465 ],
8466 min_sdk_version: "29",
8467 updatable: true,
8468 }
8469
8470 apex_key {
8471 name: "myapex.key",
8472 public_key: "testkey.avbpubkey",
8473 private_key: "testkey.pem",
8474 }
8475
8476 java_library {
8477 name: "foo",
8478 srcs: ["b.java"],
8479 min_sdk_version: "29",
8480 installable: true,
8481 apex_available: [
8482 "myapex",
8483 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008484 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008485 }
8486
8487 systemserverclasspath_fragment {
8488 name: "mysystemserverclasspathfragment",
8489 generate_classpaths_proto: false,
8490 contents: [
8491 "foo",
8492 ],
8493 apex_available: [
8494 "myapex",
8495 ],
8496 }
satayevabcd5972021-08-06 17:49:46 +01008497 `,
8498 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8499 )
satayevb98371c2021-06-15 16:49:50 +01008500}
8501
Paul Duffin064b70c2020-11-02 17:32:38 +00008502func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008503 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008504 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008505 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008506 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008507 fragment := java.ApexVariantReference{
8508 Apex: proptools.StringPtr("myapex"),
8509 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8510 }
8511
Paul Duffin064b70c2020-11-02 17:32:38 +00008512 testDexpreoptWithApexes(t, `
8513 prebuilt_apex {
8514 name: "myapex" ,
8515 arch: {
8516 arm64: {
8517 src: "myapex-arm64.apex",
8518 },
8519 arm: {
8520 src: "myapex-arm.apex",
8521 },
8522 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008523 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8524 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008525
Paul Duffin89f570a2021-06-16 01:42:33 +01008526 prebuilt_bootclasspath_fragment {
8527 name: "my-bootclasspath-fragment",
8528 contents: ["libfoo"],
8529 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008530 hidden_api: {
8531 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8532 metadata: "my-bootclasspath-fragment/metadata.csv",
8533 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008534 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8535 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8536 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008537 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008538 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008539
Spandan Das52c01a12024-09-20 01:09:48 +00008540 java_sdk_library_import {
8541 name: "libfoo",
8542 prefer: true,
8543 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008544 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008545 },
8546 apex_available: ["myapex"],
8547 shared_library: false,
8548 permitted_packages: ["libfoo"],
8549 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008550 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008551 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008552}
8553
Spandan Dasf14e2542021-11-12 00:01:37 +00008554func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008555 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008556 bp += `
8557 apex_key {
8558 name: "myapex.key",
8559 public_key: "testkey.avbpubkey",
8560 private_key: "testkey.pem",
8561 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008562 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008563 "lib1/src/A.java": nil,
8564 "lib2/src/B.java": nil,
8565 "system/sepolicy/apex/myapex-file_contexts": nil,
8566 }
8567
Paul Duffin45338f02021-03-30 23:07:52 +01008568 errorHandler := android.FixtureExpectsNoErrors
8569 if errmsg != "" {
8570 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008571 }
Colin Crossae8600b2020-10-29 17:09:13 -07008572
Paul Duffin45338f02021-03-30 23:07:52 +01008573 android.GroupFixturePreparers(
8574 android.PrepareForTestWithAndroidBuildComponents,
8575 java.PrepareForTestWithJavaBuildComponents,
8576 PrepareForTestWithApexBuildComponents,
8577 android.PrepareForTestWithNeverallowRules(rules),
8578 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008579 apexBootJars := make([]string, 0, len(bootJars))
8580 for _, apexBootJar := range bootJars {
8581 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008582 }
satayevd604b212021-07-21 14:23:52 +01008583 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008584 }),
8585 fs.AddToFixture(),
8586 ).
8587 ExtendWithErrorHandler(errorHandler).
8588 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008589}
8590
8591func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008592 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008593 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008594 name string
8595 expectedError string
8596 bp string
8597 bootJars []string
8598 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008599 }{
8600
8601 {
8602 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8603 expectedError: "",
8604 bp: `
8605 java_library {
8606 name: "bcp_lib1",
8607 srcs: ["lib1/src/*.java"],
8608 permitted_packages: ["foo.bar"],
8609 apex_available: ["myapex"],
8610 sdk_version: "none",
8611 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008612 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008613 }
8614 java_library {
8615 name: "nonbcp_lib2",
8616 srcs: ["lib2/src/*.java"],
8617 apex_available: ["myapex"],
8618 permitted_packages: ["a.b"],
8619 sdk_version: "none",
8620 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008621 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008622 }
8623 apex {
8624 name: "myapex",
8625 key: "myapex.key",
8626 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008627 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008628 }`,
8629 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008630 bcpPermittedPackages: map[string][]string{
8631 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008632 "foo.bar",
8633 },
8634 },
8635 },
8636 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008637 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008638 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 +01008639 bp: `
8640 java_library {
8641 name: "bcp_lib1",
8642 srcs: ["lib1/src/*.java"],
8643 apex_available: ["myapex"],
8644 permitted_packages: ["foo.bar"],
8645 sdk_version: "none",
8646 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008647 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008648 }
8649 java_library {
8650 name: "bcp_lib2",
8651 srcs: ["lib2/src/*.java"],
8652 apex_available: ["myapex"],
8653 permitted_packages: ["foo.bar", "bar.baz"],
8654 sdk_version: "none",
8655 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008656 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008657 }
8658 apex {
8659 name: "myapex",
8660 key: "myapex.key",
8661 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008662 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008663 }
8664 `,
8665 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008666 bcpPermittedPackages: map[string][]string{
8667 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008668 "foo.bar",
8669 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008670 "bcp_lib2": []string{
8671 "foo.bar",
8672 },
8673 },
8674 },
8675 {
8676 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8677 expectedError: "",
8678 bp: `
8679 java_library {
8680 name: "bcp_lib_restricted",
8681 srcs: ["lib1/src/*.java"],
8682 apex_available: ["myapex"],
8683 permitted_packages: ["foo.bar"],
8684 sdk_version: "none",
8685 min_sdk_version: "29",
8686 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008687 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008688 }
8689 java_library {
8690 name: "bcp_lib_unrestricted",
8691 srcs: ["lib2/src/*.java"],
8692 apex_available: ["myapex"],
8693 permitted_packages: ["foo.bar", "bar.baz"],
8694 sdk_version: "none",
8695 min_sdk_version: "29",
8696 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008697 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008698 }
8699 apex {
8700 name: "myapex",
8701 key: "myapex.key",
8702 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8703 updatable: true,
8704 min_sdk_version: "29",
8705 }
8706 `,
8707 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8708 bcpPermittedPackages: map[string][]string{
8709 "bcp_lib1_non_updateable": []string{
8710 "foo.bar",
8711 },
8712 // 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 +01008713 },
8714 },
8715 }
8716 for _, tc := range testcases {
8717 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008718 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00008719 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
8720 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01008721 })
8722 }
8723}
8724
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008725// TODO(jungjw): Move this to proptools
8726func intPtr(i int) *int {
8727 return &i
8728}
8729
8730func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008731 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008732 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008733 apex_set {
8734 name: "myapex",
8735 set: "myapex.apks",
8736 filename: "foo_v2.apex",
8737 overrides: ["foo"],
8738 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008739 `,
8740 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
8741 variables.Platform_sdk_version = intPtr(30)
8742 }),
8743 android.FixtureModifyConfig(func(config android.Config) {
8744 config.Targets[android.Android] = []android.Target{
8745 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
8746 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
8747 }
8748 }),
8749 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008750
Spandan Das9d6e2092024-09-21 02:50:00 +00008751 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008752
8753 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01008754 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008755 actual := extractedApex.Args["abis"]
8756 expected := "ARMEABI_V7A,ARM64_V8A"
8757 if actual != expected {
8758 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8759 }
8760 actual = extractedApex.Args["sdk-version"]
8761 expected = "30"
8762 if actual != expected {
8763 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
8764 }
8765
Paul Duffin6717d882021-06-15 19:09:41 +01008766 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008767 a := m.Module().(*ApexSet)
8768 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07008769 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07008770 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
8771 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
8772 }
8773}
8774
Anton Hansson805e0a52022-11-25 14:06:46 +00008775func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008776 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00008777 ctx := testApex(t, `
8778 apex_set {
8779 name: "myapex",
8780 set: "myapex.apks",
8781 filename: "foo_v2.apex",
8782 overrides: ["foo"],
8783 }
8784 `,
8785 android.FixtureModifyConfig(func(config android.Config) {
8786 config.Targets[android.Android] = []android.Target{
8787 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
8788 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
8789 }
8790 }),
8791 )
8792
Spandan Das9d6e2092024-09-21 02:50:00 +00008793 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00008794
8795 // Check extract_apks tool parameters. No native bridge arch expected
8796 extractedApex := m.Output("extracted/myapex.apks")
8797 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
8798}
8799
Jiyong Park7d95a512020-05-10 15:16:24 +09008800func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008801 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09008802 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
8803 apex {
8804 name: "myapex",
8805 key: "myapex.key",
8806 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008807 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09008808 }
8809
8810 apex_key {
8811 name: "myapex.key",
8812 public_key: "testkey.avbpubkey",
8813 private_key: "testkey.pem",
8814 }
8815
8816 cc_library {
8817 name: "mylib",
8818 srcs: ["mylib.cpp"],
8819 static_libs: ["otherlib"],
8820 system_shared_libs: [],
8821 stl: "none",
8822 apex_available: [ "myapex" ],
8823 }
8824
8825 cc_library {
8826 name: "otherlib",
8827 srcs: ["mylib.cpp"],
8828 system_shared_libs: [],
8829 stl: "none",
8830 stubs: {
8831 versions: ["1", "2", "3"],
8832 },
8833 apex_available: [ "myapex" ],
8834 }
8835 `)
8836}
8837
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008838func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008839 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008840 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008841 apex {
8842 name: "myapex",
8843 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008844 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09008845 custom_sign_tool: "sign_myapex",
8846 }
8847
8848 apex_key {
8849 name: "myapex.key",
8850 public_key: "testkey.avbpubkey",
8851 private_key: "testkey.pem",
8852 }
8853 `)
8854
Jooyung Han286957d2023-10-30 16:17:56 +09008855 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07008856 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008857 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 +09008858}
8859
8860func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008861 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09008862 ctx := testApex(t, `
8863 apex {
8864 name: "myapex",
8865 key: "myapex.key",
8866 updatable: false,
8867 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008868 }
8869
8870 apex_key {
8871 name: "myapex.key",
8872 public_key: "testkey.avbpubkey",
8873 private_key: "testkey.pem",
8874 }
8875
8876 prebuilt_apex {
8877 name: "myapex",
8878 prefer: true,
8879 arch: {
8880 arm64: {
8881 src: "myapex-arm64.apex",
8882 },
8883 arm: {
8884 src: "myapex-arm.apex",
8885 },
8886 },
8887 }
8888
8889 apex_set {
8890 name: "myapex_set",
8891 set: "myapex.apks",
8892 filename: "myapex_set.apex",
8893 overrides: ["myapex"],
8894 }
8895 `)
8896
Colin Crossf61d03d2023-11-02 16:56:39 -07008897 content := android.ContentFromFileRuleForTests(t, ctx,
8898 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09008899 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 -07008900 content = android.ContentFromFileRuleForTests(t, ctx,
8901 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09008902 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 +09008903}
8904
Jooyung Han938b5932020-06-20 12:47:47 +09008905func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008906 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008907 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09008908 apex {
8909 name: "myapex",
8910 key: "myapex.key",
8911 apps: ["app"],
8912 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008913 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09008914 }
8915
8916 apex_key {
8917 name: "myapex.key",
8918 public_key: "testkey.avbpubkey",
8919 private_key: "testkey.pem",
8920 }
8921
8922 android_app {
8923 name: "app",
8924 srcs: ["foo/bar/MyClass.java"],
8925 package_name: "foo",
8926 sdk_version: "none",
8927 system_modules: "none",
8928 apex_available: [ "myapex" ],
8929 }
8930 `, withFiles(map[string][]byte{
8931 "sub/Android.bp": []byte(`
8932 override_apex {
8933 name: "override_myapex",
8934 base: "myapex",
8935 apps: ["override_app"],
8936 allowed_files: ":allowed",
8937 }
8938 // Overridable "path" property should be referenced indirectly
8939 filegroup {
8940 name: "allowed",
8941 srcs: ["allowed.txt"],
8942 }
8943 override_android_app {
8944 name: "override_app",
8945 base: "app",
8946 package_name: "bar",
8947 }
8948 `),
8949 }))
8950
Jooyung Hana0503a52023-08-23 13:12:50 +09008951 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008952 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
8953 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8954 }
8955
Spandan Das50801e22024-05-13 18:29:45 +00008956 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09008957 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
8958 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
8959 }
8960}
8961
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008962func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008963 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008964 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008965 apex {
8966 name: "myapex",
8967 key: "myapex.key",
8968 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008969 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008970 }
8971
8972 apex_key {
8973 name: "myapex.key",
8974 public_key: "testkey.avbpubkey",
8975 private_key: "testkey.pem",
8976 }
8977
8978 cc_library {
8979 name: "mylib",
8980 srcs: ["mylib.cpp"],
8981 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008982 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008983 },
8984 apex_available: ["myapex"],
8985 }
8986
8987 cc_prebuilt_library_shared {
8988 name: "mylib",
8989 prefer: false,
8990 srcs: ["prebuilt.so"],
8991 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07008992 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01008993 },
8994 apex_available: ["myapex"],
8995 }
8996 `)
8997}
8998
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00008999func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009000 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009001 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009002 apex {
9003 name: "myapex",
9004 key: "myapex.key",
9005 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009006 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009007 }
9008 apex_key {
9009 name: "myapex.key",
9010 public_key: "testkey.avbpubkey",
9011 private_key: "testkey.pem",
9012 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009013 `,
9014 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9015 variables.CompressedApex = proptools.BoolPtr(true)
9016 }),
9017 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009018
Jooyung Hana0503a52023-08-23 13:12:50 +09009019 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009020 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9021
Jooyung Hana0503a52023-08-23 13:12:50 +09009022 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009023 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9024
9025 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009026 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009027 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9028
9029 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009030 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009031 var builder strings.Builder
9032 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9033 androidMk := builder.String()
9034 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9035}
9036
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009037func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9038 t.Parallel()
9039 ctx := testApex(t, `
9040 apex {
9041 name: "myapex",
9042 key: "myapex.key",
9043 compressible: true,
9044 updatable: false,
9045 payload_fs_type: "erofs",
9046 }
9047 apex_key {
9048 name: "myapex.key",
9049 public_key: "testkey.avbpubkey",
9050 private_key: "testkey.pem",
9051 }
9052 `,
9053 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9054 variables.CompressedApex = proptools.BoolPtr(true)
9055 }),
9056 )
9057
9058 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9059 if compressRule.Rule != nil {
9060 t.Error("erofs apex should not be compressed")
9061 }
9062}
9063
Jooyung Han26ec8482024-07-31 15:04:05 +09009064func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009065 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009066 for _, compressionEnabled := range []bool{true, false} {
9067 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009068 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009069 ctx := testApex(t, `
9070 apex_set {
9071 name: "com.company.android.myapex",
9072 apex_name: "com.android.myapex",
9073 set: "company-myapex.apks",
9074 }
9075 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9076 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9077 }),
9078 )
9079
9080 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9081 if compressionEnabled {
9082 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9083 } else {
9084 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9085 }
9086 })
9087 }
9088}
9089
Martin Stjernholm2856c662020-12-02 15:03:42 +00009090func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009091 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009092 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009093 apex {
9094 name: "myapex",
9095 key: "myapex.key",
9096 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009097 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009098 }
9099
9100 apex_key {
9101 name: "myapex.key",
9102 public_key: "testkey.avbpubkey",
9103 private_key: "testkey.pem",
9104 }
9105
9106 cc_library {
9107 name: "mylib",
9108 srcs: ["mylib.cpp"],
9109 apex_available: ["myapex"],
9110 shared_libs: ["otherlib"],
9111 system_shared_libs: [],
9112 }
9113
9114 cc_library {
9115 name: "otherlib",
9116 srcs: ["mylib.cpp"],
9117 stubs: {
9118 versions: ["current"],
9119 },
9120 }
9121
9122 cc_prebuilt_library_shared {
9123 name: "otherlib",
9124 prefer: true,
9125 srcs: ["prebuilt.so"],
9126 stubs: {
9127 versions: ["current"],
9128 },
9129 }
9130 `)
9131
Jooyung Hana0503a52023-08-23 13:12:50 +09009132 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009133 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009134 var builder strings.Builder
9135 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9136 androidMk := builder.String()
9137
9138 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9139 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009140 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009141}
9142
Jiyong Parke3867542020-12-03 17:28:25 +09009143func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009144 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009145 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009146 apex {
9147 name: "myapex",
9148 key: "myapex.key",
9149 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009150 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009151 }
9152
9153 apex_key {
9154 name: "myapex.key",
9155 public_key: "testkey.avbpubkey",
9156 private_key: "testkey.pem",
9157 }
9158
9159 cc_library {
9160 name: "mylib",
9161 srcs: ["mylib.cpp"],
9162 system_shared_libs: [],
9163 stl: "none",
9164 apex_available: ["myapex"],
9165 shared_libs: ["mylib2"],
9166 target: {
9167 apex: {
9168 exclude_shared_libs: ["mylib2"],
9169 },
9170 },
9171 }
9172
9173 cc_library {
9174 name: "mylib2",
9175 srcs: ["mylib.cpp"],
9176 system_shared_libs: [],
9177 stl: "none",
9178 }
9179 `)
9180
9181 // Check if mylib is linked to mylib2 for the non-apex target
9182 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9183 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9184
9185 // Make sure that the link doesn't occur for the apex target
9186 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9187 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9188
9189 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009190 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009191 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9192}
9193
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009194func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009195 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009196 bpBase := `
9197 apex {
9198 name: "myapex",
9199 key: "myapex.key",
9200 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009201 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009202 }
9203 apex_key {
9204 name: "myapex.key",
9205 public_key: "testkey.avbpubkey",
9206 private_key: "testkey.pem",
9207 }
9208 cc_library {
9209 name: "mylib",
9210 srcs: ["mylib.cpp"],
9211 apex_available: ["myapex"],
9212 shared_libs: ["stublib"],
9213 system_shared_libs: [],
9214 }
9215 apex {
9216 name: "otherapex",
9217 enabled: %s,
9218 key: "myapex.key",
9219 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009220 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009221 }
9222 `
9223
9224 stublibSourceBp := `
9225 cc_library {
9226 name: "stublib",
9227 srcs: ["mylib.cpp"],
9228 apex_available: ["otherapex"],
9229 system_shared_libs: [],
9230 stl: "none",
9231 stubs: {
9232 versions: ["1"],
9233 },
9234 }
9235 `
9236
9237 stublibPrebuiltBp := `
9238 cc_prebuilt_library_shared {
9239 name: "stublib",
9240 srcs: ["prebuilt.so"],
9241 apex_available: ["otherapex"],
9242 stubs: {
9243 versions: ["1"],
9244 },
9245 %s
9246 }
9247 `
9248
9249 tests := []struct {
9250 name string
9251 stublibBp string
9252 usePrebuilt bool
9253 modNames []string // Modules to collect AndroidMkEntries for
9254 otherApexEnabled []string
9255 }{
9256 {
9257 name: "only_source",
9258 stublibBp: stublibSourceBp,
9259 usePrebuilt: false,
9260 modNames: []string{"stublib"},
9261 otherApexEnabled: []string{"true", "false"},
9262 },
9263 {
9264 name: "source_preferred",
9265 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9266 usePrebuilt: false,
9267 modNames: []string{"stublib", "prebuilt_stublib"},
9268 otherApexEnabled: []string{"true", "false"},
9269 },
9270 {
9271 name: "prebuilt_preferred",
9272 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9273 usePrebuilt: true,
9274 modNames: []string{"stublib", "prebuilt_stublib"},
9275 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9276 },
9277 {
9278 name: "only_prebuilt",
9279 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9280 usePrebuilt: true,
9281 modNames: []string{"stublib"},
9282 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9283 },
9284 }
9285
9286 for _, test := range tests {
9287 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009288 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009289 for _, otherApexEnabled := range test.otherApexEnabled {
9290 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009291 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009292 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009293
9294 type modAndMkEntries struct {
9295 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009296 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009297 }
9298 entries := []*modAndMkEntries{}
9299
9300 // Gather shared lib modules that are installable
9301 for _, modName := range test.modNames {
9302 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9303 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9304 continue
9305 }
9306 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009307 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009308 continue
9309 }
Yu Liue70976d2024-10-15 20:45:35 +00009310 info := android.AndroidMkInfoForTest(t, ctx, mod)
9311 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9312 ents = append(ents, info.ExtraInfo...)
9313 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009314 if ent.Disabled {
9315 continue
9316 }
9317 entries = append(entries, &modAndMkEntries{
9318 mod: mod,
9319 mkEntries: ent,
9320 })
9321 }
9322 }
9323 }
9324
9325 var entry *modAndMkEntries = nil
9326 for _, ent := range entries {
9327 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9328 if entry != nil {
9329 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9330 } else {
9331 entry = ent
9332 }
9333 }
9334 }
9335
9336 if entry == nil {
9337 t.Errorf("AndroidMk entry for \"stublib\" missing")
9338 } else {
9339 isPrebuilt := entry.mod.Prebuilt() != nil
9340 if isPrebuilt != test.usePrebuilt {
9341 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9342 }
9343 if !entry.mod.IsStubs() {
9344 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9345 }
9346 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9347 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9348 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009349 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009350 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009351 if !android.InList(expected, cflags) {
9352 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9353 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009354 }
9355 })
9356 }
9357 })
9358 }
9359}
9360
Colin Crossc33e5212021-05-25 18:16:02 -07009361func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009362 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009363 bp := `
9364 apex {
9365 name: "myapex",
9366 key: "myapex.key",
9367 java_libs: ["mylib"],
9368 bootclasspath_fragments: ["mybootclasspathfragment"],
9369 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9370 updatable: false,
9371 }
9372
9373 apex_key {
9374 name: "myapex.key",
9375 public_key: "testkey.avbpubkey",
9376 private_key: "testkey.pem",
9377 }
9378
9379 java_library {
9380 name: "mylib",
9381 srcs: ["mylib.java"],
9382 apex_available: ["myapex"],
9383 compile_dex: true,
9384 }
9385
9386 bootclasspath_fragment {
9387 name: "mybootclasspathfragment",
9388 contents: ["mybootclasspathlib"],
9389 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009390 hidden_api: {
9391 split_packages: ["*"],
9392 },
Colin Crossc33e5212021-05-25 18:16:02 -07009393 }
9394
9395 java_library {
9396 name: "mybootclasspathlib",
9397 srcs: ["mybootclasspathlib.java"],
9398 apex_available: ["myapex"],
9399 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009400 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009401 }
9402
9403 systemserverclasspath_fragment {
9404 name: "mysystemserverclasspathfragment",
9405 contents: ["mysystemserverclasspathlib"],
9406 apex_available: ["myapex"],
9407 }
9408
9409 java_library {
9410 name: "mysystemserverclasspathlib",
9411 srcs: ["mysystemserverclasspathlib.java"],
9412 apex_available: ["myapex"],
9413 compile_dex: true,
9414 }
9415 `
9416
9417 result := android.GroupFixturePreparers(
9418 PrepareForTestWithApexBuildComponents,
9419 prepareForTestWithMyapex,
9420 java.PrepareForTestWithJavaDefaultModules,
9421 android.PrepareForTestWithAndroidBuildComponents,
9422 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009423 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9424 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009425 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009426 ).RunTest(t)
9427
9428 // Make sure jacoco ran on both mylib and mybootclasspathlib
9429 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9430 t.Errorf("Failed to find jacoco rule for mylib")
9431 }
9432 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9433 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9434 }
9435 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9436 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9437 }
9438}
9439
Jiyong Park192600a2021-08-03 07:52:17 +00009440func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009441 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009442 testApexError(t, `executable mybin is static`, `
9443 apex {
9444 name: "myapex",
9445 key: "myapex.key",
9446 binaries: ["mybin"],
9447 min_sdk_version: "29",
9448 }
9449
9450 apex_key {
9451 name: "myapex.key",
9452 public_key: "testkey.avbpubkey",
9453 private_key: "testkey.pem",
9454 }
9455
9456 cc_binary {
9457 name: "mybin",
9458 srcs: ["mylib.cpp"],
9459 relative_install_path: "foo/bar",
9460 static_executable: true,
9461 system_shared_libs: [],
9462 stl: "none",
9463 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009464 min_sdk_version: "29",
9465 }
9466 `)
9467
9468 testApexError(t, `executable mybin.rust is static`, `
9469 apex {
9470 name: "myapex",
9471 key: "myapex.key",
9472 binaries: ["mybin.rust"],
9473 min_sdk_version: "29",
9474 }
9475
9476 apex_key {
9477 name: "myapex.key",
9478 public_key: "testkey.avbpubkey",
9479 private_key: "testkey.pem",
9480 }
9481
9482 rust_binary {
9483 name: "mybin.rust",
9484 srcs: ["foo.rs"],
9485 static_executable: true,
9486 apex_available: ["myapex"],
9487 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009488 }
9489 `)
9490}
9491
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009492func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009493 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009494 ctx := testApex(t, `
9495 apex {
9496 name: "myapex",
9497 key: "myapex.key",
9498 updatable: false,
9499 java_libs: ["foo"],
9500 }
9501
9502 apex_key {
9503 name: "myapex.key",
9504 public_key: "testkey.avbpubkey",
9505 private_key: "testkey.pem",
9506 }
9507
9508 java_library {
9509 name: "foo",
9510 srcs: ["foo.java"],
9511 apex_available: ["myapex"],
9512 installable: true,
9513 }
9514 `,
9515 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9516 )
9517
Jooyung Hana0503a52023-08-23 13:12:50 +09009518 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009519 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9520 var builder strings.Builder
9521 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9522 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009523 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 +00009524}
9525
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009526func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009527 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009528 ctx := testApex(t, `
9529 apex {
9530 name: "myapex",
9531 key: "myapex.key",
9532 updatable: false,
9533 java_libs: ["foo"],
9534 required: ["otherapex"],
9535 }
9536
9537 apex {
9538 name: "otherapex",
9539 key: "myapex.key",
9540 updatable: false,
9541 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009542 }
9543
9544 apex_key {
9545 name: "myapex.key",
9546 public_key: "testkey.avbpubkey",
9547 private_key: "testkey.pem",
9548 }
9549
9550 java_library {
9551 name: "foo",
9552 srcs: ["foo.java"],
9553 apex_available: ["myapex", "otherapex"],
9554 installable: true,
9555 }
9556 `)
9557
Jooyung Hana0503a52023-08-23 13:12:50 +09009558 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009559 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9560 var builder strings.Builder
9561 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9562 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009563 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009564}
9565
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009566func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009567 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009568 ctx := testApex(t, `
9569 apex {
9570 name: "myapex",
9571 key: "myapex.key",
9572 updatable: false,
9573 }
9574
9575 apex_key {
9576 name: "myapex.key",
9577 public_key: "testkey.avbpubkey",
9578 private_key: "testkey.pem",
9579 }
9580 `)
9581
Jooyung Hana0503a52023-08-23 13:12:50 +09009582 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009583 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009584 data := android.AndroidMkDataForTest(t, ctx, bundle)
9585 var builder strings.Builder
9586 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9587 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009588 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009589}
9590
Jooyung Hana6d36672022-02-24 13:58:07 +09009591func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009592 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009593 for _, tc := range []struct {
9594 name string
9595 ref string
9596 expected_data []string
9597 }{
9598 {
9599 name: "test_using_output",
9600 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009601 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009602 },
9603 {
9604 name: "test_using_apex",
9605 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009606 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009607 },
9608 } {
9609 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009610 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009611 ctx := testApex(t, `
9612 apex {
9613 name: "myapex",
9614 key: "myapex.key",
9615 compressible: true,
9616 updatable: false,
9617 }
9618
9619 apex_key {
9620 name: "myapex.key",
9621 public_key: "testkey.avbpubkey",
9622 private_key: "testkey.pem",
9623 }
9624
9625 java_test {
9626 name: "`+tc.name+`",
9627 srcs: ["a.java"],
9628 data: ["`+tc.ref+`"],
9629 }
9630 `,
9631 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9632 variables.CompressedApex = proptools.BoolPtr(true)
9633 }))
9634 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9635 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9636 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9637 })
9638 }
9639}
9640
satayev758968a2021-12-06 11:42:40 +00009641func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009642 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009643 preparer := android.GroupFixturePreparers(
9644 PrepareForTestWithApexBuildComponents,
9645 prepareForTestWithMyapex,
9646 java.PrepareForTestWithJavaSdkLibraryFiles,
9647 java.PrepareForTestWithJavaDefaultModules,
9648 android.PrepareForTestWithAndroidBuildComponents,
9649 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9650 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9651 )
9652
9653 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9654 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009655 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009656 preparer.RunTestWithBp(t, `
9657 apex {
9658 name: "myapex",
9659 key: "myapex.key",
9660 bootclasspath_fragments: ["mybootclasspathfragment"],
9661 min_sdk_version: "30",
9662 updatable: false,
9663 }
9664
9665 apex_key {
9666 name: "myapex.key",
9667 public_key: "testkey.avbpubkey",
9668 private_key: "testkey.pem",
9669 }
9670
9671 bootclasspath_fragment {
9672 name: "mybootclasspathfragment",
9673 contents: ["mybootclasspathlib"],
9674 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009675 hidden_api: {
9676 split_packages: ["*"],
9677 },
satayev758968a2021-12-06 11:42:40 +00009678 }
9679
9680 java_sdk_library {
9681 name: "mybootclasspathlib",
9682 srcs: ["mybootclasspathlib.java"],
9683 apex_available: ["myapex"],
9684 compile_dex: true,
9685 unsafe_ignore_missing_latest_api: true,
9686 min_sdk_version: "31",
9687 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009688 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009689 }
9690
9691 java_library {
9692 name: "util",
9693 srcs: ["a.java"],
9694 apex_available: ["myapex"],
9695 min_sdk_version: "31",
9696 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009697 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009698 }
9699
9700 java_library {
9701 name: "another_util",
9702 srcs: ["a.java"],
9703 min_sdk_version: "31",
9704 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009705 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009706 }
9707 `)
9708 })
9709
9710 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
9711 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009712 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009713 preparer.RunTestWithBp(t, `
9714 apex {
9715 name: "myapex",
9716 key: "myapex.key",
9717 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9718 min_sdk_version: "30",
9719 updatable: false,
9720 }
9721
9722 apex_key {
9723 name: "myapex.key",
9724 public_key: "testkey.avbpubkey",
9725 private_key: "testkey.pem",
9726 }
9727
9728 systemserverclasspath_fragment {
9729 name: "mysystemserverclasspathfragment",
9730 contents: ["mysystemserverclasspathlib"],
9731 apex_available: ["myapex"],
9732 }
9733
9734 java_sdk_library {
9735 name: "mysystemserverclasspathlib",
9736 srcs: ["mysystemserverclasspathlib.java"],
9737 apex_available: ["myapex"],
9738 compile_dex: true,
9739 min_sdk_version: "32",
9740 unsafe_ignore_missing_latest_api: true,
9741 static_libs: ["util"],
9742 }
9743
9744 java_library {
9745 name: "util",
9746 srcs: ["a.java"],
9747 apex_available: ["myapex"],
9748 min_sdk_version: "31",
9749 static_libs: ["another_util"],
9750 }
9751
9752 java_library {
9753 name: "another_util",
9754 srcs: ["a.java"],
9755 min_sdk_version: "31",
9756 apex_available: ["myapex"],
9757 }
9758 `)
9759 })
9760
9761 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009762 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +00009763 preparer.
satayev758968a2021-12-06 11:42:40 +00009764 RunTestWithBp(t, `
9765 apex {
9766 name: "myapex",
9767 key: "myapex.key",
9768 bootclasspath_fragments: ["mybootclasspathfragment"],
9769 min_sdk_version: "30",
9770 updatable: false,
9771 }
9772
9773 apex_key {
9774 name: "myapex.key",
9775 public_key: "testkey.avbpubkey",
9776 private_key: "testkey.pem",
9777 }
9778
9779 bootclasspath_fragment {
9780 name: "mybootclasspathfragment",
9781 contents: ["mybootclasspathlib"],
9782 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009783 hidden_api: {
9784 split_packages: ["*"],
9785 },
satayev758968a2021-12-06 11:42:40 +00009786 }
9787
9788 java_sdk_library {
9789 name: "mybootclasspathlib",
9790 srcs: ["mybootclasspathlib.java"],
9791 apex_available: ["myapex"],
9792 compile_dex: true,
9793 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009794 sdk_version: "current",
9795 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +00009796 }
9797 `)
9798 })
9799
9800 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009801 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009802 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
9803 RunTestWithBp(t, `
9804 apex {
9805 name: "myapex",
9806 key: "myapex.key",
9807 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9808 min_sdk_version: "30",
9809 updatable: false,
9810 }
9811
9812 apex_key {
9813 name: "myapex.key",
9814 public_key: "testkey.avbpubkey",
9815 private_key: "testkey.pem",
9816 }
9817
9818 systemserverclasspath_fragment {
9819 name: "mysystemserverclasspathfragment",
9820 contents: ["mysystemserverclasspathlib"],
9821 apex_available: ["myapex"],
9822 }
9823
9824 java_sdk_library {
9825 name: "mysystemserverclasspathlib",
9826 srcs: ["mysystemserverclasspathlib.java"],
9827 apex_available: ["myapex"],
9828 compile_dex: true,
9829 unsafe_ignore_missing_latest_api: true,
9830 }
9831 `)
9832 })
9833}
9834
Jiakai Zhang6decef92022-01-12 17:56:19 +00009835// Verifies that the APEX depends on all the Make modules in the list.
9836func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9837 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9838 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009839 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009840 }
9841}
9842
9843// Verifies that the APEX does not depend on any of the Make modules in the list.
9844func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
9845 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
9846 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +00009847 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +00009848 }
9849}
9850
Cole Faust24e25c02024-01-19 14:12:17 -08009851func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009852 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009853 bpTemplate := `
9854 apex {
9855 name: "myapex",
9856 key: "myapex.key",
9857 java_libs: ["myjavalib"],
9858 updatable: %v,
9859 min_sdk_version: "29",
9860 }
9861 apex_key {
9862 name: "myapex.key",
9863 }
9864 java_library {
9865 name: "myjavalib",
9866 srcs: ["MyClass.java"],
9867 apex_available: [ "myapex" ],
9868 lint: {
9869 strict_updatability_linting: %v,
9870 %s
9871 },
9872 sdk_version: "current",
9873 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08009874 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009875 }
9876 `
9877 fs := android.MockFS{
9878 "lint-baseline.xml": nil,
9879 }
9880
9881 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -07009882 testCaseName string
9883 apexUpdatable bool
9884 javaStrictUpdtabilityLint bool
9885 lintFileExists bool
9886 disallowedFlagExpectedOnApex bool
9887 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -08009888 }{
9889 {
Colin Cross87427352024-09-25 15:41:19 -07009890 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
9891 apexUpdatable: true,
9892 javaStrictUpdtabilityLint: true,
9893 lintFileExists: false,
9894 disallowedFlagExpectedOnApex: false,
9895 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009896 },
9897 {
Colin Cross87427352024-09-25 15:41:19 -07009898 testCaseName: "non-updatable apex respects strict_updatability of javalib",
9899 apexUpdatable: false,
9900 javaStrictUpdtabilityLint: false,
9901 lintFileExists: true,
9902 disallowedFlagExpectedOnApex: false,
9903 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009904 },
9905 {
Colin Cross87427352024-09-25 15:41:19 -07009906 testCaseName: "non-updatable apex respects strict updatability of javalib",
9907 apexUpdatable: false,
9908 javaStrictUpdtabilityLint: true,
9909 lintFileExists: true,
9910 disallowedFlagExpectedOnApex: false,
9911 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -08009912 },
9913 {
Colin Cross87427352024-09-25 15:41:19 -07009914 testCaseName: "updatable apex checks strict updatability of javalib",
9915 apexUpdatable: true,
9916 javaStrictUpdtabilityLint: false,
9917 lintFileExists: true,
9918 disallowedFlagExpectedOnApex: true,
9919 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -08009920 },
9921 }
9922
9923 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -07009924 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009925 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -07009926 fixtures := []android.FixturePreparer{}
9927 baselineProperty := ""
9928 if testCase.lintFileExists {
9929 fixtures = append(fixtures, fs.AddToFixture())
9930 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
9931 }
9932 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -08009933
Colin Cross87427352024-09-25 15:41:19 -07009934 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -08009935
Colin Cross87427352024-09-25 15:41:19 -07009936 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
9937 if expectStrictUpdatability {
9938 if m.Rule == nil {
9939 t.Errorf("expected strict updatability check rule on %s", name)
9940 } else {
9941 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
9942 m.RuleParams.Command, "--disallowed_issues NewApi")
9943 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
9944 m.Inputs.Strings(), "lint-baseline.xml")
9945 }
9946 } else {
9947 if m.Rule != nil {
9948 t.Errorf("expected no strict updatability check rule on %s", name)
9949 }
9950 }
9951 }
9952
9953 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
9954 apex := result.ModuleForTests("myapex", "android_common_myapex")
9955 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
9956 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
9957
9958 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
9959 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
9960 })
Cole Faust24e25c02024-01-19 14:12:17 -08009961 }
9962}
9963
Cole Faust24e25c02024-01-19 14:12:17 -08009964// checks transtive deps of an apex coming from bootclasspath_fragment
9965func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009966 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -08009967 bp := `
9968 apex {
9969 name: "myapex",
9970 key: "myapex.key",
9971 bootclasspath_fragments: ["mybootclasspathfragment"],
9972 updatable: true,
9973 min_sdk_version: "29",
9974 }
9975 apex_key {
9976 name: "myapex.key",
9977 }
9978 bootclasspath_fragment {
9979 name: "mybootclasspathfragment",
9980 contents: ["myjavalib"],
9981 apex_available: ["myapex"],
9982 hidden_api: {
9983 split_packages: ["*"],
9984 },
9985 }
9986 java_library {
9987 name: "myjavalib",
9988 srcs: ["MyClass.java"],
9989 apex_available: [ "myapex" ],
9990 sdk_version: "current",
9991 min_sdk_version: "29",
9992 compile_dex: true,
9993 lint: {
9994 baseline_filename: "lint-baseline.xml",
9995 }
9996 }
9997 `
9998 fs := android.MockFS{
9999 "lint-baseline.xml": nil,
10000 }
10001
10002 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010003 apex := result.ModuleForTests("myapex", "android_common_myapex")
10004 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10005 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10006 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10007 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10008 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010009}
Spandan Das66773252022-01-15 00:23:18 +000010010
Jihoon Kang784c0052024-06-25 22:15:39 +000010011func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010012 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010013 bp := `
10014 apex {
10015 name: "myapex",
10016 key: "myapex.key",
10017 bootclasspath_fragments: ["mybootclasspathfragment"],
10018 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010019 java_libs: [
10020 "jacocoagent",
10021 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010022 }
10023 apex_key {
10024 name: "myapex.key",
10025 }
10026 bootclasspath_fragment {
10027 name: "mybootclasspathfragment",
10028 contents: ["foo"],
10029 apex_available: ["myapex"],
10030 hidden_api: {
10031 split_packages: ["*"],
10032 },
10033 }
10034 java_sdk_library {
10035 name: "foo",
10036 srcs: ["MyClass.java"],
10037 apex_available: [ "myapex" ],
10038 sdk_version: "current",
10039 min_sdk_version: "29",
10040 compile_dex: true,
10041 }
10042 `
10043 fs := android.MockFS{
10044 "lint-baseline.xml": nil,
10045 }
10046
10047 result := android.GroupFixturePreparers(
10048 prepareForApexTest,
10049 java.PrepareForTestWithJavaSdkLibraryFiles,
10050 java.PrepareForTestWithJacocoInstrumentation,
10051 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010052 android.FixtureMergeMockFs(fs),
10053 ).RunTestWithBp(t, bp)
10054
10055 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10056 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10057 android.AssertStringDoesContain(t,
10058 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10059 lintReportInputs, "foo.impl")
10060}
10061
Spandan Das42e89502022-05-06 22:12:55 +000010062// updatable apexes should propagate updatable=true to its apps
10063func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010064 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010065 bp := `
10066 apex {
10067 name: "myapex",
10068 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010069 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010070 apps: [
10071 "myapp",
10072 ],
10073 min_sdk_version: "30",
10074 }
10075 apex_key {
10076 name: "myapex.key",
10077 }
10078 android_app {
10079 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010080 apex_available: [
10081 "myapex",
10082 ],
10083 sdk_version: "current",
10084 min_sdk_version: "30",
10085 }
10086 `
Colin Cross99939e92024-10-01 16:02:46 -070010087 _ = android.GroupFixturePreparers(
10088 prepareForApexTest,
10089 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10090 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010091}
10092
Jingwen Chendea7a642023-03-28 11:30:50 +000010093func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010094 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010095 ctx := testApex(t, `
10096 apex {
10097 name: "myapex",
10098 key: "myapex.key",
10099 updatable: false,
10100 }
10101
10102 apex_key {
10103 name: "myapex.key",
10104 public_key: "testkey.avbpubkey",
10105 private_key: "testkey.pem",
10106 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010107 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010108 generateFsRule := mod.Rule("generateFsConfig")
10109 cmd := generateFsRule.RuleParams.Command
10110
10111 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10112}
10113
10114func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010115 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010116 ctx := testApex(t, `
10117 apex {
10118 name: "myapex",
10119 key: "myapex.key",
10120 canned_fs_config: "my_config",
10121 updatable: false,
10122 }
10123
10124 apex_key {
10125 name: "myapex.key",
10126 public_key: "testkey.avbpubkey",
10127 private_key: "testkey.pem",
10128 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010129 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010130 generateFsRule := mod.Rule("generateFsConfig")
10131 cmd := generateFsRule.RuleParams.Command
10132
10133 // Ensure that canned_fs_config has "cat my_config" at the end
10134 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10135}
Spandan Das20fce2d2023-04-12 17:21:39 +000010136
10137func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010138 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010139 testCases := []struct {
10140 desc string
10141 hasStubs bool
10142 apexAvailable string
10143 expectedError string
10144 }{
10145 {
10146 desc: "non-stub library can have multiple apex_available",
10147 hasStubs: false,
10148 apexAvailable: `["myapex", "otherapex"]`,
10149 },
10150 {
10151 desc: "stub library should not be available to anyapex",
10152 hasStubs: true,
10153 apexAvailable: `["//apex_available:anyapex"]`,
10154 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10155 },
10156 {
10157 desc: "stub library should not be available to multiple apexes",
10158 hasStubs: true,
10159 apexAvailable: `["myapex", "otherapex"]`,
10160 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10161 },
10162 {
10163 desc: "stub library can be available to a core apex and a test apex",
10164 hasStubs: true,
10165 apexAvailable: `["myapex", "test_myapex"]`,
10166 },
10167 }
10168 bpTemplate := `
10169 cc_library {
10170 name: "libfoo",
10171 %v
10172 apex_available: %v,
10173 }
10174 apex {
10175 name: "myapex",
10176 key: "apex.key",
10177 updatable: false,
10178 native_shared_libs: ["libfoo"],
10179 }
10180 apex {
10181 name: "otherapex",
10182 key: "apex.key",
10183 updatable: false,
10184 }
10185 apex_test {
10186 name: "test_myapex",
10187 key: "apex.key",
10188 updatable: false,
10189 native_shared_libs: ["libfoo"],
10190 }
10191 apex_key {
10192 name: "apex.key",
10193 }
10194 `
10195 for _, tc := range testCases {
10196 stubs := ""
10197 if tc.hasStubs {
10198 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10199 }
10200 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10201 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10202 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10203 })
10204 if tc.expectedError == "" {
10205 testApex(t, bp, mockFsFixturePreparer)
10206 } else {
10207 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10208 }
10209 }
10210}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010211
10212func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010213 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010214 context := android.GroupFixturePreparers(
10215 android.PrepareForIntegrationTestWithAndroid,
10216 cc.PrepareForIntegrationTestWithCc,
10217 PrepareForTestWithApexBuildComponents,
10218 prepareForTestWithMyapex,
10219 filesystem.PrepareForTestWithFilesystemBuildComponents,
10220 )
10221 result := context.RunTestWithBp(t, `
10222 android_system_image {
10223 name: "myfilesystem",
10224 deps: [
10225 "libfoo",
10226 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010227 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010228 gen_linker_config: true,
10229 linker_config_srcs: ["linker.config.json"],
10230 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010231 }
10232
10233 cc_library {
10234 name: "libfoo",
10235 shared_libs: [
10236 "libbar",
10237 ],
10238 stl: "none",
10239 }
10240
10241 cc_library {
10242 name: "libbar",
10243 stl: "none",
10244 apex_available: ["myapex"],
10245 }
10246
10247 apex {
10248 name: "myapex",
10249 native_shared_libs: ["libbar"],
10250 key: "myapex.key",
10251 updatable: false,
10252 }
10253
10254 apex_key {
10255 name: "myapex.key",
10256 public_key: "testkey.avbpubkey",
10257 private_key: "testkey.pem",
10258 }
10259 `)
10260
Cole Faust3b806d32024-03-11 15:15:03 -070010261 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010262 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10263 inputs.Strings(),
10264 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10265}
Yu Liueae7b362023-11-16 17:05:47 -080010266
10267var apex_default_bp = `
10268 apex_key {
10269 name: "myapex.key",
10270 public_key: "testkey.avbpubkey",
10271 private_key: "testkey.pem",
10272 }
10273
10274 filegroup {
10275 name: "myapex.manifest",
10276 srcs: ["apex_manifest.json"],
10277 }
10278
10279 filegroup {
10280 name: "myapex.androidmanifest",
10281 srcs: ["AndroidManifest.xml"],
10282 }
10283`
10284
10285func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010286 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010287 ctx := testApex(t, apex_default_bp+`
10288 apex {
10289 name: "myapex",
10290 manifest: ":myapex.manifest",
10291 androidManifest: ":myapex.androidmanifest",
10292 key: "myapex.key",
10293 java_libs: [
10294 "my_java_library_foo",
10295 "my_java_library_bar",
10296 ],
10297 updatable: false,
10298 }
10299
10300 java_library {
10301 name: "my_java_library_foo",
10302 srcs: ["foo/bar/MyClass.java"],
10303 sdk_version: "none",
10304 system_modules: "none",
10305 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010306 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010307 "myapex",
10308 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010309 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010310 }
10311
10312 java_library {
10313 name: "my_java_library_bar",
10314 srcs: ["foo/bar/MyClass.java"],
10315 sdk_version: "none",
10316 system_modules: "none",
10317 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010318 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010319 "myapex",
10320 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010321 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010322 }
10323
10324 aconfig_declarations {
10325 name: "my_aconfig_declarations_foo",
10326 package: "com.example.package",
10327 container: "myapex",
10328 srcs: ["foo.aconfig"],
10329 }
10330
10331 java_aconfig_library {
10332 name: "my_java_aconfig_library_foo",
10333 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010334 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010335 "myapex",
10336 ],
10337 }
10338
10339 aconfig_declarations {
10340 name: "my_aconfig_declarations_bar",
10341 package: "com.example.package",
10342 container: "myapex",
10343 srcs: ["bar.aconfig"],
10344 }
10345
10346 java_aconfig_library {
10347 name: "my_java_aconfig_library_bar",
10348 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010349 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010350 "myapex",
10351 ],
10352 }
10353 `)
10354
10355 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10356 s := mod.Rule("apexRule").Args["copy_commands"]
10357 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010358 if len(copyCmds) != 14 {
10359 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010360 }
10361
Jooyung Hana3fddf42024-09-03 13:22:21 +090010362 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10363 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10364 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10365 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010366 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010367
Yu Liubba555e2024-02-17 00:36:42 +000010368 inputs := []string{
10369 "my_aconfig_declarations_foo/intermediate.pb",
10370 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010371 }
Yu Liubba555e2024-02-17 00:36:42 +000010372 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10373 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10374 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10375 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010376 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010377}
10378
10379func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010380 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010381 ctx := testApex(t, apex_default_bp+`
10382 apex {
10383 name: "myapex",
10384 manifest: ":myapex.manifest",
10385 androidManifest: ":myapex.androidmanifest",
10386 key: "myapex.key",
10387 java_libs: [
10388 "my_java_library_foo",
10389 ],
10390 native_shared_libs: [
10391 "my_cc_library_bar",
10392 ],
10393 binaries: [
10394 "my_cc_binary_baz",
10395 ],
10396 updatable: false,
10397 }
10398
10399 java_library {
10400 name: "my_java_library_foo",
10401 srcs: ["foo/bar/MyClass.java"],
10402 sdk_version: "none",
10403 system_modules: "none",
10404 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010405 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010406 "myapex",
10407 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010408 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010409 }
10410
10411 cc_library {
10412 name: "my_cc_library_bar",
10413 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010414 static_libs: [
10415 "my_cc_aconfig_library_bar",
10416 "my_cc_aconfig_library_baz",
10417 ],
Yu Liueae7b362023-11-16 17:05:47 -080010418 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010419 "myapex",
10420 ],
10421 }
10422
10423 cc_binary {
10424 name: "my_cc_binary_baz",
10425 srcs: ["foo/bar/MyClass.cc"],
10426 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010427 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010428 "myapex",
10429 ],
10430 }
10431
10432 aconfig_declarations {
10433 name: "my_aconfig_declarations_foo",
10434 package: "com.example.package",
10435 container: "myapex",
10436 srcs: ["foo.aconfig"],
10437 }
10438
10439 java_aconfig_library {
10440 name: "my_java_aconfig_library_foo",
10441 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010442 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010443 "myapex",
10444 ],
10445 }
10446
10447 aconfig_declarations {
10448 name: "my_aconfig_declarations_bar",
10449 package: "com.example.package",
10450 container: "myapex",
10451 srcs: ["bar.aconfig"],
10452 }
10453
10454 cc_aconfig_library {
10455 name: "my_cc_aconfig_library_bar",
10456 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010457 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010458 "myapex",
10459 ],
10460 }
10461
10462 aconfig_declarations {
10463 name: "my_aconfig_declarations_baz",
10464 package: "com.example.package",
10465 container: "myapex",
10466 srcs: ["baz.aconfig"],
10467 }
10468
10469 cc_aconfig_library {
10470 name: "my_cc_aconfig_library_baz",
10471 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010472 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010473 "myapex",
10474 ],
10475 }
10476
10477 cc_library {
10478 name: "server_configurable_flags",
10479 srcs: ["server_configurable_flags.cc"],
10480 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010481 cc_library {
10482 name: "libbase",
10483 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010484 apex_available: [
10485 "myapex",
10486 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010487 }
10488 cc_library {
10489 name: "libaconfig_storage_read_api_cc",
10490 srcs: ["libaconfig_storage_read_api_cc.cc"],
10491 }
Yu Liueae7b362023-11-16 17:05:47 -080010492 `)
10493
10494 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10495 s := mod.Rule("apexRule").Args["copy_commands"]
10496 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010497 if len(copyCmds) != 18 {
10498 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010499 }
10500
Jooyung Hana3fddf42024-09-03 13:22:21 +090010501 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10502 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10503 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10504 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010505 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010506
Yu Liubba555e2024-02-17 00:36:42 +000010507 inputs := []string{
10508 "my_aconfig_declarations_foo/intermediate.pb",
10509 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10510 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010511 }
Yu Liubba555e2024-02-17 00:36:42 +000010512 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10513 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10514 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10515 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010516 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010517}
10518
Yu Liucec0e412023-11-30 16:45:50 -080010519func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010520 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010521 ctx := testApex(t, apex_default_bp+`
10522 apex {
10523 name: "myapex",
10524 manifest: ":myapex.manifest",
10525 androidManifest: ":myapex.androidmanifest",
10526 key: "myapex.key",
10527 native_shared_libs: [
10528 "libmy_rust_library",
10529 ],
10530 binaries: [
10531 "my_rust_binary",
10532 ],
10533 rust_dyn_libs: [
10534 "libmy_rust_dylib",
10535 ],
10536 updatable: false,
10537 }
10538
10539 rust_library {
10540 name: "libflags_rust", // test mock
10541 crate_name: "flags_rust",
10542 srcs: ["lib.rs"],
10543 apex_available: [
10544 "myapex",
10545 ],
10546 }
10547
10548 rust_library {
10549 name: "liblazy_static", // test mock
10550 crate_name: "lazy_static",
10551 srcs: ["src/lib.rs"],
10552 apex_available: [
10553 "myapex",
10554 ],
10555 }
10556
Ted Bauer02d475c2024-03-27 20:56:26 +000010557 rust_library {
10558 name: "libaconfig_storage_read_api", // test mock
10559 crate_name: "aconfig_storage_read_api",
10560 srcs: ["src/lib.rs"],
10561 apex_available: [
10562 "myapex",
10563 ],
10564 }
10565
Ted Bauer6ef40db2024-03-29 14:04:10 +000010566 rust_library {
10567 name: "liblogger", // test mock
10568 crate_name: "logger",
10569 srcs: ["src/lib.rs"],
10570 apex_available: [
10571 "myapex",
10572 ],
10573 }
10574
10575 rust_library {
10576 name: "liblog_rust", // test mock
10577 crate_name: "log_rust",
10578 srcs: ["src/lib.rs"],
10579 apex_available: [
10580 "myapex",
10581 ],
10582 }
10583
Yu Liucec0e412023-11-30 16:45:50 -080010584 rust_ffi_shared {
10585 name: "libmy_rust_library",
10586 srcs: ["src/lib.rs"],
10587 rustlibs: ["libmy_rust_aconfig_library_foo"],
10588 crate_name: "my_rust_library",
10589 apex_available: [
10590 "myapex",
10591 ],
10592 }
10593
10594 rust_library_dylib {
10595 name: "libmy_rust_dylib",
10596 srcs: ["foo/bar/MyClass.rs"],
10597 rustlibs: ["libmy_rust_aconfig_library_bar"],
10598 crate_name: "my_rust_dylib",
10599 apex_available: [
10600 "myapex",
10601 ],
10602 }
10603
10604 rust_binary {
10605 name: "my_rust_binary",
10606 srcs: ["foo/bar/MyClass.rs"],
10607 rustlibs: [
10608 "libmy_rust_aconfig_library_baz",
10609 "libmy_rust_dylib",
10610 ],
10611 apex_available: [
10612 "myapex",
10613 ],
10614 }
10615
10616 aconfig_declarations {
10617 name: "my_aconfig_declarations_foo",
10618 package: "com.example.package",
10619 container: "myapex",
10620 srcs: ["foo.aconfig"],
10621 }
10622
10623 aconfig_declarations {
10624 name: "my_aconfig_declarations_bar",
10625 package: "com.example.package",
10626 container: "myapex",
10627 srcs: ["bar.aconfig"],
10628 }
10629
10630 aconfig_declarations {
10631 name: "my_aconfig_declarations_baz",
10632 package: "com.example.package",
10633 container: "myapex",
10634 srcs: ["baz.aconfig"],
10635 }
10636
10637 rust_aconfig_library {
10638 name: "libmy_rust_aconfig_library_foo",
10639 aconfig_declarations: "my_aconfig_declarations_foo",
10640 crate_name: "my_rust_aconfig_library_foo",
10641 apex_available: [
10642 "myapex",
10643 ],
10644 }
10645
10646 rust_aconfig_library {
10647 name: "libmy_rust_aconfig_library_bar",
10648 aconfig_declarations: "my_aconfig_declarations_bar",
10649 crate_name: "my_rust_aconfig_library_bar",
10650 apex_available: [
10651 "myapex",
10652 ],
10653 }
10654
10655 rust_aconfig_library {
10656 name: "libmy_rust_aconfig_library_baz",
10657 aconfig_declarations: "my_aconfig_declarations_baz",
10658 crate_name: "my_rust_aconfig_library_baz",
10659 apex_available: [
10660 "myapex",
10661 ],
10662 }
10663 `)
10664
10665 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10666 s := mod.Rule("apexRule").Args["copy_commands"]
10667 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010668 if len(copyCmds) != 38 {
10669 t.Fatalf("Expected 38 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010670 }
10671
Jooyung Hana3fddf42024-09-03 13:22:21 +090010672 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10673 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10674 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10675 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010676 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010677
Yu Liubba555e2024-02-17 00:36:42 +000010678 inputs := []string{
10679 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010680 "my_aconfig_declarations_bar/intermediate.pb",
10681 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010682 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10683 }
10684 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10685 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10686 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10687 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010688 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010689}
10690
10691func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10692 aconfigRule := mod.Description(desc)
10693 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010694 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010695 if len(aconfigArgs) != len(inputs) {
10696 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010697 }
Yu Liucec0e412023-11-30 16:45:50 -080010698
Yu Liubba555e2024-02-17 00:36:42 +000010699 ensureEquals(t, container, aconfigRule.Args["container"])
10700 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10701
10702 buildParams := aconfigRule.BuildParams
10703 for _, input := range inputs {
10704 android.EnsureListContainsSuffix(t, aconfigArgs, input)
10705 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080010706 }
Yu Liubba555e2024-02-17 00:36:42 +000010707
10708 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080010709}
10710
Yu Liueae7b362023-11-16 17:05:47 -080010711func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010712 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010713 ctx := testApex(t, apex_default_bp+`
10714 apex {
10715 name: "myapex",
10716 manifest: ":myapex.manifest",
10717 androidManifest: ":myapex.androidmanifest",
10718 key: "myapex.key",
10719 java_libs: [
10720 "my_java_library_foo",
10721 "other_java_library_bar",
10722 ],
10723 updatable: false,
10724 }
10725
10726 java_library {
10727 name: "my_java_library_foo",
10728 srcs: ["foo/bar/MyClass.java"],
10729 sdk_version: "none",
10730 system_modules: "none",
10731 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010732 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010733 "myapex",
10734 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010735 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010736 }
10737
10738 java_library {
10739 name: "other_java_library_bar",
10740 srcs: ["foo/bar/MyClass.java"],
10741 sdk_version: "none",
10742 system_modules: "none",
10743 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010744 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010745 "myapex",
10746 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010747 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010748 }
10749
10750 aconfig_declarations {
10751 name: "my_aconfig_declarations_foo",
10752 package: "com.example.package",
10753 container: "myapex",
10754 srcs: ["foo.aconfig"],
10755 }
10756
10757 java_aconfig_library {
10758 name: "my_java_aconfig_library_foo",
10759 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010760 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010761 "myapex",
10762 ],
10763 }
10764
10765 aconfig_declarations {
10766 name: "other_aconfig_declarations_bar",
10767 package: "com.example.package",
10768 container: "otherapex",
10769 srcs: ["bar.aconfig"],
10770 }
10771
10772 java_aconfig_library {
10773 name: "other_java_aconfig_library_bar",
10774 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010775 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010776 "myapex",
10777 ],
10778 }
10779 `)
10780
10781 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10782 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10783 s := " " + combineAconfigRule.Args["cache_files"]
10784 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10785 if len(aconfigArgs) != 1 {
10786 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10787 }
10788 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10789
10790 buildParams := combineAconfigRule.BuildParams
10791 if len(buildParams.Inputs) != 1 {
10792 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10793 }
10794 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10795 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10796}
10797
10798func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010799 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010800 ctx := testApex(t, apex_default_bp+`
10801 apex {
10802 name: "myapex",
10803 manifest: ":myapex.manifest",
10804 androidManifest: ":myapex.androidmanifest",
10805 key: "myapex.key",
10806 java_libs: [
10807 "my_java_library_foo",
10808 "my_java_library_bar",
10809 ],
10810 updatable: false,
10811 }
10812
10813 java_library {
10814 name: "my_java_library_foo",
10815 srcs: ["foo/bar/MyClass.java"],
10816 sdk_version: "none",
10817 system_modules: "none",
10818 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010819 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010820 "myapex",
10821 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010822 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010823 }
10824
10825 java_library {
10826 name: "my_java_library_bar",
10827 srcs: ["foo/bar/MyClass.java"],
10828 sdk_version: "none",
10829 system_modules: "none",
10830 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010831 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010832 "myapex",
10833 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010834 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010835 }
10836
10837 aconfig_declarations {
10838 name: "my_aconfig_declarations_foo",
10839 package: "com.example.package",
10840 container: "myapex",
10841 srcs: ["foo.aconfig"],
10842 }
10843
10844 java_aconfig_library {
10845 name: "my_java_aconfig_library_foo",
10846 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010847 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010848 "myapex",
10849 ],
10850 }
10851
10852 java_aconfig_library {
10853 name: "my_java_aconfig_library_bar",
10854 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010855 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010856 "myapex",
10857 ],
10858 }
10859 `)
10860
10861 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10862 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
10863 s := " " + combineAconfigRule.Args["cache_files"]
10864 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
10865 if len(aconfigArgs) != 1 {
10866 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
10867 }
10868 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
10869
10870 buildParams := combineAconfigRule.BuildParams
10871 if len(buildParams.Inputs) != 1 {
10872 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
10873 }
10874 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
10875 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
10876}
Spandan Das5be63332023-12-13 00:06:32 +000010877
10878// Test that the boot jars come from the _selected_ apex prebuilt
10879// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
10880func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010881 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000010882 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
10883 t.Helper()
10884 s := ctx.ModuleForTests("dex_bootjars", "android_common")
10885 foundLibfooJar := false
10886 base := stem + ".jar"
10887 for _, output := range s.AllOutputs() {
10888 if filepath.Base(output) == base {
10889 foundLibfooJar = true
10890 buildRule := s.Output(output)
10891 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
10892 }
10893 }
10894 if !foundLibfooJar {
10895 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
10896 }
10897 }
10898
Spandan Das64c9e0c2023-12-20 20:13:34 +000010899 // Check that the boot jars of the selected apex are run through boot_jars_package_check
10900 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
10901 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10902 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
10903 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
10904 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)
10905 }
10906
10907 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
10908 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
10909 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
10910 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
10911 }
10912
Spandan Das5be63332023-12-13 00:06:32 +000010913 bp := `
10914 // Source APEX.
10915
10916 java_library {
10917 name: "framework-foo",
10918 srcs: ["foo.java"],
10919 installable: true,
10920 apex_available: [
10921 "com.android.foo",
10922 ],
10923 }
10924
10925 bootclasspath_fragment {
10926 name: "foo-bootclasspath-fragment",
10927 contents: ["framework-foo"],
10928 apex_available: [
10929 "com.android.foo",
10930 ],
10931 hidden_api: {
10932 split_packages: ["*"],
10933 },
10934 }
10935
10936 apex_key {
10937 name: "com.android.foo.key",
10938 public_key: "com.android.foo.avbpubkey",
10939 private_key: "com.android.foo.pem",
10940 }
10941
10942 apex {
10943 name: "com.android.foo",
10944 key: "com.android.foo.key",
10945 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10946 updatable: false,
10947 }
10948
10949 // Prebuilt APEX.
10950
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010951 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000010952 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010953 public: {
10954 jars: ["foo.jar"],
10955 },
Spandan Das5be63332023-12-13 00:06:32 +000010956 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010957 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000010958 }
10959
10960 prebuilt_bootclasspath_fragment {
10961 name: "foo-bootclasspath-fragment",
10962 contents: ["framework-foo"],
10963 hidden_api: {
10964 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
10965 metadata: "my-bootclasspath-fragment/metadata.csv",
10966 index: "my-bootclasspath-fragment/index.csv",
10967 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
10968 all_flags: "my-bootclasspath-fragment/all-flags.csv",
10969 },
10970 apex_available: [
10971 "com.android.foo",
10972 ],
10973 }
10974
10975 prebuilt_apex {
10976 name: "com.android.foo",
10977 apex_name: "com.android.foo",
10978 src: "com.android.foo-arm.apex",
10979 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10980 }
10981
10982 // Another Prebuilt ART APEX
10983 prebuilt_apex {
10984 name: "com.android.foo.v2",
10985 apex_name: "com.android.foo", // Used to determine the API domain
10986 src: "com.android.foo-arm.apex",
10987 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
10988 }
10989
10990 // APEX contribution modules
10991
10992 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010993 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000010994 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000010995 contents: ["com.android.foo"],
10996 }
10997
10998 apex_contributions {
10999 name: "foo.prebuilt.contributions",
11000 api_domain: "com.android.foo",
11001 contents: ["prebuilt_com.android.foo"],
11002 }
11003
11004 apex_contributions {
11005 name: "foo.prebuilt.v2.contributions",
11006 api_domain: "com.android.foo",
11007 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011008 }
11009 `
11010
11011 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011012 desc string
11013 selectedApexContributions string
11014 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011015 }{
11016 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011017 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11018 selectedApexContributions: "foo.source.contributions",
11019 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_apex10000/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011020 },
11021 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011022 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11023 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011024 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 +000011025 },
11026 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011027 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11028 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011029 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 +000011030 },
11031 }
11032
11033 fragment := java.ApexVariantReference{
11034 Apex: proptools.StringPtr("com.android.foo"),
11035 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11036 }
11037
11038 for _, tc := range testCases {
11039 preparer := android.GroupFixturePreparers(
11040 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11041 android.FixtureMergeMockFs(map[string][]byte{
11042 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11043 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011044 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11045 // file creation.
11046 java.FixtureConfigureBootJars("platform:foo"),
11047 android.FixtureModifyMockFS(func(fs android.MockFS) {
11048 fs["platform/Android.bp"] = []byte(`
11049 java_library {
11050 name: "foo",
11051 srcs: ["Test.java"],
11052 compile_dex: true,
11053 }
11054 `)
11055 fs["platform/Test.java"] = nil
11056 }),
11057
Colin Crossa66b4632024-08-08 15:50:47 -070011058 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011059 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011060 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011061 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011062 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11063 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011064 }
11065}
Spandan Das3576e762024-01-03 18:57:03 +000011066
11067// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11068// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11069func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011070 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011071 // for a mainline module family, check that only the flagged soong module is visible to make
11072 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11073 variation := func(moduleName string) string {
11074 ret := "android_common_com.android.foo"
11075 if moduleName == "com.google.android.foo" {
Spandan Das50801e22024-05-13 18:29:45 +000011076 ret = "android_common_com.google.android.foo_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011077 }
11078 return ret
11079 }
11080
11081 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11082 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11083
11084 for _, hiddenModuleName := range hiddenModuleNames {
11085 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11086 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11087
11088 }
11089 }
11090
11091 bp := `
11092 apex_key {
11093 name: "com.android.foo.key",
11094 public_key: "com.android.foo.avbpubkey",
11095 private_key: "com.android.foo.pem",
11096 }
11097
11098 // AOSP source apex
11099 apex {
11100 name: "com.android.foo",
11101 key: "com.android.foo.key",
11102 updatable: false,
11103 }
11104
11105 // Google source apex
11106 override_apex {
11107 name: "com.google.android.foo",
11108 base: "com.android.foo",
11109 key: "com.android.foo.key",
11110 }
11111
11112 // Prebuilt Google APEX.
11113
11114 prebuilt_apex {
11115 name: "com.google.android.foo",
11116 apex_name: "com.android.foo",
11117 src: "com.android.foo-arm.apex",
11118 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11119 }
11120
11121 // Another Prebuilt Google APEX
11122 prebuilt_apex {
11123 name: "com.google.android.foo.v2",
11124 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011125 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011126 src: "com.android.foo-arm.apex",
11127 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11128 }
11129
11130 // APEX contribution modules
11131
11132 apex_contributions {
11133 name: "foo.source.contributions",
11134 api_domain: "com.android.foo",
11135 contents: ["com.google.android.foo"],
11136 }
11137
11138 apex_contributions {
11139 name: "foo.prebuilt.contributions",
11140 api_domain: "com.android.foo",
11141 contents: ["prebuilt_com.google.android.foo"],
11142 }
11143
11144 apex_contributions {
11145 name: "foo.prebuilt.v2.contributions",
11146 api_domain: "com.android.foo",
11147 contents: ["prebuilt_com.google.android.foo.v2"],
11148 }
11149
11150 // This is an incompatible module because it selects multiple versions of the same mainline module
11151 apex_contributions {
11152 name: "foo.prebuilt.duplicate.contributions",
11153 api_domain: "com.android.foo",
11154 contents: [
11155 "prebuilt_com.google.android.foo",
11156 "prebuilt_com.google.android.foo.v2",
11157 ],
11158 }
11159 `
11160
11161 testCases := []struct {
11162 desc string
11163 selectedApexContributions string
11164 expectedVisibleModuleName string
11165 expectedHiddenModuleNames []string
11166 expectedError string
11167 }{
11168 {
11169 desc: "Source apex is selected, prebuilts should be hidden from make",
11170 selectedApexContributions: "foo.source.contributions",
11171 expectedVisibleModuleName: "com.google.android.foo",
11172 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11173 },
11174 {
11175 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11176 selectedApexContributions: "foo.prebuilt.contributions",
11177 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11178 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11179 },
11180 {
11181 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11182 selectedApexContributions: "foo.prebuilt.v2.contributions",
11183 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11184 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11185 },
11186 {
11187 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11188 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11189 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11190 },
11191 }
11192
11193 for _, tc := range testCases {
11194 preparer := android.GroupFixturePreparers(
11195 android.FixtureMergeMockFs(map[string][]byte{
11196 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11197 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011198 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011199 )
11200 if tc.expectedError != "" {
11201 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11202 testApex(t, bp, preparer)
11203 return
11204 }
11205 ctx := testApex(t, bp, preparer)
11206
Spandan Das3576e762024-01-03 18:57:03 +000011207 // Check that
11208 // 1. The contents of the selected apex_contributions are visible to make
11209 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11210 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11211 }
11212}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011213
Spandan Das85bd4622024-08-01 00:51:20 +000011214// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11215func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011216 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011217 // for a mainline module family, check that only the flagged soong module is visible to make
11218 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11219 variation := func(moduleName string) string {
11220 ret := "android_common_com.android.adservices"
11221 if moduleName == "com.google.android.foo" {
11222 ret = "android_common_com.google.android.foo_com.google.android.foo"
11223 }
11224 return ret
11225 }
11226
11227 for _, visibleModuleName := range visibleModuleNames {
11228 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11229 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11230 }
11231
11232 for _, hiddenModuleName := range hiddenModuleNames {
11233 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11234 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11235
11236 }
11237 }
11238
11239 bp := `
11240 apex_key {
11241 name: "com.android.adservices.key",
11242 public_key: "com.android.adservices.avbpubkey",
11243 private_key: "com.android.adservices.pem",
11244 }
11245
11246 // AOSP source apex
11247 apex {
11248 name: "com.android.adservices",
11249 key: "com.android.adservices.key",
11250 updatable: false,
11251 }
11252
11253 // Prebuilt Google APEX.
11254
11255 prebuilt_apex {
11256 name: "com.google.android.adservices",
11257 apex_name: "com.android.adservices",
11258 src: "com.android.foo-arm.apex",
11259 }
11260
11261 // Another Prebuilt Google APEX
11262 prebuilt_apex {
11263 name: "com.google.android.adservices.v2",
11264 apex_name: "com.android.adservices",
11265 src: "com.android.foo-arm.apex",
11266 }
11267
11268 // APEX contribution modules
11269
11270
11271 apex_contributions {
11272 name: "adservices.prebuilt.contributions",
11273 api_domain: "com.android.adservices",
11274 contents: ["prebuilt_com.google.android.adservices"],
11275 }
11276
11277 apex_contributions {
11278 name: "adservices.prebuilt.v2.contributions",
11279 api_domain: "com.android.adservices",
11280 contents: ["prebuilt_com.google.android.adservices.v2"],
11281 }
11282 `
11283
11284 testCases := []struct {
11285 desc string
11286 selectedApexContributions string
11287 expectedVisibleModuleNames []string
11288 expectedHiddenModuleNames []string
11289 }{
11290 {
11291 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11292 selectedApexContributions: "",
11293 expectedVisibleModuleNames: []string{"com.android.adservices"},
11294 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11295 },
11296 {
11297 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11298 selectedApexContributions: "adservices.prebuilt.contributions",
11299 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11300 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11301 },
11302 {
11303 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11304 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11305 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11306 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11307 },
11308 }
11309
11310 for _, tc := range testCases {
11311 preparer := android.GroupFixturePreparers(
11312 android.FixtureMergeMockFs(map[string][]byte{
11313 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11314 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011315 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011316 )
11317 ctx := testApex(t, bp, preparer)
11318
11319 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11320 }
11321}
11322
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011323func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011324 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011325 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11326 for _, moduleName := range moduleNames {
11327 ret += fmt.Sprintf(`
11328 aconfig_declarations {
11329 name: "%[1]s",
11330 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011331 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011332 srcs: [
11333 "%[1]s.aconfig",
11334 ],
11335 }
11336 java_aconfig_library {
11337 name: "%[1]s-lib",
11338 aconfig_declarations: "%[1]s",
11339 }
11340 `, moduleName)
11341 }
11342 return ret
11343 }
11344
11345 result := android.GroupFixturePreparers(
11346 prepareForApexTest,
11347 java.PrepareForTestWithJavaSdkLibraryFiles,
11348 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011349 ).RunTestWithBp(t, `
11350 java_library {
11351 name: "baz-java-lib",
11352 static_libs: [
11353 "baz-lib",
11354 ],
11355 }
11356 filegroup {
11357 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011358 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011359 ":qux-lib{.generated_srcjars}",
11360 ],
11361 }
11362 filegroup {
11363 name: "qux-another-filegroup",
11364 srcs: [
11365 ":qux-filegroup",
11366 ],
11367 }
11368 java_library {
11369 name: "quux-java-lib",
11370 srcs: [
11371 "a.java",
11372 ],
11373 libs: [
11374 "quux-lib",
11375 ],
11376 }
11377 java_sdk_library {
11378 name: "foo",
11379 srcs: [
11380 ":qux-another-filegroup",
11381 ],
11382 api_packages: ["foo"],
11383 system: {
11384 enabled: true,
11385 },
11386 module_lib: {
11387 enabled: true,
11388 },
11389 test: {
11390 enabled: true,
11391 },
11392 static_libs: [
11393 "bar-lib",
11394 ],
11395 libs: [
11396 "baz-java-lib",
11397 "quux-java-lib",
11398 ],
11399 aconfig_declarations: [
11400 "bar",
11401 ],
11402 }
11403 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11404
11405 m := result.ModuleForTests("foo.stubs.source", "android_common")
11406 outDir := "out/soong/.intermediates"
11407
11408 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11409 // textproto files
11410 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11411
11412 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11413 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11414 // to aconfig.
11415 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11416 "passed as an input",
11417 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11418
11419 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11420 // to metalava as classpath. Thus the cache file provided by the associated
11421 // aconfig_declarations module "baz" should be passed to aconfig.
11422 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11423 "java_aconfig_library passed as an input",
11424 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11425
11426 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11427 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11428 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11429 "input",
11430 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11431
11432 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11433 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11434 // aconfig_declarations module "quux" should not be passed to aconfig.
11435 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11436 "depend on java_aconfig_library not passed as an input",
11437 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11438}
Cole Faust7c991b42024-05-15 11:17:55 -070011439
11440func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011441 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011442 ctx := testApex(t, `
11443 apex {
11444 name: "myapex",
11445 key: "myapex.key",
11446 prebuilts: ["myetc", "myetc2"],
11447 min_sdk_version: "29",
11448 }
11449 apex_key {
11450 name: "myapex.key",
11451 public_key: "testkey.avbpubkey",
11452 private_key: "testkey.pem",
11453 }
11454
11455 prebuilt_etc {
11456 name: "myetc",
11457 src: "myprebuilt",
11458 filename: "myfilename",
11459 }
11460 prebuilt_etc {
11461 name: "myetc2",
11462 sub_dir: "mysubdir",
11463 src: "myprebuilt",
11464 filename: "myfilename",
11465 }
11466 `, withFiles(android.MockFS{
11467 "packages/modules/common/build/allowed_deps.txt": nil,
11468 }))
11469
11470 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11471 data := android.AndroidMkDataForTest(t, ctx, ab)
11472 var builder strings.Builder
11473 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11474 androidMk := builder.String()
11475
11476 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11477 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11478}
Spandan Das50801e22024-05-13 18:29:45 +000011479
11480func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011481 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011482 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11483 args := module.Rule("apexRule").Args
11484 optFlags := args["opt_flags"]
11485 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11486 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11487 }
11488 }
11489
11490 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11491 t.Helper()
11492 found := false
11493 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11494 if dep == wantDep {
11495 found = true
11496 }
11497 })
11498 if !found {
11499 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11500 }
11501 }
11502
11503 ctx := testApex(t, `
11504 apex {
11505 name: "com.android.apex30",
11506 min_sdk_version: "30",
11507 key: "apex30.key",
11508 java_libs: ["javalib"],
11509 }
11510
11511 java_library {
11512 name: "javalib",
11513 srcs: ["A.java"],
11514 apex_available: ["com.android.apex30"],
11515 min_sdk_version: "30",
11516 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011517 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011518 }
11519
11520 override_apex {
11521 name: "com.mycompany.android.apex30",
11522 base: "com.android.apex30",
11523 }
11524
11525 override_apex {
11526 name: "com.mycompany.android.apex31",
11527 base: "com.android.apex30",
11528 min_sdk_version: "31",
11529 }
11530
11531 apex_key {
11532 name: "apex30.key",
11533 public_key: "testkey.avbpubkey",
11534 private_key: "testkey.pem",
11535 }
11536
11537 `, android.FixtureMergeMockFs(android.MockFS{
11538 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11539 }),
11540 )
11541
11542 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11543 checkMinSdkVersion(t, baseModule, "30")
11544
11545 // Override module, but uses same min_sdk_version
11546 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11547 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11548 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11549 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11550
11551 // Override module, uses different min_sdk_version
11552 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11553 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11554 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11555 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11556}
Spandan Das0b28fa02024-05-28 23:40:17 +000011557
11558func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011559 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011560 context := android.GroupFixturePreparers(
11561 android.PrepareForIntegrationTestWithAndroid,
11562 PrepareForTestWithApexBuildComponents,
11563 android.FixtureMergeMockFs(android.MockFS{
11564 "system/sepolicy/apex/foo-file_contexts": nil,
11565 }),
11566 )
11567 res := context.RunTestWithBp(t, `
11568 apex {
11569 name: "foo",
11570 key: "myapex.key",
11571 apex_available_name: "com.android.foo",
11572 variant_version: "0",
11573 updatable: false,
11574 }
11575 apex_key {
11576 name: "myapex.key",
11577 public_key: "testkey.avbpubkey",
11578 private_key: "testkey.pem",
11579 }
11580 prebuilt_apex {
11581 name: "foo",
11582 src: "foo.apex",
11583 prefer: true,
11584 }
11585 override_apex {
11586 name: "myoverrideapex",
11587 base: "foo",
11588 }
11589 `)
11590
11591 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex_myoverrideapex", "foo")
11592}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011593
11594func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011595 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011596 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`, `
11597 apex {
11598 name: "myapex",
11599 key: "myapex.key",
11600 updatable: true,
11601 min_sdk_version: "current",
11602 }
11603
11604 apex_key {
11605 name: "myapex.key",
11606 public_key: "testkey.avbpubkey",
11607 private_key: "testkey.pem",
11608 }
11609 `)
11610}
Spandan Das2f68f192024-07-22 19:25:50 +000011611
11612func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011613 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011614 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11615 result := android.GroupFixturePreparers(
11616 prepareForApexTest,
11617 android.PrepareForTestWithAndroidMk,
11618 android.PrepareForTestWithMakevars,
11619 android.FixtureMergeMockFs(fs),
11620 ).RunTest(t)
11621
11622 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011623 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011624
11625 installRules := result.InstallMakeRulesForTesting(t)
11626
11627 var installedlibRule *android.InstallMakeRule
11628 for i, rule := range installRules {
11629 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11630 if installedlibRule != nil {
11631 t.Errorf("Duplicate install rules for %s", rule.Target)
11632 }
11633 installedlibRule = &installRules[i]
11634 }
11635 }
11636 if installedlibRule == nil {
11637 t.Errorf("No install rule found for installedlib")
11638 return
11639 }
11640
11641 if expectLibfooOnSystemLib {
11642 android.AssertStringListContains(t,
11643 "installedlib doesn't have install dependency on libfoo impl",
11644 installedlibRule.OrderOnlyDeps,
11645 "out/target/product/test_device/system/lib/libfoo.so")
11646 } else {
11647 android.AssertStringListDoesNotContain(t,
11648 "installedlib has install dependency on libfoo stub",
11649 installedlibRule.Deps,
11650 "out/target/product/test_device/system/lib/libfoo.so")
11651 android.AssertStringListDoesNotContain(t,
11652 "installedlib has order-only install dependency on libfoo stub",
11653 installedlibRule.OrderOnlyDeps,
11654 "out/target/product/test_device/system/lib/libfoo.so")
11655 }
11656 }
11657
11658 prebuiltLibfooBp := []byte(`
11659 cc_prebuilt_library {
11660 name: "libfoo",
11661 prefer: true,
11662 srcs: ["libfoo.so"],
11663 stubs: {
11664 versions: ["1"],
11665 },
11666 apex_available: ["apexfoo"],
11667 }
11668 `)
11669
11670 apexfooBp := []byte(`
11671 apex {
11672 name: "apexfoo",
11673 key: "apexfoo.key",
11674 native_shared_libs: ["libfoo"],
11675 updatable: false,
11676 compile_multilib: "both",
11677 }
11678 apex_key {
11679 name: "apexfoo.key",
11680 public_key: "testkey.avbpubkey",
11681 private_key: "testkey.pem",
11682 }
11683 `)
11684
11685 installedlibBp := []byte(`
11686 cc_library {
11687 name: "installedlib",
11688 shared_libs: ["libfoo"],
11689 }
11690 `)
11691
11692 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011693 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011694 testFunc(
11695 t,
11696 /*expectLibfooOnSystemLib=*/ false,
11697 android.MockFS{
11698 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11699 "apexfoo/Android.bp": apexfooBp,
11700 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11701 "Android.bp": installedlibBp,
11702 },
11703 )
11704 })
11705
11706 disabledSourceLibfooBp := []byte(`
11707 cc_library {
11708 name: "libfoo",
11709 enabled: false,
11710 stubs: {
11711 versions: ["1"],
11712 },
11713 apex_available: ["apexfoo"],
11714 }
11715 `)
11716
11717 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011718 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011719 testFunc(
11720 t,
11721 /*expectLibfooOnSystemLib=*/ false,
11722 android.MockFS{
11723 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11724 "impl/Android.bp": disabledSourceLibfooBp,
11725 "apexfoo/Android.bp": apexfooBp,
11726 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11727 "Android.bp": installedlibBp,
11728 },
11729 )
11730 })
11731}
Jihoon Kange246bb72024-09-18 22:26:22 +000011732
11733func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011734 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000011735 // This test case tests that listing the impl lib instead of the top level java_sdk_library
11736 // in libs of android_app and java_library does not lead to class loader context device/host
11737 // path mismatch errors.
11738 android.GroupFixturePreparers(
11739 prepareForApexTest,
11740 android.PrepareForIntegrationTestWithAndroid,
11741 PrepareForTestWithApexBuildComponents,
11742 android.FixtureModifyEnv(func(env map[string]string) {
11743 env["DISABLE_CONTAINER_CHECK"] = "true"
11744 }),
11745 withFiles(filesForSdkLibrary),
11746 android.FixtureMergeMockFs(android.MockFS{
11747 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
11748 }),
11749 ).RunTestWithBp(t, `
11750 apex {
11751 name: "com.android.foo30",
11752 key: "myapex.key",
11753 updatable: true,
11754 bootclasspath_fragments: [
11755 "foo-bootclasspath-fragment",
11756 ],
11757 java_libs: [
11758 "bar",
11759 ],
11760 apps: [
11761 "bar-app",
11762 ],
11763 min_sdk_version: "30",
11764 }
11765 apex_key {
11766 name: "myapex.key",
11767 public_key: "testkey.avbpubkey",
11768 private_key: "testkey.pem",
11769 }
11770 bootclasspath_fragment {
11771 name: "foo-bootclasspath-fragment",
11772 contents: [
11773 "framework-foo",
11774 ],
11775 apex_available: [
11776 "com.android.foo30",
11777 ],
11778 hidden_api: {
11779 split_packages: ["*"]
11780 },
11781 }
11782
11783 java_sdk_library {
11784 name: "framework-foo",
11785 srcs: [
11786 "A.java"
11787 ],
11788 unsafe_ignore_missing_latest_api: true,
11789 apex_available: [
11790 "com.android.foo30",
11791 ],
11792 compile_dex: true,
11793 sdk_version: "core_current",
11794 shared_library: false,
11795 }
11796
11797 java_library {
11798 name: "bar",
11799 srcs: [
11800 "A.java"
11801 ],
11802 libs: [
11803 "framework-foo.impl",
11804 ],
11805 apex_available: [
11806 "com.android.foo30",
11807 ],
11808 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080011809 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011810 }
11811
11812 java_library {
11813 name: "baz",
11814 srcs: [
11815 "A.java"
11816 ],
11817 libs: [
11818 "bar",
11819 ],
11820 sdk_version: "core_current",
11821 }
11822
11823 android_app {
11824 name: "bar-app",
11825 srcs: [
11826 "A.java"
11827 ],
11828 libs: [
11829 "baz",
11830 "framework-foo.impl",
11831 ],
11832 apex_available: [
11833 "com.android.foo30",
11834 ],
11835 sdk_version: "core_current",
11836 min_sdk_version: "30",
11837 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070011838 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000011839 }
11840 `)
11841}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011842
11843// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
11844func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011845 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000011846 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
11847 apex {
11848 name: "myapex",
11849 key: "myapex.key",
11850 systemserverclasspath_fragments: [
11851 "mysystemserverclasspathfragment",
11852 ],
11853 min_sdk_version: "29",
11854 updatable: true,
11855 system_ext_specific: true,
11856 }
11857
11858 apex_key {
11859 name: "myapex.key",
11860 public_key: "testkey.avbpubkey",
11861 private_key: "testkey.pem",
11862 }
11863
11864 java_library {
11865 name: "foo",
11866 srcs: ["b.java"],
11867 min_sdk_version: "29",
11868 installable: true,
11869 apex_available: [
11870 "myapex",
11871 ],
11872 sdk_version: "current",
11873 }
11874
11875 systemserverclasspath_fragment {
11876 name: "mysystemserverclasspathfragment",
11877 contents: [
11878 "foo",
11879 ],
11880 apex_available: [
11881 "myapex",
11882 ],
11883 }
11884 `,
11885 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
11886 )
11887}
Spandan Das72d86c62024-10-15 19:27:41 +000011888
11889// partitions should not package the artifacts that are included inside the apex.
11890func TestFilesystemWithApexDeps(t *testing.T) {
11891 t.Parallel()
11892 result := testApex(t, `
11893 android_filesystem {
11894 name: "myfilesystem",
11895 deps: ["myapex"],
11896 }
11897 apex {
11898 name: "myapex",
11899 key: "myapex.key",
11900 binaries: ["binfoo"],
11901 native_shared_libs: ["libfoo"],
11902 apps: ["appfoo"],
11903 updatable: false,
11904 }
11905 apex_key {
11906 name: "myapex.key",
11907 }
11908 cc_binary {
11909 name: "binfoo",
11910 apex_available: ["myapex"],
11911 }
11912 cc_library {
11913 name: "libfoo",
11914 apex_available: ["myapex"],
11915 }
11916 android_app {
11917 name: "appfoo",
11918 sdk_version: "current",
11919 apex_available: ["myapex"],
11920 }
11921 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
11922
11923 partition := result.ModuleForTests("myfilesystem", "android_common")
11924 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
11925 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
11926}
Colin Crossb614cd42024-10-11 12:52:21 -070011927
11928func TestApexVerifyNativeImplementationLibs(t *testing.T) {
11929 t.Parallel()
11930
11931 extractDepenencyPathFromErrors := func(errs []error) []string {
11932 i := slices.IndexFunc(errs, func(err error) bool {
11933 return strings.Contains(err.Error(), "dependency path:")
11934 })
11935 if i < 0 {
11936 return nil
11937 }
11938 var dependencyPath []string
11939 for _, err := range errs[i+1:] {
11940 s := err.Error()
11941 lastSpace := strings.LastIndexByte(s, ' ')
11942 if lastSpace >= 0 {
11943 dependencyPath = append(dependencyPath, s[lastSpace+1:])
11944 }
11945 }
11946 return dependencyPath
11947 }
11948
11949 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
11950 return func(t *testing.T, result *android.TestResult) {
11951 t.Helper()
11952 if len(result.Errs) == 0 {
11953 t.Fatalf("expected errors")
11954 }
11955 t.Log("found errors:")
11956 for _, err := range result.Errs {
11957 t.Log(err)
11958 }
11959 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
11960 t.Fatalf("expected error %q, got %q", w, g)
11961 }
11962 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
11963 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
11964 t.Errorf("expected dependency path %q, got %q", w, g)
11965 }
11966 }
11967 }
11968
11969 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
11970 return func(bp *bpmodify.Blueprint) {
11971 m := bp.ModulesByName(module)
11972 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
11973 if err != nil {
11974 panic(err)
11975 }
11976 props.AddStringToList(lib)
11977 }
11978 }
11979
11980 bpTemplate := `
11981 apex {
11982 name: "myapex",
11983 key: "myapex.key",
11984 native_shared_libs: ["mylib"],
11985 rust_dyn_libs: ["libmyrust"],
11986 binaries: ["mybin", "myrustbin"],
11987 jni_libs: ["libjni"],
11988 apps: ["myapp"],
11989 updatable: false,
11990 }
11991
11992 apex {
11993 name: "otherapex",
11994 key: "myapex.key",
11995 native_shared_libs: ["libotherapex"],
11996 updatable: false,
11997 }
11998
11999 apex_key {
12000 name: "myapex.key",
12001 public_key: "testkey.avbpubkey",
12002 private_key: "testkey.pem",
12003 }
12004
12005 cc_library {
12006 name: "mylib",
12007 srcs: ["foo.cpp"],
12008 apex_available: ["myapex"],
12009 }
12010
12011 cc_binary {
12012 name: "mybin",
12013 srcs: ["foo.cpp"],
12014 apex_available: ["myapex"],
12015 }
12016
12017 rust_library {
12018 name: "libmyrust",
12019 crate_name: "myrust",
12020 srcs: ["src/lib.rs"],
12021 rustlibs: ["libmyrust_transitive_dylib"],
12022 rlibs: ["libmyrust_transitive_rlib"],
12023 apex_available: ["myapex"],
12024 }
12025
12026 rust_library{
12027 name: "libmyrust_transitive_dylib",
12028 crate_name: "myrust_transitive_dylib",
12029 srcs: ["src/lib.rs"],
12030 apex_available: ["myapex"],
12031 }
12032
12033 rust_library {
12034 name: "libmyrust_transitive_rlib",
12035 crate_name: "myrust_transitive_rlib",
12036 srcs: ["src/lib.rs"],
12037 apex_available: ["myapex"],
12038 }
12039
12040 rust_binary {
12041 name: "myrustbin",
12042 srcs: ["src/main.rs"],
12043 apex_available: ["myapex"],
12044 }
12045
12046 cc_library {
12047 name: "libbar",
12048 sdk_version: "current",
12049 srcs: ["bar.cpp"],
12050 apex_available: ["myapex"],
12051 stl: "none",
12052 }
12053
12054 android_app {
12055 name: "myapp",
12056 jni_libs: ["libembeddedjni"],
12057 use_embedded_native_libs: true,
12058 sdk_version: "current",
12059 apex_available: ["myapex"],
12060 }
12061
12062 cc_library {
12063 name: "libembeddedjni",
12064 sdk_version: "current",
12065 srcs: ["bar.cpp"],
12066 apex_available: ["myapex"],
12067 stl: "none",
12068 }
12069
12070 cc_library {
12071 name: "libjni",
12072 sdk_version: "current",
12073 srcs: ["bar.cpp"],
12074 apex_available: ["myapex"],
12075 stl: "none",
12076 }
12077
12078 cc_library {
12079 name: "libotherapex",
12080 sdk_version: "current",
12081 srcs: ["otherapex.cpp"],
12082 apex_available: ["otherapex"],
12083 stubs: {
12084 symbol_file: "libotherapex.map.txt",
12085 versions: ["1", "2", "3"],
12086 },
12087 stl: "none",
12088 }
12089
12090 cc_library {
12091 name: "libplatform",
12092 sdk_version: "current",
12093 srcs: ["libplatform.cpp"],
12094 stubs: {
12095 symbol_file: "libplatform.map.txt",
12096 versions: ["1", "2", "3"],
12097 },
12098 stl: "none",
12099 system_shared_libs: [],
12100 }
12101 `
12102
12103 testCases := []struct {
12104 name string
12105 bpModifier func(bp *bpmodify.Blueprint)
12106 dependencyPath []string
12107 }{
12108 {
12109 name: "library dependency in other apex",
12110 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12111 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12112 },
12113 {
12114 name: "transitive library dependency in other apex",
12115 bpModifier: func(bp *bpmodify.Blueprint) {
12116 addToSharedLibs("mylib", "libbar")(bp)
12117 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12118 },
12119 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12120 },
12121 {
12122 name: "library dependency in platform",
12123 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12124 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12125 },
12126 {
12127 name: "jni library dependency in other apex",
12128 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12129 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12130 },
12131 {
12132 name: "transitive jni library dependency in other apex",
12133 bpModifier: func(bp *bpmodify.Blueprint) {
12134 addToSharedLibs("libjni", "libbar")(bp)
12135 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12136 },
12137 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12138 },
12139 {
12140 name: "jni library dependency in platform",
12141 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12142 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12143 },
12144 {
12145 name: "transitive jni library dependency in platform",
12146 bpModifier: func(bp *bpmodify.Blueprint) {
12147 addToSharedLibs("libjni", "libbar")(bp)
12148 addToSharedLibs("libbar", "libplatform#impl")(bp)
12149 },
12150 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12151 },
Spandan Das10c41362024-12-03 01:33:09 +000012152 {
12153 name: "app jni library dependency in other apex",
12154 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12155 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12156 },
12157 {
12158 name: "transitive app jni library dependency in other apex",
12159 bpModifier: func(bp *bpmodify.Blueprint) {
12160 addToSharedLibs("libembeddedjni", "libbar")(bp)
12161 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12162 },
12163 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12164 },
12165 {
12166 name: "app jni library dependency in platform",
12167 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12168 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12169 },
12170 {
12171 name: "transitive app jni library dependency in platform",
12172 bpModifier: func(bp *bpmodify.Blueprint) {
12173 addToSharedLibs("libembeddedjni", "libbar")(bp)
12174 addToSharedLibs("libbar", "libplatform#impl")(bp)
12175 },
12176 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12177 },
Colin Crossb614cd42024-10-11 12:52:21 -070012178 {
12179 name: "binary dependency in other apex",
12180 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12181 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12182 },
12183 {
12184 name: "transitive binary dependency in other apex",
12185 bpModifier: func(bp *bpmodify.Blueprint) {
12186 addToSharedLibs("mybin", "libbar")(bp)
12187 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12188 },
12189 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12190 },
12191 {
12192 name: "binary dependency in platform",
12193 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12194 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12195 },
12196 {
12197 name: "transitive binary dependency in platform",
12198 bpModifier: func(bp *bpmodify.Blueprint) {
12199 addToSharedLibs("mybin", "libbar")(bp)
12200 addToSharedLibs("libbar", "libplatform#impl")(bp)
12201 },
12202 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12203 },
12204
12205 {
12206 name: "rust library dependency in other apex",
12207 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12208 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12209 },
12210 {
12211 name: "transitive rust library dependency in other apex",
12212 bpModifier: func(bp *bpmodify.Blueprint) {
12213 addToSharedLibs("libmyrust", "libbar")(bp)
12214 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12215 },
12216 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12217 },
12218 {
12219 name: "rust library dependency in platform",
12220 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12221 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12222 },
12223 {
12224 name: "transitive rust library dependency in platform",
12225 bpModifier: func(bp *bpmodify.Blueprint) {
12226 addToSharedLibs("libmyrust", "libbar")(bp)
12227 addToSharedLibs("libbar", "libplatform#impl")(bp)
12228 },
12229 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12230 },
12231 {
12232 name: "transitive rust library dylib dependency in other apex",
12233 bpModifier: func(bp *bpmodify.Blueprint) {
12234 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12235 },
12236 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12237 },
12238 {
12239 name: "transitive rust library dylib dependency in platform",
12240 bpModifier: func(bp *bpmodify.Blueprint) {
12241 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12242 },
12243 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12244 },
12245 {
12246 name: "transitive rust library rlib dependency in other apex",
12247 bpModifier: func(bp *bpmodify.Blueprint) {
12248 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12249 },
12250 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12251 },
12252 {
12253 name: "transitive rust library rlib dependency in platform",
12254 bpModifier: func(bp *bpmodify.Blueprint) {
12255 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12256 },
12257 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12258 },
12259 {
12260 name: "rust binary dependency in other apex",
12261 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12262 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12263 },
12264 {
12265 name: "transitive rust binary dependency in other apex",
12266 bpModifier: func(bp *bpmodify.Blueprint) {
12267 addToSharedLibs("myrustbin", "libbar")(bp)
12268 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12269 },
12270 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12271 },
12272 {
12273 name: "rust binary dependency in platform",
12274 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12275 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12276 },
12277 {
12278 name: "transitive rust binary dependency in platform",
12279 bpModifier: func(bp *bpmodify.Blueprint) {
12280 addToSharedLibs("myrustbin", "libbar")(bp)
12281 addToSharedLibs("libbar", "libplatform#impl")(bp)
12282 },
12283 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12284 },
12285 }
12286
12287 for _, testCase := range testCases {
12288 t.Run(testCase.name, func(t *testing.T) {
12289 t.Parallel()
12290 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12291 if err != nil {
12292 t.Fatal(err)
12293 }
12294 if testCase.bpModifier != nil {
12295 func() {
12296 defer func() {
12297 if r := recover(); r != nil {
12298 t.Fatalf("panic in bpModifier: %v", r)
12299 }
12300 }()
12301 testCase.bpModifier(bp)
12302 }()
12303 }
12304 android.GroupFixturePreparers(
12305 android.PrepareForTestWithAndroidBuildComponents,
12306 cc.PrepareForTestWithCcBuildComponents,
12307 java.PrepareForTestWithDexpreopt,
12308 rust.PrepareForTestWithRustDefaultModules,
12309 PrepareForTestWithApexBuildComponents,
12310 prepareForTestWithMyapex,
12311 prepareForTestWithOtherapex,
12312 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12313 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12314 }),
12315 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12316 RunTestWithBp(t, bp.String())
12317 })
12318 }
12319}