blob: 78f24635e7b43c62869c1982e7cc43d1132706a8 [file] [log] [blame]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package apex
16
17import (
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +090018 "fmt"
Jooyung Han39edb6c2019-11-06 16:53:07 +090019 "path"
Paul Duffin37856732021-02-26 14:24:15 +000020 "path/filepath"
Jaewoong Jung22f7d182019-07-16 18:25:41 -070021 "reflect"
Paul Duffin9b879592020-05-26 13:21:35 +010022 "regexp"
Colin Crossb614cd42024-10-11 12:52:21 -070023 "slices"
Jooyung Han31c470b2019-10-18 16:26:59 +090024 "sort"
Jiyong Parkd4a3a132021-03-17 20:21:35 +090025 "strconv"
Jiyong Park25fc6a92018-11-18 18:02:45 +090026 "strings"
27 "testing"
Jiyong Parkda6eb592018-12-19 17:12:36 +090028
Yu Liueae7b362023-11-16 17:05:47 -080029 "android/soong/aconfig/codegen"
Jooyung Han20348752023-12-05 15:23:56 +090030
Kiyoung Kim487689e2022-07-26 09:48:22 +090031 "github.com/google/blueprint"
Colin Crossb614cd42024-10-11 12:52:21 -070032 "github.com/google/blueprint/bpmodify"
Jiyong Parkda6eb592018-12-19 17:12:36 +090033 "github.com/google/blueprint/proptools"
34
35 "android/soong/android"
markchien2f59ec92020-09-02 16:23:38 +080036 "android/soong/bpf"
Jiyong Parkda6eb592018-12-19 17:12:36 +090037 "android/soong/cc"
Ulya Trafimovichb28cc372020-01-13 15:18:16 +000038 "android/soong/dexpreopt"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070039 prebuilt_etc "android/soong/etc"
Colin Crossbd3a16b2023-04-25 11:30:51 -070040 "android/soong/filesystem"
Jiyong Parkb2742fd2019-02-11 11:38:15 +090041 "android/soong/java"
Jiyong Park99644e92020-11-17 22:21:02 +090042 "android/soong/rust"
Jaewoong Jung4b79e982020-06-01 10:45:49 -070043 "android/soong/sh"
Jiyong Park25fc6a92018-11-18 18:02:45 +090044)
45
Jooyung Hand3639552019-08-09 12:57:43 +090046// names returns name list from white space separated string
47func names(s string) (ns []string) {
48 for _, n := range strings.Split(s, " ") {
49 if len(n) > 0 {
50 ns = append(ns, n)
51 }
52 }
53 return
54}
55
Paul Duffin40b62572021-03-20 11:39:01 +000056func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
Jooyung Han344d5432019-08-23 11:17:39 +090057 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010058 android.GroupFixturePreparers(
59 prepareForApexTest,
60 android.GroupFixturePreparers(preparers...),
61 ).
Paul Duffine05480a2021-03-08 15:07:14 +000062 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
Paul Duffin40b62572021-03-20 11:39:01 +000063 RunTestWithBp(t, bp)
Jooyung Han5c998b92019-06-27 11:30:33 +090064}
65
Paul Duffin40b62572021-03-20 11:39:01 +000066func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
Jooyung Han344d5432019-08-23 11:17:39 +090067 t.Helper()
Paul Duffin284165a2021-03-29 01:50:31 +010068
69 optionalBpPreparer := android.NullFixturePreparer
Paul Duffin40b62572021-03-20 11:39:01 +000070 if bp != "" {
Paul Duffin284165a2021-03-29 01:50:31 +010071 optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
Paul Duffin40b62572021-03-20 11:39:01 +000072 }
Paul Duffin284165a2021-03-29 01:50:31 +010073
74 result := android.GroupFixturePreparers(
75 prepareForApexTest,
76 android.GroupFixturePreparers(preparers...),
77 optionalBpPreparer,
78 ).RunTest(t)
79
Paul Duffine05480a2021-03-08 15:07:14 +000080 return result.TestContext
Jooyung Han5c998b92019-06-27 11:30:33 +090081}
82
Paul Duffin810f33d2021-03-09 14:12:32 +000083func withFiles(files android.MockFS) android.FixturePreparer {
84 return files.AddToFixture()
Jooyung Han344d5432019-08-23 11:17:39 +090085}
86
Paul Duffin810f33d2021-03-09 14:12:32 +000087func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
88 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
89 variables.ManifestPackageNameOverrides = specs
90 })
Jooyung Han35155c42020-02-06 17:33:20 +090091}
92
Albert Martineefabcf2022-03-21 20:11:16 +000093func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
94 return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
95 variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
96 })
97}
98
Paul Duffin810f33d2021-03-09 14:12:32 +000099var withBinder32bit = android.FixtureModifyProductVariables(
100 func(variables android.FixtureProductVariables) {
101 variables.Binder32bit = proptools.BoolPtr(true)
102 },
103)
Jiyong Parkcfaa1642020-02-28 16:51:07 +0900104
Paul Duffin810f33d2021-03-09 14:12:32 +0000105var withUnbundledBuild = android.FixtureModifyProductVariables(
106 func(variables android.FixtureProductVariables) {
107 variables.Unbundled_build = proptools.BoolPtr(true)
108 },
109)
Jiyong Park7cd10e32020-01-14 09:22:18 +0900110
Paul Duffin284165a2021-03-29 01:50:31 +0100111// Legacy preparer used for running tests within the apex package.
112//
113// This includes everything that was needed to run any test in the apex package prior to the
114// introduction of the test fixtures. Tests that are being converted to use fixtures directly
115// rather than through the testApex...() methods should avoid using this and instead use the
116// various preparers directly, using android.GroupFixturePreparers(...) to group them when
117// necessary.
118//
119// deprecated
120var prepareForApexTest = android.GroupFixturePreparers(
Paul Duffin37aad602021-03-08 09:47:16 +0000121 // General preparers in alphabetical order as test infrastructure will enforce correct
122 // registration order.
123 android.PrepareForTestWithAndroidBuildComponents,
124 bpf.PrepareForTestWithBpf,
125 cc.PrepareForTestWithCcBuildComponents,
Jiakai Zhangb95998b2023-05-11 16:39:27 +0100126 java.PrepareForTestWithDexpreopt,
Paul Duffin37aad602021-03-08 09:47:16 +0000127 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
128 rust.PrepareForTestWithRustDefaultModules,
129 sh.PrepareForTestWithShBuildComponents,
Yu Liueae7b362023-11-16 17:05:47 -0800130 codegen.PrepareForTestWithAconfigBuildComponents,
Paul Duffin37aad602021-03-08 09:47:16 +0000131
132 PrepareForTestWithApexBuildComponents,
133
134 // Additional apex test specific preparers.
135 android.FixtureAddTextFile("system/sepolicy/Android.bp", `
136 filegroup {
137 name: "myapex-file_contexts",
138 srcs: [
139 "apex/myapex-file_contexts",
140 ],
141 }
142 `),
Paul Duffin52bfaa42021-03-23 23:40:12 +0000143 prepareForTestWithMyapex,
Paul Duffin37aad602021-03-08 09:47:16 +0000144 android.FixtureMergeMockFs(android.MockFS{
Paul Duffin52bfaa42021-03-23 23:40:12 +0000145 "a.java": nil,
146 "PrebuiltAppFoo.apk": nil,
147 "PrebuiltAppFooPriv.apk": nil,
148 "apex_manifest.json": nil,
149 "AndroidManifest.xml": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000150 "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
151 "system/sepolicy/apex/myapex2-file_contexts": nil,
152 "system/sepolicy/apex/otherapex-file_contexts": nil,
153 "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
154 "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
Colin Crossabc0dab2022-04-07 17:39:21 -0700155 "mylib.cpp": nil,
156 "mytest.cpp": nil,
157 "mytest1.cpp": nil,
158 "mytest2.cpp": nil,
159 "mytest3.cpp": nil,
160 "myprebuilt": nil,
161 "my_include": nil,
162 "foo/bar/MyClass.java": nil,
163 "prebuilt.jar": nil,
164 "prebuilt.so": nil,
165 "vendor/foo/devkeys/test.x509.pem": nil,
166 "vendor/foo/devkeys/test.pk8": nil,
167 "testkey.x509.pem": nil,
168 "testkey.pk8": nil,
169 "testkey.override.x509.pem": nil,
170 "testkey.override.pk8": nil,
171 "vendor/foo/devkeys/testkey.avbpubkey": nil,
172 "vendor/foo/devkeys/testkey.pem": nil,
173 "NOTICE": nil,
174 "custom_notice": nil,
175 "custom_notice_for_static_lib": nil,
176 "testkey2.avbpubkey": nil,
177 "testkey2.pem": nil,
178 "myapex-arm64.apex": nil,
179 "myapex-arm.apex": nil,
180 "myapex.apks": nil,
181 "frameworks/base/api/current.txt": nil,
182 "framework/aidl/a.aidl": nil,
183 "dummy.txt": nil,
184 "baz": nil,
185 "bar/baz": nil,
186 "testdata/baz": nil,
187 "AppSet.apks": nil,
188 "foo.rs": nil,
189 "libfoo.jar": nil,
190 "libbar.jar": nil,
Paul Duffin37aad602021-03-08 09:47:16 +0000191 },
192 ),
193
194 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
Paul Duffin37aad602021-03-08 09:47:16 +0000195 variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
196 variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
197 variables.Platform_sdk_codename = proptools.StringPtr("Q")
198 variables.Platform_sdk_final = proptools.BoolPtr(false)
Pedro Loureiroc3621422021-09-28 15:40:23 +0000199 // "Tiramisu" needs to be in the next line for compatibility with soong code,
200 // not because of these tests specifically (it's not used by the tests)
201 variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000202 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
Paul Duffin37aad602021-03-08 09:47:16 +0000203 }),
204)
205
Paul Duffin52bfaa42021-03-23 23:40:12 +0000206var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
207 "system/sepolicy/apex/myapex-file_contexts": nil,
208})
209
Colin Crossb614cd42024-10-11 12:52:21 -0700210var prepareForTestWithOtherapex = android.FixtureMergeMockFs(android.MockFS{
211 "system/sepolicy/apex/otherapex-file_contexts": nil,
212})
213
Jooyung Han643adc42020-02-27 13:50:06 +0900214// ensure that 'result' equals 'expected'
215func ensureEquals(t *testing.T, result string, expected string) {
216 t.Helper()
217 if result != expected {
218 t.Errorf("%q != %q", expected, result)
219 }
220}
221
Jiyong Park25fc6a92018-11-18 18:02:45 +0900222// ensure that 'result' contains 'expected'
223func ensureContains(t *testing.T, result string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900224 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900225 if !strings.Contains(result, expected) {
226 t.Errorf("%q is not found in %q", expected, result)
227 }
228}
229
Liz Kammer5bd365f2020-05-27 15:15:11 -0700230// ensure that 'result' contains 'expected' exactly one time
231func ensureContainsOnce(t *testing.T, result string, expected string) {
232 t.Helper()
233 count := strings.Count(result, expected)
234 if count != 1 {
235 t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
236 }
237}
238
Jiyong Park25fc6a92018-11-18 18:02:45 +0900239// ensures that 'result' does not contain 'notExpected'
240func ensureNotContains(t *testing.T, result string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900241 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900242 if strings.Contains(result, notExpected) {
243 t.Errorf("%q is found in %q", notExpected, result)
244 }
245}
246
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700247func ensureMatches(t *testing.T, result string, expectedRex string) {
Jooyung Hana3fddf42024-09-03 13:22:21 +0900248 t.Helper()
Sasha Smundak18d98bc2020-05-27 16:36:07 -0700249 ok, err := regexp.MatchString(expectedRex, result)
250 if err != nil {
251 t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
252 return
253 }
254 if !ok {
255 t.Errorf("%s does not match regular expession %s", result, expectedRex)
256 }
257}
258
Jooyung Hana3fddf42024-09-03 13:22:21 +0900259func ensureListContainsMatch(t *testing.T, result []string, expectedRex string) {
260 t.Helper()
261 p := regexp.MustCompile(expectedRex)
262 if android.IndexListPred(func(s string) bool { return p.MatchString(s) }, result) == -1 {
263 t.Errorf("%q is not found in %v", expectedRex, result)
264 }
265}
266
Jiyong Park25fc6a92018-11-18 18:02:45 +0900267func ensureListContains(t *testing.T, result []string, expected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900268 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900269 if !android.InList(expected, result) {
270 t.Errorf("%q is not found in %v", expected, result)
271 }
272}
273
274func ensureListNotContains(t *testing.T, result []string, notExpected string) {
Jooyung Han5c998b92019-06-27 11:30:33 +0900275 t.Helper()
Jiyong Park25fc6a92018-11-18 18:02:45 +0900276 if android.InList(notExpected, result) {
277 t.Errorf("%q is found in %v", notExpected, result)
278 }
279}
280
Jooyung Hane1633032019-08-01 17:41:43 +0900281func ensureListEmpty(t *testing.T, result []string) {
282 t.Helper()
283 if len(result) > 0 {
284 t.Errorf("%q is expected to be empty", result)
285 }
286}
287
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +0000288func ensureListNotEmpty(t *testing.T, result []string) {
289 t.Helper()
290 if len(result) == 0 {
291 t.Errorf("%q is expected to be not empty", result)
292 }
293}
294
Jiyong Park25fc6a92018-11-18 18:02:45 +0900295// Minimal test
296func TestBasicApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700297 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800298 ctx := testApex(t, `
Jiyong Park30ca9372019-02-07 16:27:23 +0900299 apex_defaults {
300 name: "myapex-defaults",
Jiyong Park809bb722019-02-13 21:33:49 +0900301 manifest: ":myapex.manifest",
302 androidManifest: ":myapex.androidmanifest",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900303 key: "myapex.key",
Jiyong Park99644e92020-11-17 22:21:02 +0900304 binaries: ["foo.rust"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900305 native_shared_libs: [
306 "mylib",
307 "libfoo.ffi",
308 ],
Jiyong Park99644e92020-11-17 22:21:02 +0900309 rust_dyn_libs: ["libfoo.dylib.rust"],
Alex Light3d673592019-01-18 14:37:31 -0800310 multilib: {
311 both: {
Jiyong Park99644e92020-11-17 22:21:02 +0900312 binaries: ["foo"],
Alex Light3d673592019-01-18 14:37:31 -0800313 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900314 },
Jiyong Park77acec62020-06-01 21:39:15 +0900315 java_libs: [
316 "myjar",
317 "myjar_dex",
318 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000319 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900320 }
321
Jiyong Park30ca9372019-02-07 16:27:23 +0900322 apex {
323 name: "myapex",
324 defaults: ["myapex-defaults"],
325 }
326
Jiyong Park25fc6a92018-11-18 18:02:45 +0900327 apex_key {
328 name: "myapex.key",
329 public_key: "testkey.avbpubkey",
330 private_key: "testkey.pem",
331 }
332
Jiyong Park809bb722019-02-13 21:33:49 +0900333 filegroup {
334 name: "myapex.manifest",
335 srcs: ["apex_manifest.json"],
336 }
337
338 filegroup {
339 name: "myapex.androidmanifest",
340 srcs: ["AndroidManifest.xml"],
341 }
342
Jiyong Park25fc6a92018-11-18 18:02:45 +0900343 cc_library {
344 name: "mylib",
345 srcs: ["mylib.cpp"],
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900346 shared_libs: [
347 "mylib2",
348 "libbar.ffi",
349 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900350 system_shared_libs: [],
351 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000352 // TODO: remove //apex_available:platform
353 apex_available: [
354 "//apex_available:platform",
355 "myapex",
356 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900357 }
358
Alex Light3d673592019-01-18 14:37:31 -0800359 cc_binary {
360 name: "foo",
361 srcs: ["mylib.cpp"],
362 compile_multilib: "both",
363 multilib: {
364 lib32: {
365 suffix: "32",
366 },
367 lib64: {
368 suffix: "64",
369 },
370 },
371 symlinks: ["foo_link_"],
372 symlink_preferred_arch: true,
373 system_shared_libs: [],
Alex Light3d673592019-01-18 14:37:31 -0800374 stl: "none",
Jooyung Han40b79172024-08-16 16:00:33 +0900375 apex_available: [ "myapex" ],
Yifan Hongd22a84a2020-07-28 17:37:46 -0700376 }
377
Jiyong Park99644e92020-11-17 22:21:02 +0900378 rust_binary {
Artur Satayev533b98c2021-03-11 18:03:42 +0000379 name: "foo.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900380 srcs: ["foo.rs"],
381 rlibs: ["libfoo.rlib.rust"],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700382 rustlibs: ["libfoo.transitive.dylib.rust"],
Jiyong Park99644e92020-11-17 22:21:02 +0900383 apex_available: ["myapex"],
384 }
385
386 rust_library_rlib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000387 name: "libfoo.rlib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900388 srcs: ["foo.rs"],
389 crate_name: "foo",
390 apex_available: ["myapex"],
Jiyong Park94e22fd2021-04-08 18:19:15 +0900391 shared_libs: ["libfoo.shared_from_rust"],
392 }
393
394 cc_library_shared {
395 name: "libfoo.shared_from_rust",
396 srcs: ["mylib.cpp"],
397 system_shared_libs: [],
398 stl: "none",
399 apex_available: ["myapex"],
Jiyong Park99644e92020-11-17 22:21:02 +0900400 }
401
402 rust_library_dylib {
Artur Satayev533b98c2021-03-11 18:03:42 +0000403 name: "libfoo.dylib.rust",
Jiyong Park99644e92020-11-17 22:21:02 +0900404 srcs: ["foo.rs"],
405 crate_name: "foo",
406 apex_available: ["myapex"],
407 }
408
Colin Cross49f1a8f2024-10-23 13:04:15 -0700409 rust_library_dylib {
410 name: "libfoo.transitive.dylib.rust",
411 srcs: ["foo.rs"],
412 crate_name: "foo",
413 apex_available: ["myapex"],
414 }
415
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900416 rust_ffi_shared {
417 name: "libfoo.ffi",
418 srcs: ["foo.rs"],
419 crate_name: "foo",
420 apex_available: ["myapex"],
421 }
422
423 rust_ffi_shared {
424 name: "libbar.ffi",
425 srcs: ["foo.rs"],
426 crate_name: "bar",
427 apex_available: ["myapex"],
428 }
429
Paul Duffindddd5462020-04-07 15:25:44 +0100430 cc_library_shared {
Jiyong Park25fc6a92018-11-18 18:02:45 +0900431 name: "mylib2",
432 srcs: ["mylib.cpp"],
433 system_shared_libs: [],
434 stl: "none",
Jiyong Park9918e1a2020-03-17 19:16:40 +0900435 static_libs: ["libstatic"],
436 // TODO: remove //apex_available:platform
437 apex_available: [
438 "//apex_available:platform",
439 "myapex",
440 ],
441 }
442
Paul Duffindddd5462020-04-07 15:25:44 +0100443 cc_prebuilt_library_shared {
444 name: "mylib2",
445 srcs: ["prebuilt.so"],
446 // TODO: remove //apex_available:platform
447 apex_available: [
448 "//apex_available:platform",
449 "myapex",
450 ],
Colin Cross49f1a8f2024-10-23 13:04:15 -0700451 }
Paul Duffindddd5462020-04-07 15:25:44 +0100452
Jiyong Park9918e1a2020-03-17 19:16:40 +0900453 cc_library_static {
454 name: "libstatic",
455 srcs: ["mylib.cpp"],
456 system_shared_libs: [],
457 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000458 // TODO: remove //apex_available:platform
459 apex_available: [
460 "//apex_available:platform",
461 "myapex",
462 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900463 }
Jiyong Park7f7766d2019-07-25 22:02:35 +0900464
465 java_library {
466 name: "myjar",
467 srcs: ["foo/bar/MyClass.java"],
Jiyong Parka62aa232020-05-28 23:46:55 +0900468 stem: "myjar_stem",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900469 sdk_version: "none",
470 system_modules: "none",
Jiyong Park7f7766d2019-07-25 22:02:35 +0900471 static_libs: ["myotherjar"],
Jiyong Park3ff16992019-12-27 14:11:47 +0900472 libs: ["mysharedjar"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000473 // TODO: remove //apex_available:platform
474 apex_available: [
475 "//apex_available:platform",
476 "myapex",
477 ],
Colin Crosse4f34882024-11-14 12:26:00 -0800478 compile_dex: true,
Jiyong Park7f7766d2019-07-25 22:02:35 +0900479 }
480
Jiyong Park77acec62020-06-01 21:39:15 +0900481 dex_import {
482 name: "myjar_dex",
483 jars: ["prebuilt.jar"],
484 apex_available: [
485 "//apex_available:platform",
486 "myapex",
487 ],
488 }
489
Jiyong Park7f7766d2019-07-25 22:02:35 +0900490 java_library {
491 name: "myotherjar",
492 srcs: ["foo/bar/MyClass.java"],
493 sdk_version: "none",
494 system_modules: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +0900495 // TODO: remove //apex_available:platform
496 apex_available: [
497 "//apex_available:platform",
498 "myapex",
499 ],
Jiyong Park7f7766d2019-07-25 22:02:35 +0900500 }
Jiyong Park3ff16992019-12-27 14:11:47 +0900501
502 java_library {
503 name: "mysharedjar",
504 srcs: ["foo/bar/MyClass.java"],
505 sdk_version: "none",
506 system_modules: "none",
Jiyong Park3ff16992019-12-27 14:11:47 +0900507 }
Jiyong Park25fc6a92018-11-18 18:02:45 +0900508 `)
509
Jooyung Hana0503a52023-08-23 13:12:50 +0900510 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900511
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900512 // Make sure that Android.mk is created
Jooyung Hana0503a52023-08-23 13:12:50 +0900513 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -0700514 data := android.AndroidMkDataForTest(t, ctx, ab)
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900515 var builder strings.Builder
516 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
517
518 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +0000519 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Jiyong Park9e83f0b2020-06-11 00:35:03 +0900520 ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
521
Jiyong Park42cca6c2019-04-01 11:15:50 +0900522 optFlags := apexRule.Args["opt_flags"]
523 ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
Jaewoong Jung14f5ff62019-06-18 13:09:13 -0700524 // Ensure that the NOTICE output is being packaged as an asset.
Jooyung Hana0503a52023-08-23 13:12:50 +0900525 ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex/NOTICE")
Jiyong Park42cca6c2019-04-01 11:15:50 +0900526
Jiyong Park25fc6a92018-11-18 18:02:45 +0900527 copyCmds := apexRule.Args["copy_commands"]
528
529 // Ensure that main rule creates an output
530 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
531
532 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -0700533 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
534 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
535 ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900536 ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900537 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900538
539 // Ensure that apex variant is created for the indirect dep
Colin Crossaede88c2020-08-11 12:17:01 -0700540 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
541 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
Jiyong Park99644e92020-11-17 22:21:02 +0900542 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
543 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700544 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.transitive.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900545 ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900546 ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +0900547
548 // Ensure that both direct and indirect deps are copied into apex
Alex Light5098a612018-11-29 17:12:15 -0800549 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
550 ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Jiyong Parka62aa232020-05-28 23:46:55 +0900551 ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
Jiyong Park77acec62020-06-01 21:39:15 +0900552 ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
Jiyong Park99644e92020-11-17 22:21:02 +0900553 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
Colin Cross49f1a8f2024-10-23 13:04:15 -0700554 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.transitive.dylib.rust.dylib.so")
Jiyong Parkf2cc1b72020-12-09 00:20:45 +0900555 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
556 ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
Jiyong Park94e22fd2021-04-08 18:19:15 +0900557 ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900558 // .. but not for java libs
559 ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
Jiyong Park3ff16992019-12-27 14:11:47 +0900560 ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
Logan Chien3aeedc92018-12-26 15:32:21 +0800561
Colin Cross7113d202019-11-20 16:39:12 -0800562 // Ensure that the platform variant ends with _shared or _common
563 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
564 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Jiyong Park7f7766d2019-07-25 22:02:35 +0900565 ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
566 ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
Jiyong Park3ff16992019-12-27 14:11:47 +0900567 ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
568
569 // Ensure that dynamic dependency to java libs are not included
570 ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
Alex Light3d673592019-01-18 14:37:31 -0800571
572 // Ensure that all symlinks are present.
573 found_foo_link_64 := false
574 found_foo := false
575 for _, cmd := range strings.Split(copyCmds, " && ") {
Jiyong Park7cd10e32020-01-14 09:22:18 +0900576 if strings.HasPrefix(cmd, "ln -sfn foo64") {
Alex Light3d673592019-01-18 14:37:31 -0800577 if strings.HasSuffix(cmd, "bin/foo") {
578 found_foo = true
579 } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
580 found_foo_link_64 = true
581 }
582 }
583 }
584 good := found_foo && found_foo_link_64
585 if !good {
586 t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
587 }
Jiyong Park52818fc2019-03-18 12:01:38 +0900588
Colin Crossf61d03d2023-11-02 16:56:39 -0700589 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
590 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100591 ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100592 ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
593 ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
594 ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
Artur Satayeva8bd1132020-04-27 18:07:06 +0100595
Colin Crossf61d03d2023-11-02 16:56:39 -0700596 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
597 ctx.ModuleForTests("myapex", "android_common_myapex").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100598 ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +0100599 ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
600 ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
601 ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
Alex Light5098a612018-11-29 17:12:15 -0800602}
603
Jooyung Hanf21c7972019-12-16 22:32:06 +0900604func TestDefaults(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700605 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800606 ctx := testApex(t, `
Jooyung Hanf21c7972019-12-16 22:32:06 +0900607 apex_defaults {
608 name: "myapex-defaults",
609 key: "myapex.key",
610 prebuilts: ["myetc"],
611 native_shared_libs: ["mylib"],
612 java_libs: ["myjar"],
613 apps: ["AppFoo"],
Jiyong Park69aeba92020-04-24 21:16:36 +0900614 rros: ["rro"],
Ken Chen5372a242022-07-07 17:48:06 +0800615 bpfs: ["bpf", "netdTest"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000616 updatable: false,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900617 }
618
619 prebuilt_etc {
620 name: "myetc",
621 src: "myprebuilt",
622 }
623
624 apex {
625 name: "myapex",
626 defaults: ["myapex-defaults"],
627 }
628
629 apex_key {
630 name: "myapex.key",
631 public_key: "testkey.avbpubkey",
632 private_key: "testkey.pem",
633 }
634
635 cc_library {
636 name: "mylib",
637 system_shared_libs: [],
638 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000639 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900640 }
641
642 java_library {
643 name: "myjar",
644 srcs: ["foo/bar/MyClass.java"],
645 sdk_version: "none",
646 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000647 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -0800648 compile_dex: true,
Jooyung Hanf21c7972019-12-16 22:32:06 +0900649 }
650
651 android_app {
652 name: "AppFoo",
653 srcs: ["foo/bar/MyClass.java"],
654 sdk_version: "none",
655 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000656 apex_available: [ "myapex" ],
Jooyung Hanf21c7972019-12-16 22:32:06 +0900657 }
Jiyong Park69aeba92020-04-24 21:16:36 +0900658
659 runtime_resource_overlay {
660 name: "rro",
661 theme: "blue",
662 }
663
markchien2f59ec92020-09-02 16:23:38 +0800664 bpf {
665 name: "bpf",
666 srcs: ["bpf.c", "bpf2.c"],
667 }
668
Ken Chenfad7f9d2021-11-10 22:02:57 +0800669 bpf {
Ken Chen5372a242022-07-07 17:48:06 +0800670 name: "netdTest",
671 srcs: ["netdTest.c"],
Ken Chenfad7f9d2021-11-10 22:02:57 +0800672 sub_dir: "netd",
673 }
674
Jooyung Hanf21c7972019-12-16 22:32:06 +0900675 `)
Jooyung Hana0503a52023-08-23 13:12:50 +0900676 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Hanf21c7972019-12-16 22:32:06 +0900677 "etc/myetc",
678 "javalib/myjar.jar",
679 "lib64/mylib.so",
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +0000680 "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
Jiyong Park69aeba92020-04-24 21:16:36 +0900681 "overlay/blue/rro.apk",
markchien2f59ec92020-09-02 16:23:38 +0800682 "etc/bpf/bpf.o",
683 "etc/bpf/bpf2.o",
Ken Chen5372a242022-07-07 17:48:06 +0800684 "etc/bpf/netd/netdTest.o",
Jooyung Hanf21c7972019-12-16 22:32:06 +0900685 })
686}
687
Jooyung Han01a3ee22019-11-02 02:52:25 +0900688func TestApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700689 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800690 ctx := testApex(t, `
Jooyung Han01a3ee22019-11-02 02:52:25 +0900691 apex {
692 name: "myapex",
693 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000694 updatable: false,
Jooyung Han01a3ee22019-11-02 02:52:25 +0900695 }
696
697 apex_key {
698 name: "myapex.key",
699 public_key: "testkey.avbpubkey",
700 private_key: "testkey.pem",
701 }
702 `)
703
Jooyung Hana0503a52023-08-23 13:12:50 +0900704 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +0900705 args := module.Rule("apexRule").Args
706 if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
707 t.Error("manifest should be apex_manifest.pb, but " + manifest)
708 }
Jooyung Han01a3ee22019-11-02 02:52:25 +0900709}
710
Liz Kammer4854a7d2021-05-27 14:28:27 -0400711func TestApexManifestMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700712 t.Parallel()
Liz Kammer4854a7d2021-05-27 14:28:27 -0400713 ctx := testApex(t, `
714 apex_defaults {
715 name: "my_defaults",
716 key: "myapex.key",
717 product_specific: true,
718 file_contexts: ":my-file-contexts",
719 updatable: false,
720 }
721 apex {
722 name: "myapex_30",
723 min_sdk_version: "30",
724 defaults: ["my_defaults"],
725 }
726
727 apex {
728 name: "myapex_current",
729 min_sdk_version: "current",
730 defaults: ["my_defaults"],
731 }
732
733 apex {
734 name: "myapex_none",
735 defaults: ["my_defaults"],
736 }
737
738 apex_key {
739 name: "myapex.key",
740 public_key: "testkey.avbpubkey",
741 private_key: "testkey.pem",
742 }
743
744 filegroup {
745 name: "my-file-contexts",
746 srcs: ["product_specific_file_contexts"],
747 }
748 `, withFiles(map[string][]byte{
749 "product_specific_file_contexts": nil,
750 }), android.FixtureModifyProductVariables(
751 func(variables android.FixtureProductVariables) {
752 variables.Unbundled_build = proptools.BoolPtr(true)
753 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
754 }), android.FixtureMergeEnv(map[string]string{
755 "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
756 }))
757
758 testCases := []struct {
759 module string
760 minSdkVersion string
761 }{
762 {
763 module: "myapex_30",
764 minSdkVersion: "30",
765 },
766 {
767 module: "myapex_current",
768 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
769 },
770 {
771 module: "myapex_none",
772 minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
773 },
774 }
775 for _, tc := range testCases {
Jooyung Hana0503a52023-08-23 13:12:50 +0900776 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
Liz Kammer4854a7d2021-05-27 14:28:27 -0400777 args := module.Rule("apexRule").Args
778 optFlags := args["opt_flags"]
779 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
780 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
781 }
782 }
783}
784
Jihoon Kang842b9992024-02-08 01:41:51 +0000785func TestApexWithDessertSha(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700786 t.Parallel()
Jihoon Kang842b9992024-02-08 01:41:51 +0000787 ctx := testApex(t, `
788 apex_defaults {
789 name: "my_defaults",
790 key: "myapex.key",
791 product_specific: true,
792 file_contexts: ":my-file-contexts",
793 updatable: false,
794 }
795 apex {
796 name: "myapex_30",
797 min_sdk_version: "30",
798 defaults: ["my_defaults"],
799 }
800
801 apex {
802 name: "myapex_current",
803 min_sdk_version: "current",
804 defaults: ["my_defaults"],
805 }
806
807 apex {
808 name: "myapex_none",
809 defaults: ["my_defaults"],
810 }
811
812 apex_key {
813 name: "myapex.key",
814 public_key: "testkey.avbpubkey",
815 private_key: "testkey.pem",
816 }
817
818 filegroup {
819 name: "my-file-contexts",
820 srcs: ["product_specific_file_contexts"],
821 }
822 `, withFiles(map[string][]byte{
823 "product_specific_file_contexts": nil,
824 }), android.FixtureModifyProductVariables(
825 func(variables android.FixtureProductVariables) {
826 variables.Unbundled_build = proptools.BoolPtr(true)
827 variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
828 }), android.FixtureMergeEnv(map[string]string{
829 "UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA": "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
830 }))
831
832 testCases := []struct {
833 module string
834 minSdkVersion string
835 }{
836 {
837 module: "myapex_30",
838 minSdkVersion: "30",
839 },
840 {
841 module: "myapex_current",
842 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
843 },
844 {
845 module: "myapex_none",
846 minSdkVersion: "UpsideDownCake.abcdefghijklmnopqrstuvwxyz123456",
847 },
848 }
849 for _, tc := range testCases {
850 module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module)
851 args := module.Rule("apexRule").Args
852 optFlags := args["opt_flags"]
853 if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
854 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
855 }
856 }
857}
858
Jooyung Hanaf730952023-02-28 14:13:38 +0900859func TestFileContexts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700860 t.Parallel()
Jooyung Hanbe953902023-05-31 16:42:16 +0900861 for _, vendor := range []bool{true, false} {
Jooyung Hanaf730952023-02-28 14:13:38 +0900862 prop := ""
Jooyung Hanbe953902023-05-31 16:42:16 +0900863 if vendor {
864 prop = "vendor: true,\n"
Jooyung Hanaf730952023-02-28 14:13:38 +0900865 }
866 ctx := testApex(t, `
867 apex {
868 name: "myapex",
869 key: "myapex.key",
Jooyung Hanaf730952023-02-28 14:13:38 +0900870 updatable: false,
Jooyung Hanaf730952023-02-28 14:13:38 +0900871 `+prop+`
872 }
873
874 apex_key {
875 name: "myapex.key",
876 public_key: "testkey.avbpubkey",
877 private_key: "testkey.pem",
878 }
Jooyung Hanbe953902023-05-31 16:42:16 +0900879 `)
Jooyung Hanaf730952023-02-28 14:13:38 +0900880
Jooyung Hana0503a52023-08-23 13:12:50 +0900881 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("file_contexts")
Jooyung Hanbe953902023-05-31 16:42:16 +0900882 if vendor {
883 android.AssertStringDoesContain(t, "should force-label as vendor_apex_metadata_file",
884 rule.RuleParams.Command,
885 "apex_manifest\\\\.pb u:object_r:vendor_apex_metadata_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900886 } else {
Jooyung Hanbe953902023-05-31 16:42:16 +0900887 android.AssertStringDoesContain(t, "should force-label as system_file",
888 rule.RuleParams.Command,
889 "apex_manifest\\\\.pb u:object_r:system_file:s0")
Jooyung Hanaf730952023-02-28 14:13:38 +0900890 }
891 }
892}
893
Jiyong Park25fc6a92018-11-18 18:02:45 +0900894func TestApexWithStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -0700895 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -0800896 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +0900897 apex {
898 name: "myapex",
899 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000900 native_shared_libs: [
901 "mylib",
902 "mylib3",
903 "libmylib3_rs",
904 ],
Jiyong Park105dc322021-06-11 17:22:09 +0900905 binaries: ["foo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +0000906 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +0900907 }
908
909 apex_key {
910 name: "myapex.key",
911 public_key: "testkey.avbpubkey",
912 private_key: "testkey.pem",
913 }
914
915 cc_library {
916 name: "mylib",
917 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000918 shared_libs: [
919 "mylib2",
920 "mylib3#impl",
921 "libmylib2_rs",
922 "libmylib3_rs#impl",
923 "my_prebuilt_platform_lib",
924 "my_prebuilt_platform_stub_only_lib",
925 ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900926 system_shared_libs: [],
927 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000928 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900929 }
930
931 cc_library {
932 name: "mylib2",
933 srcs: ["mylib.cpp"],
Jiyong Park64379952018-12-13 18:37:29 +0900934 cflags: ["-include mylib.h"],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900935 system_shared_libs: [],
936 stl: "none",
937 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000938 symbol_file: "mylib2.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900939 versions: ["1", "2", "3"],
940 },
941 }
942
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000943 rust_ffi {
944 name: "libmylib2_rs",
945 crate_name: "mylib2",
946 srcs: ["mylib.rs"],
947 stubs: {
948 symbol_file: "mylib2.map.txt",
949 versions: ["1", "2", "3"],
950 },
951 }
952
Jiyong Park25fc6a92018-11-18 18:02:45 +0900953 cc_library {
954 name: "mylib3",
Jiyong Park28d395a2018-12-07 22:42:47 +0900955 srcs: ["mylib.cpp"],
956 shared_libs: ["mylib4"],
957 system_shared_libs: [],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900958 stl: "none",
959 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +0000960 symbol_file: "mylib3.map.txt",
Jiyong Park25fc6a92018-11-18 18:02:45 +0900961 versions: ["10", "11", "12"],
962 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000963 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +0900964 }
Jiyong Park28d395a2018-12-07 22:42:47 +0900965
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000966 rust_ffi {
967 name: "libmylib3_rs",
968 crate_name: "mylib3",
969 srcs: ["mylib.rs"],
970 shared_libs: ["mylib4.from_rust"],
971 stubs: {
972 symbol_file: "mylib3.map.txt",
973 versions: ["10", "11", "12"],
974 },
975 apex_available: [ "myapex" ],
976 }
977
Jiyong Park28d395a2018-12-07 22:42:47 +0900978 cc_library {
979 name: "mylib4",
980 srcs: ["mylib.cpp"],
981 system_shared_libs: [],
982 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +0000983 apex_available: [ "myapex" ],
Jiyong Park28d395a2018-12-07 22:42:47 +0900984 }
Jiyong Park105dc322021-06-11 17:22:09 +0900985
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +0000986 cc_library {
987 name: "mylib4.from_rust",
988 srcs: ["mylib.cpp"],
989 system_shared_libs: [],
990 stl: "none",
991 apex_available: [ "myapex" ],
992 }
993
Spandan Das357ffcc2024-07-24 18:07:48 +0000994 cc_prebuilt_library_shared {
995 name: "my_prebuilt_platform_lib",
996 stubs: {
997 symbol_file: "my_prebuilt_platform_lib.map.txt",
998 versions: ["1", "2", "3"],
999 },
1000 srcs: ["foo.so"],
1001 }
1002
1003 // Similar to my_prebuilt_platform_lib, but this library only provides stubs, i.e. srcs is empty
1004 cc_prebuilt_library_shared {
1005 name: "my_prebuilt_platform_stub_only_lib",
1006 stubs: {
1007 symbol_file: "my_prebuilt_platform_stub_only_lib.map.txt",
1008 versions: ["1", "2", "3"],
1009 }
1010 }
1011
Jiyong Park105dc322021-06-11 17:22:09 +09001012 rust_binary {
1013 name: "foo.rust",
1014 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001015 shared_libs: [
1016 "libfoo.shared_from_rust",
1017 "libfoo_rs.shared_from_rust",
1018 ],
Jiyong Park105dc322021-06-11 17:22:09 +09001019 prefer_rlib: true,
1020 apex_available: ["myapex"],
1021 }
1022
1023 cc_library_shared {
1024 name: "libfoo.shared_from_rust",
1025 srcs: ["mylib.cpp"],
1026 system_shared_libs: [],
1027 stl: "none",
1028 stubs: {
1029 versions: ["10", "11", "12"],
1030 },
1031 }
1032
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001033 rust_ffi {
1034 name: "libfoo_rs.shared_from_rust",
1035 crate_name: "foo_rs",
1036 srcs: ["mylib.rs"],
1037 stubs: {
1038 versions: ["10", "11", "12"],
1039 },
1040 }
1041
Jiyong Park25fc6a92018-11-18 18:02:45 +09001042 `)
1043
Jooyung Hana0503a52023-08-23 13:12:50 +09001044 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001045 copyCmds := apexRule.Args["copy_commands"]
1046
1047 // Ensure that direct non-stubs dep is always included
Alex Light5098a612018-11-29 17:12:15 -08001048 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001049
1050 // Ensure that indirect stubs dep is not included
Alex Light5098a612018-11-29 17:12:15 -08001051 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001052 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001053
1054 // Ensure that direct stubs dep is included
Alex Light5098a612018-11-29 17:12:15 -08001055 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001056 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001057
Colin Crossaede88c2020-08-11 12:17:01 -07001058 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09001059
1060 // Ensure that mylib is linking with the latest version of stubs for mylib2
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001061 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001062 ensureContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001063 // ... and not linking to the non-stub (impl) variant of mylib2
Jiyong Park3ff16992019-12-27 14:11:47 +09001064 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001065 ensureNotContains(t, mylibLdFlags, "libmylib2_rs/android_arm64_armv8-a_shared/unstripped/libmylib2_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001066
Colin Crossea91a172024-11-05 16:14:05 -08001067 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Crossaede88c2020-08-11 12:17:01 -07001068 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001069 ensureContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_apex10000/unstripped/libmylib3_rs.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001070 // .. and not linking to the stubs variant of mylib3
Colin Crossaede88c2020-08-11 12:17:01 -07001071 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001072 ensureNotContains(t, mylibLdFlags, "libmylib3_rs/android_arm64_armv8-a_shared_12/unstripped/mylib3.so")
Jiyong Park64379952018-12-13 18:37:29 +09001073
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001074 // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
1075 // is replaced by sharing of "cFlags" in cc/builder.go.
1076 // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
1077 // module variable representing "cflags". So it was not detected by ensureNotContains.
1078 // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
1079 // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
1080 // including the original cflags's "-include mylib.h".
1081 //
Jiyong Park64379952018-12-13 18:37:29 +09001082 // Ensure that stubs libs are built without -include flags
Chih-Hung Hsiehb8082292021-09-09 23:20:39 -07001083 // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1084 // ensureNotContains(t, mylib2Cflags, "-include ")
Jiyong Park3fd0baf2018-12-07 16:25:39 +09001085
Jiyong Park85cc35a2022-07-17 11:30:47 +09001086 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1087 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001088 ensureContains(t, ctx.ModuleForTests("libmylib2_rs", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park85cc35a2022-07-17 11:30:47 +09001089 // Ensure that genstub for apex-provided lib is invoked with --apex
1090 ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001091 ensureContains(t, ctx.ModuleForTests("libmylib3_rs", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
Jooyung Han671f1ce2019-12-17 12:47:13 +09001092
Jooyung Hana0503a52023-08-23 13:12:50 +09001093 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han671f1ce2019-12-17 12:47:13 +09001094 "lib64/mylib.so",
1095 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001096 "lib64/libmylib3_rs.so",
Jooyung Han671f1ce2019-12-17 12:47:13 +09001097 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001098 "lib64/mylib4.from_rust.so",
Jiyong Park105dc322021-06-11 17:22:09 +09001099 "bin/foo.rust",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001100
1101 "lib64/libstd.dylib.so", // implicit rust ffi dep
Jooyung Han671f1ce2019-12-17 12:47:13 +09001102 })
Jiyong Park105dc322021-06-11 17:22:09 +09001103
1104 // Ensure that stub dependency from a rust module is not included
1105 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001106 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001107 // The rust module is linked to the stub cc library
Colin Cross004bd3f2023-10-02 11:39:17 -07001108 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park105dc322021-06-11 17:22:09 +09001109 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001110 ensureContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park105dc322021-06-11 17:22:09 +09001111 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001112 ensureNotContains(t, rustDeps, "libfoo_rs.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rs.shared_from_rust.so")
Jiyong Park34d5c332022-02-24 18:02:44 +09001113
Jooyung Hana0503a52023-08-23 13:12:50 +09001114 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jiyong Park34d5c332022-02-24 18:02:44 +09001115 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001116 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.shared_from_rust.so")
Spandan Das357ffcc2024-07-24 18:07:48 +00001117
1118 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1119 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_lib.so")
1120 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1121 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_lib.so")
1122 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1123 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
1124
1125 // Ensure that mylib is linking with the latest version of stubs for my_prebuilt_platform_lib
1126 ensureContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared_current/my_prebuilt_platform_stub_only_lib.so")
1127 // ... and not linking to the non-stub (impl) variant of my_prebuilt_platform_lib
1128 ensureNotContains(t, mylibLdFlags, "my_prebuilt_platform_stub_only_lib/android_arm64_armv8-a_shared/my_prebuilt_platform_stub_only_lib.so")
1129 // Ensure that genstub for platform-provided lib is invoked with --systemapi
1130 ensureContains(t, ctx.ModuleForTests("my_prebuilt_platform_stub_only_lib", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
Jiyong Park25fc6a92018-11-18 18:02:45 +09001131}
1132
Jooyung Han20348752023-12-05 15:23:56 +09001133func TestApexShouldNotEmbedStubVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001134 t.Parallel()
Jooyung Han20348752023-12-05 15:23:56 +09001135 testApexError(t, `module "myapex" .*: native_shared_libs: "libbar" is a stub`, `
1136 apex {
1137 name: "myapex",
1138 key: "myapex.key",
1139 vendor: true,
1140 updatable: false,
1141 native_shared_libs: ["libbar"], // should not add an LLNDK stub in a vendor apex
1142 }
1143
1144 apex_key {
1145 name: "myapex.key",
1146 public_key: "testkey.avbpubkey",
1147 private_key: "testkey.pem",
1148 }
1149
1150 cc_library {
1151 name: "libbar",
1152 srcs: ["mylib.cpp"],
1153 llndk: {
1154 symbol_file: "libbar.map.txt",
1155 }
1156 }
1157 `)
1158}
1159
Jiyong Park1bc84122021-06-22 20:23:05 +09001160func TestApexCanUsePrivateApis(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001161 t.Parallel()
Jiyong Park1bc84122021-06-22 20:23:05 +09001162 ctx := testApex(t, `
1163 apex {
1164 name: "myapex",
1165 key: "myapex.key",
1166 native_shared_libs: ["mylib"],
1167 binaries: ["foo.rust"],
1168 updatable: false,
1169 platform_apis: true,
1170 }
1171
1172 apex_key {
1173 name: "myapex.key",
1174 public_key: "testkey.avbpubkey",
1175 private_key: "testkey.pem",
1176 }
1177
1178 cc_library {
1179 name: "mylib",
1180 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001181 shared_libs: [
1182 "mylib2",
1183 "libmylib2_rust"
1184 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001185 system_shared_libs: [],
1186 stl: "none",
1187 apex_available: [ "myapex" ],
1188 }
1189
1190 cc_library {
1191 name: "mylib2",
1192 srcs: ["mylib.cpp"],
1193 cflags: ["-include mylib.h"],
1194 system_shared_libs: [],
1195 stl: "none",
1196 stubs: {
1197 versions: ["1", "2", "3"],
1198 },
1199 }
1200
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001201 rust_ffi {
1202 name: "libmylib2_rust",
1203 crate_name: "mylib2_rust",
1204 srcs: ["mylib.rs"],
1205 stubs: {
1206 versions: ["1", "2", "3"],
1207 },
1208 }
1209
Jiyong Park1bc84122021-06-22 20:23:05 +09001210 rust_binary {
1211 name: "foo.rust",
1212 srcs: ["foo.rs"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001213 shared_libs: [
1214 "libfoo.shared_from_rust",
1215 "libmylib_rust.shared_from_rust"
1216 ],
Jiyong Park1bc84122021-06-22 20:23:05 +09001217 prefer_rlib: true,
1218 apex_available: ["myapex"],
1219 }
1220
1221 cc_library_shared {
1222 name: "libfoo.shared_from_rust",
1223 srcs: ["mylib.cpp"],
1224 system_shared_libs: [],
1225 stl: "none",
1226 stubs: {
1227 versions: ["10", "11", "12"],
1228 },
1229 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001230 rust_ffi {
1231 name: "libmylib_rust.shared_from_rust",
1232 crate_name: "mylib_rust",
1233 srcs: ["mylib.rs"],
1234 stubs: {
1235 versions: ["1", "2", "3"],
1236 },
1237 }
1238
Jiyong Park1bc84122021-06-22 20:23:05 +09001239 `)
1240
Jooyung Hana0503a52023-08-23 13:12:50 +09001241 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park1bc84122021-06-22 20:23:05 +09001242 copyCmds := apexRule.Args["copy_commands"]
1243
1244 // Ensure that indirect stubs dep is not included
1245 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001246 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.so")
1247 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001248 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
1249
1250 // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
1251 // of the platform_apis: true)
Jiyong Parkd4a00632022-04-12 12:23:20 +09001252 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001253 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
1254 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001255 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
1256 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross004bd3f2023-10-02 11:39:17 -07001257 rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustc").Args["linkFlags"]
Jiyong Park1bc84122021-06-22 20:23:05 +09001258 ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
1259 ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001260 ensureNotContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib_rust.shared_from_rust.so")
1261 ensureContains(t, rustDeps, "libmylib_rust.shared_from_rust/android_arm64_armv8-a_shared/unstripped/libmylib_rust.shared_from_rust.so")
Jiyong Park1bc84122021-06-22 20:23:05 +09001262}
1263
Colin Cross7812fd32020-09-25 12:35:10 -07001264func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
1265 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001266 ctx := testApex(t, `
Colin Cross7812fd32020-09-25 12:35:10 -07001267 apex {
1268 name: "myapex",
1269 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001270 native_shared_libs: [
1271 "mylib",
1272 "mylib3",
1273 "libmylib3_rust",
1274 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001275 min_sdk_version: "29",
1276 }
1277
1278 apex_key {
1279 name: "myapex.key",
1280 public_key: "testkey.avbpubkey",
1281 private_key: "testkey.pem",
1282 }
1283
1284 cc_library {
1285 name: "mylib",
1286 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001287 shared_libs: [
1288 "mylib2",
1289 "mylib3#impl",
1290 "libmylib2_rust",
1291 "libmylib3_rust#impl",
1292 ],
Colin Cross7812fd32020-09-25 12:35:10 -07001293 system_shared_libs: [],
1294 stl: "none",
1295 apex_available: [ "myapex" ],
1296 min_sdk_version: "28",
1297 }
1298
1299 cc_library {
1300 name: "mylib2",
1301 srcs: ["mylib.cpp"],
1302 cflags: ["-include mylib.h"],
1303 system_shared_libs: [],
1304 stl: "none",
1305 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001306 symbol_file: "mylib2.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001307 versions: ["28", "29", "30", "current"],
1308 },
1309 min_sdk_version: "28",
1310 }
1311
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001312 rust_ffi {
1313 name: "libmylib2_rust",
1314 crate_name: "mylib2_rust",
1315 srcs: ["mylib.rs"],
1316 stubs: {
1317 symbol_file: "mylib2.map.txt",
1318 versions: ["28", "29", "30", "current"],
1319 },
1320 min_sdk_version: "28",
1321 }
1322
Colin Cross7812fd32020-09-25 12:35:10 -07001323 cc_library {
1324 name: "mylib3",
1325 srcs: ["mylib.cpp"],
1326 shared_libs: ["mylib4"],
1327 system_shared_libs: [],
1328 stl: "none",
1329 stubs: {
Spandan Das357ffcc2024-07-24 18:07:48 +00001330 symbol_file: "mylib3.map.txt",
Colin Cross7812fd32020-09-25 12:35:10 -07001331 versions: ["28", "29", "30", "current"],
1332 },
1333 apex_available: [ "myapex" ],
1334 min_sdk_version: "28",
1335 }
1336
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001337 rust_ffi {
1338 name: "libmylib3_rust",
1339 crate_name: "mylib3_rust",
1340 srcs: ["mylib.rs"],
1341 shared_libs: ["libmylib4.from_rust"],
1342 stubs: {
1343 symbol_file: "mylib3.map.txt",
1344 versions: ["28", "29", "30", "current"],
1345 },
1346 apex_available: [ "myapex" ],
1347 min_sdk_version: "28",
1348 }
1349
Colin Cross7812fd32020-09-25 12:35:10 -07001350 cc_library {
1351 name: "mylib4",
1352 srcs: ["mylib.cpp"],
1353 system_shared_libs: [],
1354 stl: "none",
1355 apex_available: [ "myapex" ],
1356 min_sdk_version: "28",
1357 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001358
1359 rust_ffi {
1360 name: "libmylib4.from_rust",
1361 crate_name: "mylib4",
1362 srcs: ["mylib.rs"],
1363 apex_available: [ "myapex" ],
1364 min_sdk_version: "28",
1365 }
Colin Cross7812fd32020-09-25 12:35:10 -07001366 `)
1367
Jooyung Hana0503a52023-08-23 13:12:50 +09001368 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Colin Cross7812fd32020-09-25 12:35:10 -07001369 copyCmds := apexRule.Args["copy_commands"]
1370
1371 // Ensure that direct non-stubs dep is always included
1372 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001373 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1374 ensureContains(t, copyCmds, "image.apex/lib64/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001375
1376 // Ensure that indirect stubs dep is not included
1377 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001378 ensureNotContains(t, copyCmds, "image.apex/lib64/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001379
1380 // Ensure that direct stubs dep is included
1381 ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
1382
1383 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
1384
Jiyong Park55549df2021-02-26 23:57:23 +09001385 // Ensure that mylib is linking with the latest version of stub for mylib2
1386 ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001387 ensureContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared_current/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001388 // ... and not linking to the non-stub (impl) variant of mylib2
1389 ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001390 ensureNotContains(t, mylibLdFlags, "libmylib2_rust/android_arm64_armv8-a_shared/unstripped/libmylib2_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001391
Colin Crossea91a172024-11-05 16:14:05 -08001392 // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because the dependency is added with mylib3#impl)
Colin Cross7812fd32020-09-25 12:35:10 -07001393 ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001394 ensureContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_apex29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001395 // .. and not linking to the stubs variant of mylib3
1396 ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001397 ensureNotContains(t, mylibLdFlags, "libmylib3_rust/android_arm64_armv8-a_shared_29/unstripped/libmylib3_rust.so")
Colin Cross7812fd32020-09-25 12:35:10 -07001398
1399 // Ensure that stubs libs are built without -include flags
Colin Crossa717db72020-10-23 14:53:06 -07001400 mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
Colin Cross7812fd32020-09-25 12:35:10 -07001401 ensureNotContains(t, mylib2Cflags, "-include ")
1402
Jiyong Park85cc35a2022-07-17 11:30:47 +09001403 // Ensure that genstub is invoked with --systemapi
1404 ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001405 ensureContains(t, ctx.ModuleForTests("libmylib2_rust", "android_arm64_armv8-a_shared_29").Rule("cc.genStubSrc").Args["flags"], "--systemapi")
Colin Cross7812fd32020-09-25 12:35:10 -07001406
Jooyung Hana0503a52023-08-23 13:12:50 +09001407 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Colin Cross7812fd32020-09-25 12:35:10 -07001408 "lib64/mylib.so",
1409 "lib64/mylib3.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001410 "lib64/libmylib3_rust.so",
Colin Cross7812fd32020-09-25 12:35:10 -07001411 "lib64/mylib4.so",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001412 "lib64/libmylib4.from_rust.so",
1413
1414 "lib64/libstd.dylib.so", // by the implicit dependency from foo.rust
Colin Cross7812fd32020-09-25 12:35:10 -07001415 })
1416}
1417
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001418func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
1419 t.Parallel()
1420 // myapex (Z)
1421 // mylib -----------------.
1422 // |
1423 // otherapex (29) |
1424 // libstub's versions: 29 Z current
1425 // |
1426 // <platform> |
1427 // libplatform ----------------'
Colin Cross1c460562021-02-16 17:55:47 -08001428 ctx := testApex(t, `
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001429 apex {
1430 name: "myapex",
1431 key: "myapex.key",
1432 native_shared_libs: ["mylib"],
1433 min_sdk_version: "Z", // non-final
1434 }
1435
1436 cc_library {
1437 name: "mylib",
1438 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001439 shared_libs: [
1440 "libstub",
1441 "libstub_rust",
1442 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001443 apex_available: ["myapex"],
1444 min_sdk_version: "Z",
1445 }
1446
1447 apex_key {
1448 name: "myapex.key",
1449 public_key: "testkey.avbpubkey",
1450 private_key: "testkey.pem",
1451 }
1452
1453 apex {
1454 name: "otherapex",
1455 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001456 native_shared_libs: [
1457 "libstub",
1458 "libstub_rust",
1459 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001460 min_sdk_version: "29",
1461 }
1462
1463 cc_library {
1464 name: "libstub",
1465 srcs: ["mylib.cpp"],
1466 stubs: {
1467 versions: ["29", "Z", "current"],
1468 },
1469 apex_available: ["otherapex"],
1470 min_sdk_version: "29",
1471 }
1472
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001473 rust_ffi {
1474 name: "libstub_rust",
1475 crate_name: "stub_rust",
1476 srcs: ["mylib.rs"],
1477 stubs: {
1478 versions: ["29", "Z", "current"],
1479 },
1480 apex_available: ["otherapex"],
1481 min_sdk_version: "29",
1482 }
1483
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001484 // platform module depending on libstub from otherapex should use the latest stub("current")
1485 cc_library {
1486 name: "libplatform",
1487 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001488 shared_libs: [
1489 "libstub",
1490 "libstub_rust",
1491 ],
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001492 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001493 `,
1494 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1495 variables.Platform_sdk_codename = proptools.StringPtr("Z")
1496 variables.Platform_sdk_final = proptools.BoolPtr(false)
1497 variables.Platform_version_active_codenames = []string{"Z"}
1498 }),
1499 )
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001500
Jiyong Park55549df2021-02-26 23:57:23 +09001501 // Ensure that mylib from myapex is built against the latest stub (current)
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001502 mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001503 ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001504 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1505
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001506 mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park55549df2021-02-26 23:57:23 +09001507 ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001508 ensureContains(t, mylibLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001509
1510 // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
1511 libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
1512 ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001513 // rust stubs do not emit -D__LIBFOO_API__ flags as this is deprecated behavior for cc stubs
1514
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001515 libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
1516 ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001517 ensureContains(t, libplatformLdflags, "libstub_rust/android_arm64_armv8-a_shared_current/unstripped/libstub_rust.so ")
Jooyung Han11b0fbd2021-02-05 02:28:22 +09001518}
1519
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001520func TestApexWithExplicitStubsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001521 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001522 ctx := testApex(t, `
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001523 apex {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001524 name: "myapex2",
1525 key: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001526 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001527 updatable: false,
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001528 }
1529
1530 apex_key {
Jiyong Park83dc74b2020-01-14 18:38:44 +09001531 name: "myapex2.key",
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001532 public_key: "testkey.avbpubkey",
1533 private_key: "testkey.pem",
1534 }
1535
1536 cc_library {
1537 name: "mylib",
1538 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001539 shared_libs: [
1540 "libfoo#10",
1541 "libfoo_rust#10"
1542 ],
Jiyong Park678c8812020-02-07 17:25:49 +09001543 static_libs: ["libbaz"],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001544 system_shared_libs: [],
1545 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001546 apex_available: [ "myapex2" ],
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001547 }
1548
1549 cc_library {
1550 name: "libfoo",
1551 srcs: ["mylib.cpp"],
1552 shared_libs: ["libbar"],
1553 system_shared_libs: [],
1554 stl: "none",
1555 stubs: {
1556 versions: ["10", "20", "30"],
1557 },
1558 }
1559
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001560 rust_ffi {
1561 name: "libfoo_rust",
1562 crate_name: "foo_rust",
1563 srcs: ["mylib.cpp"],
1564 shared_libs: ["libbar.from_rust"],
1565 stubs: {
1566 versions: ["10", "20", "30"],
1567 },
1568 }
1569
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001570 cc_library {
1571 name: "libbar",
1572 srcs: ["mylib.cpp"],
1573 system_shared_libs: [],
1574 stl: "none",
1575 }
1576
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001577 cc_library {
1578 name: "libbar.from_rust",
1579 srcs: ["mylib.cpp"],
1580 system_shared_libs: [],
1581 stl: "none",
1582 }
1583
Jiyong Park678c8812020-02-07 17:25:49 +09001584 cc_library_static {
1585 name: "libbaz",
1586 srcs: ["mylib.cpp"],
1587 system_shared_libs: [],
1588 stl: "none",
1589 apex_available: [ "myapex2" ],
1590 }
1591
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001592 `)
1593
Jooyung Hana0503a52023-08-23 13:12:50 +09001594 apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2").Rule("apexRule")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001595 copyCmds := apexRule.Args["copy_commands"]
1596
1597 // Ensure that direct non-stubs dep is always included
1598 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1599
1600 // Ensure that indirect stubs dep is not included
1601 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001602 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001603
1604 // Ensure that dependency of stubs is not included
1605 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001606 ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.from_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001607
Colin Crossaede88c2020-08-11 12:17:01 -07001608 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001609
1610 // Ensure that mylib is linking with version 10 of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001611 ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001612 ensureContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared_10/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001613 // ... and not linking to the non-stub (impl) variant of libfoo
Jiyong Park3ff16992019-12-27 14:11:47 +09001614 ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001615 ensureNotContains(t, mylibLdFlags, "libfoo_rust/android_arm64_armv8-a_shared/unstripped/libfoo_rust.so")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001616
Jiyong Park3ff16992019-12-27 14:11:47 +09001617 libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001618 libFooRustStubsLdFlags := ctx.ModuleForTests("libfoo_rust", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001619
1620 // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
1621 ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001622 ensureNotContains(t, libFooRustStubsLdFlags, "libbar.from_rust.so")
Jiyong Park83dc74b2020-01-14 18:38:44 +09001623
Colin Crossf61d03d2023-11-02 16:56:39 -07001624 fullDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1625 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/fulllist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001626 ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
Jiyong Park678c8812020-02-07 17:25:49 +09001627
Colin Crossf61d03d2023-11-02 16:56:39 -07001628 flatDepsInfo := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
1629 ctx.ModuleForTests("myapex2", "android_common_myapex2").Output("depsinfo/flatlist.txt")), "\n")
Artur Satayev4e1f2bd2020-05-14 15:15:01 +01001630 ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
Jiyong Park0ddfcd12018-12-11 01:35:25 +09001631}
1632
Jooyung Hand3639552019-08-09 12:57:43 +09001633func TestApexWithRuntimeLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001634 t.Parallel()
Jooyung Hand3639552019-08-09 12:57:43 +09001635 /*
1636 myapex
1637 |
1638 v (runtime_libs)
1639 mylib ------+------> libfoo [provides stub]
1640 |
1641 `------> libbar
1642 */
Colin Cross1c460562021-02-16 17:55:47 -08001643 ctx := testApex(t, `
Jooyung Hand3639552019-08-09 12:57:43 +09001644 apex {
1645 name: "myapex",
1646 key: "myapex.key",
1647 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001648 updatable: false,
Jooyung Hand3639552019-08-09 12:57:43 +09001649 }
1650
1651 apex_key {
1652 name: "myapex.key",
1653 public_key: "testkey.avbpubkey",
1654 private_key: "testkey.pem",
1655 }
1656
1657 cc_library {
1658 name: "mylib",
1659 srcs: ["mylib.cpp"],
Liz Kammer5f108fa2023-05-11 14:33:17 -04001660 static_libs: ["libstatic"],
1661 shared_libs: ["libshared"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001662 runtime_libs: [
1663 "libfoo",
1664 "libbar",
1665 "libfoo_rs",
1666 ],
Jooyung Hand3639552019-08-09 12:57:43 +09001667 system_shared_libs: [],
1668 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001669 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001670 }
1671
1672 cc_library {
1673 name: "libfoo",
1674 srcs: ["mylib.cpp"],
1675 system_shared_libs: [],
1676 stl: "none",
1677 stubs: {
1678 versions: ["10", "20", "30"],
1679 },
1680 }
1681
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001682 rust_ffi {
1683 name: "libfoo_rs",
1684 crate_name: "foo_rs",
1685 srcs: ["mylib.rs"],
1686 stubs: {
1687 versions: ["10", "20", "30"],
1688 },
1689 }
1690
Jooyung Hand3639552019-08-09 12:57:43 +09001691 cc_library {
1692 name: "libbar",
1693 srcs: ["mylib.cpp"],
1694 system_shared_libs: [],
1695 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00001696 apex_available: [ "myapex" ],
Jooyung Hand3639552019-08-09 12:57:43 +09001697 }
1698
Liz Kammer5f108fa2023-05-11 14:33:17 -04001699 cc_library {
1700 name: "libstatic",
1701 srcs: ["mylib.cpp"],
1702 system_shared_libs: [],
1703 stl: "none",
1704 apex_available: [ "myapex" ],
1705 runtime_libs: ["libstatic_to_runtime"],
1706 }
1707
1708 cc_library {
1709 name: "libshared",
1710 srcs: ["mylib.cpp"],
1711 system_shared_libs: [],
1712 stl: "none",
1713 apex_available: [ "myapex" ],
1714 runtime_libs: ["libshared_to_runtime"],
1715 }
1716
1717 cc_library {
1718 name: "libstatic_to_runtime",
1719 srcs: ["mylib.cpp"],
1720 system_shared_libs: [],
1721 stl: "none",
1722 apex_available: [ "myapex" ],
1723 }
1724
1725 cc_library {
1726 name: "libshared_to_runtime",
1727 srcs: ["mylib.cpp"],
1728 system_shared_libs: [],
1729 stl: "none",
1730 apex_available: [ "myapex" ],
1731 }
Jooyung Hand3639552019-08-09 12:57:43 +09001732 `)
1733
Jooyung Hana0503a52023-08-23 13:12:50 +09001734 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jooyung Hand3639552019-08-09 12:57:43 +09001735 copyCmds := apexRule.Args["copy_commands"]
1736
1737 // Ensure that direct non-stubs dep is always included
1738 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
1739
1740 // Ensure that indirect stubs dep is not included
1741 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001742 ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001743
1744 // Ensure that runtime_libs dep in included
1745 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
Liz Kammer5f108fa2023-05-11 14:33:17 -04001746 ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
1747 ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
1748
1749 ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001750
Jooyung Hana0503a52023-08-23 13:12:50 +09001751 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09001752 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1753 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001754 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo_rs.so")
Jooyung Hand3639552019-08-09 12:57:43 +09001755}
1756
Paul Duffina02cae32021-03-09 01:44:06 +00001757var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
1758 cc.PrepareForTestWithCcBuildComponents,
1759 PrepareForTestWithApexBuildComponents,
1760 android.FixtureAddTextFile("bionic/apex/Android.bp", `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001761 apex {
1762 name: "com.android.runtime",
1763 key: "com.android.runtime.key",
1764 native_shared_libs: ["libc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001765 updatable: false,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001766 }
1767
1768 apex_key {
1769 name: "com.android.runtime.key",
1770 public_key: "testkey.avbpubkey",
1771 private_key: "testkey.pem",
1772 }
Paul Duffina02cae32021-03-09 01:44:06 +00001773 `),
1774 android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
1775)
Jooyung Han8ce8db92020-05-15 19:05:05 +09001776
Paul Duffina02cae32021-03-09 01:44:06 +00001777func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001778 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001779 result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001780 cc_library {
1781 name: "libc",
1782 no_libcrt: true,
1783 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001784 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001785 stl: "none",
1786 system_shared_libs: [],
1787 stubs: { versions: ["1"] },
1788 apex_available: ["com.android.runtime"],
1789
1790 sanitize: {
1791 hwaddress: true,
1792 }
1793 }
1794
1795 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001796 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001797 no_libcrt: true,
1798 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001799 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001800 stl: "none",
1801 system_shared_libs: [],
1802 srcs: [""],
1803 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001804 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001805
1806 sanitize: {
1807 never: true,
1808 },
Spandan Das4de7b492023-05-05 21:13:01 +00001809 apex_available: [
1810 "//apex_available:anyapex",
1811 "//apex_available:platform",
1812 ],
Paul Duffina02cae32021-03-09 01:44:06 +00001813 } `)
1814 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001815
Jooyung Hana0503a52023-08-23 13:12:50 +09001816 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001817 "lib64/bionic/libc.so",
1818 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1819 })
1820
Colin Cross4c4c1be2022-02-10 11:41:18 -08001821 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001822
1823 installed := hwasan.Description("install libclang_rt.hwasan")
1824 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1825
1826 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1827 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1828 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1829}
1830
1831func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001832 t.Parallel()
Paul Duffin70d3bee2021-03-21 11:26:05 +00001833 result := android.GroupFixturePreparers(
Paul Duffina02cae32021-03-09 01:44:06 +00001834 prepareForTestOfRuntimeApexWithHwasan,
1835 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
1836 variables.SanitizeDevice = []string{"hwaddress"}
1837 }),
1838 ).RunTestWithBp(t, `
Jooyung Han8ce8db92020-05-15 19:05:05 +09001839 cc_library {
1840 name: "libc",
1841 no_libcrt: true,
1842 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001843 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001844 stl: "none",
1845 system_shared_libs: [],
1846 stubs: { versions: ["1"] },
1847 apex_available: ["com.android.runtime"],
1848 }
1849
1850 cc_prebuilt_library_shared {
Colin Cross4c4c1be2022-02-10 11:41:18 -08001851 name: "libclang_rt.hwasan",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001852 no_libcrt: true,
1853 nocrt: true,
Kalesh Singhf4ffe0a2024-01-29 13:01:51 -08001854 no_crt_pad_segment: true,
Jooyung Han8ce8db92020-05-15 19:05:05 +09001855 stl: "none",
1856 system_shared_libs: [],
1857 srcs: [""],
1858 stubs: { versions: ["1"] },
Colin Cross4c4c1be2022-02-10 11:41:18 -08001859 stem: "libclang_rt.hwasan-aarch64-android",
Jooyung Han8ce8db92020-05-15 19:05:05 +09001860
1861 sanitize: {
1862 never: true,
1863 },
Spandan Das4de7b492023-05-05 21:13:01 +00001864 apex_available: [
1865 "//apex_available:anyapex",
1866 "//apex_available:platform",
1867 ],
Jooyung Han8ce8db92020-05-15 19:05:05 +09001868 }
Paul Duffina02cae32021-03-09 01:44:06 +00001869 `)
1870 ctx := result.TestContext
Jooyung Han8ce8db92020-05-15 19:05:05 +09001871
Jooyung Hana0503a52023-08-23 13:12:50 +09001872 ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime", []string{
Jooyung Han8ce8db92020-05-15 19:05:05 +09001873 "lib64/bionic/libc.so",
1874 "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
1875 })
1876
Colin Cross4c4c1be2022-02-10 11:41:18 -08001877 hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
Jooyung Han8ce8db92020-05-15 19:05:05 +09001878
1879 installed := hwasan.Description("install libclang_rt.hwasan")
1880 ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
1881
1882 symlink := hwasan.Description("install symlink libclang_rt.hwasan")
1883 ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
1884 ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
1885}
1886
Jooyung Han61b66e92020-03-21 14:21:46 +00001887func TestApexDependsOnLLNDKTransitively(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001888 t.Parallel()
Jooyung Han61b66e92020-03-21 14:21:46 +00001889 testcases := []struct {
1890 name string
1891 minSdkVersion string
Colin Crossaede88c2020-08-11 12:17:01 -07001892 apexVariant string
Jooyung Han61b66e92020-03-21 14:21:46 +00001893 shouldLink string
1894 shouldNotLink []string
1895 }{
1896 {
Jiyong Park55549df2021-02-26 23:57:23 +09001897 name: "unspecified version links to the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001898 minSdkVersion: "",
Colin Crossaede88c2020-08-11 12:17:01 -07001899 apexVariant: "apex10000",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001900 shouldLink: "current",
1901 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001902 },
1903 {
Jiyong Park55549df2021-02-26 23:57:23 +09001904 name: "always use the latest",
Jooyung Han749dc692020-04-15 11:03:39 +09001905 minSdkVersion: "min_sdk_version: \"29\",",
Colin Crossaede88c2020-08-11 12:17:01 -07001906 apexVariant: "apex29",
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001907 shouldLink: "current",
1908 shouldNotLink: []string{"29", "30"},
Jooyung Han61b66e92020-03-21 14:21:46 +00001909 },
1910 }
1911 for _, tc := range testcases {
1912 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001913 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001914 ctx := testApex(t, `
Jooyung Han61b66e92020-03-21 14:21:46 +00001915 apex {
1916 name: "myapex",
1917 key: "myapex.key",
Jooyung Han61b66e92020-03-21 14:21:46 +00001918 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001919 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09001920 `+tc.minSdkVersion+`
Jooyung Han61b66e92020-03-21 14:21:46 +00001921 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001922
Jooyung Han61b66e92020-03-21 14:21:46 +00001923 apex_key {
1924 name: "myapex.key",
1925 public_key: "testkey.avbpubkey",
1926 private_key: "testkey.pem",
1927 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001928
Jooyung Han61b66e92020-03-21 14:21:46 +00001929 cc_library {
1930 name: "mylib",
1931 srcs: ["mylib.cpp"],
1932 vendor_available: true,
1933 shared_libs: ["libbar"],
1934 system_shared_libs: [],
1935 stl: "none",
1936 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09001937 min_sdk_version: "29",
Jooyung Han61b66e92020-03-21 14:21:46 +00001938 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001939
Jooyung Han61b66e92020-03-21 14:21:46 +00001940 cc_library {
1941 name: "libbar",
1942 srcs: ["mylib.cpp"],
1943 system_shared_libs: [],
1944 stl: "none",
1945 stubs: { versions: ["29","30"] },
Colin Cross203b4212021-04-26 17:19:41 -07001946 llndk: {
1947 symbol_file: "libbar.map.txt",
1948 }
Jooyung Han61b66e92020-03-21 14:21:46 +00001949 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001950 `,
Paul Duffin0a49fdc2021-03-08 11:28:25 +00001951 withUnbundledBuild,
1952 )
Jooyung Han9c80bae2019-08-20 17:30:57 +09001953
Jooyung Han61b66e92020-03-21 14:21:46 +00001954 // Ensure that LLNDK dep is not included
Jooyung Hana0503a52023-08-23 13:12:50 +09001955 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han61b66e92020-03-21 14:21:46 +00001956 "lib64/mylib.so",
1957 })
Jooyung Han9c80bae2019-08-20 17:30:57 +09001958
Jooyung Han61b66e92020-03-21 14:21:46 +00001959 // Ensure that LLNDK dep is required
Jooyung Hana0503a52023-08-23 13:12:50 +09001960 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han61b66e92020-03-21 14:21:46 +00001961 ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
1962 ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
Jooyung Han9c80bae2019-08-20 17:30:57 +09001963
Steven Moreland2c4000c2021-04-27 02:08:49 +00001964 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
1965 ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001966 for _, ver := range tc.shouldNotLink {
Steven Moreland2c4000c2021-04-27 02:08:49 +00001967 ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
Jooyung Han61b66e92020-03-21 14:21:46 +00001968 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001969
Steven Moreland2c4000c2021-04-27 02:08:49 +00001970 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09001971 ver := tc.shouldLink
1972 if tc.shouldLink == "current" {
1973 ver = strconv.Itoa(android.FutureApiLevelInt)
1974 }
1975 ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
Jooyung Han61b66e92020-03-21 14:21:46 +00001976 })
1977 }
Jooyung Han9c80bae2019-08-20 17:30:57 +09001978}
1979
Jiyong Park25fc6a92018-11-18 18:02:45 +09001980func TestApexWithSystemLibsStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07001981 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08001982 ctx := testApex(t, `
Jiyong Park25fc6a92018-11-18 18:02:45 +09001983 apex {
1984 name: "myapex",
1985 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00001986 native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm", "libmylib_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00001987 updatable: false,
Jiyong Park25fc6a92018-11-18 18:02:45 +09001988 }
1989
1990 apex_key {
1991 name: "myapex.key",
1992 public_key: "testkey.avbpubkey",
1993 private_key: "testkey.pem",
1994 }
1995
1996 cc_library {
1997 name: "mylib",
1998 srcs: ["mylib.cpp"],
Colin Crossea91a172024-11-05 16:14:05 -08001999 system_shared_libs: ["libc"],
2000 shared_libs: ["libdl#27", "libm#impl"],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002001 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002002 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002003 }
2004
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002005 rust_ffi {
2006 name: "libmylib_rs",
2007 crate_name: "mylib_rs",
2008 shared_libs: ["libvers#27", "libm#impl"],
2009 srcs: ["mylib.rs"],
2010 apex_available: [ "myapex" ],
2011 }
2012
Jiyong Park25fc6a92018-11-18 18:02:45 +09002013 cc_library_shared {
2014 name: "mylib_shared",
2015 srcs: ["mylib.cpp"],
2016 shared_libs: ["libdl#27"],
2017 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00002018 apex_available: [ "myapex" ],
Jiyong Park25fc6a92018-11-18 18:02:45 +09002019 }
2020
2021 cc_library {
Jiyong Parkb0788572018-12-20 22:10:17 +09002022 name: "libBootstrap",
2023 srcs: ["mylib.cpp"],
2024 stl: "none",
2025 bootstrap: true,
2026 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002027
2028 rust_ffi {
2029 name: "libbootstrap_rs",
2030 srcs: ["mylib.cpp"],
2031 crate_name: "bootstrap_rs",
2032 bootstrap: true,
2033 }
2034
2035 cc_library {
2036 name: "libvers",
2037 srcs: ["mylib.cpp"],
2038 stl: "none",
2039 stubs: { versions: ["27","30"] },
2040 }
Jiyong Park25fc6a92018-11-18 18:02:45 +09002041 `)
2042
Jooyung Hana0503a52023-08-23 13:12:50 +09002043 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002044 copyCmds := apexRule.Args["copy_commands"]
2045
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002046 // Ensure that mylib, libmylib_rs, libm, libdl, libstd.dylib.so (from Rust) are included.
Alex Light5098a612018-11-29 17:12:15 -08002047 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002048 ensureContains(t, copyCmds, "image.apex/lib64/libmylib_rs.so")
Jiyong Parkb0788572018-12-20 22:10:17 +09002049 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
2050 ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002051 ensureContains(t, copyCmds, "image.apex/lib64/libstd.dylib.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002052
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002053 // Ensure that libc and liblog (from Rust) is not included (since it has stubs and not listed in native_shared_libs)
Jiyong Parkb0788572018-12-20 22:10:17 +09002054 ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002055 ensureNotContains(t, copyCmds, "image.apex/lib64/liblog.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002056
Colin Crossaede88c2020-08-11 12:17:01 -07002057 mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002058 mylibRsFlags := ctx.ModuleForTests("libmylib_rs", "android_arm64_armv8-a_shared_apex10000").Rule("rustc").Args["linkFlags"]
Colin Crossaede88c2020-08-11 12:17:01 -07002059 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
2060 mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
Jiyong Park25fc6a92018-11-18 18:02:45 +09002061
2062 // For dependency to libc
2063 // Ensure that mylib is linking with the latest version of stubs
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002064 ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002065 // ... and not linking to the non-stub (impl) variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002066 ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002067 // ... Cflags from stub is correctly exported to mylib
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002068 ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
2069 ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002070
2071 // For dependency to libm
2072 // Ensure that mylib is linking with the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002073 ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002074 // ... and not linking to the stub variant
Jiyong Park3ff16992019-12-27 14:11:47 +09002075 ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002076 // ... and is not compiling with the stub
2077 ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
2078 ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
2079
2080 // For dependency to libdl
2081 // Ensure that mylib is linking with the specified version of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002082 ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002083 // ... and not linking to the other versions of stubs
Jiyong Park3ff16992019-12-27 14:11:47 +09002084 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
2085 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002086 // ... and not linking to the non-stub (impl) variant
Colin Crossaede88c2020-08-11 12:17:01 -07002087 ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002088 // ... Cflags from stub is correctly exported to mylib
2089 ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
2090 ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
Jiyong Parkb0788572018-12-20 22:10:17 +09002091
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002092 // Rust checks
2093 // For dependency to libc, liblog
2094 // Ensure that libmylib_rs is linking with the latest versions of stubs
2095 ensureContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
2096 ensureContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared_current/liblog.so")
2097 // ... and not linking to the non-stub (impl) variants
2098 ensureNotContains(t, mylibRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2099 ensureNotContains(t, mylibRsFlags, "liblog/android_arm64_armv8-a_shared/liblog.so")
2100
2101 // For libm dependency (explicit)
2102 // Ensure that mylib is linking with the non-stub (impl) variant
2103 ensureContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
2104 // ... and not linking to the stub variant
2105 ensureNotContains(t, mylibRsFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
2106
2107 // For dependency to libvers
2108 // (We do not use libdl#27 as Rust links the system libs implicitly and does
2109 // not currently have a system_shared_libs equivalent to prevent this)
2110 // Ensure that mylib is linking with the specified version of stubs
2111 ensureContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_27/libvers.so")
2112 // ... and not linking to the other versions of stubs
2113 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_30/libvers.so")
2114 // ... and not linking to the non-stub (impl) variant
2115 ensureNotContains(t, mylibRsFlags, "libvers/android_arm64_armv8-a_shared_apex10000/libvers.so")
2116
Jiyong Parkb0788572018-12-20 22:10:17 +09002117 // Ensure that libBootstrap is depending on the platform variant of bionic libs
Colin Cross7113d202019-11-20 16:39:12 -08002118 libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
2119 ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2120 ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2121 ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002122
2123 // Ensure that libbootstrap_rs is depending on the platform variant of bionic libs
2124 libRsFlags := ctx.ModuleForTests("libbootstrap_rs", "android_arm64_armv8-a_shared").Rule("rustc").Args["linkFlags"]
2125 ensureContains(t, libRsFlags, "libc/android_arm64_armv8-a_shared/libc.so")
2126 ensureContains(t, libRsFlags, "libm/android_arm64_armv8-a_shared/libm.so")
2127 ensureContains(t, libRsFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
Jiyong Park25fc6a92018-11-18 18:02:45 +09002128}
Jiyong Park7c2ee712018-12-07 00:42:25 +09002129
Jooyung Han749dc692020-04-15 11:03:39 +09002130func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002131 t.Parallel()
Jiyong Park55549df2021-02-26 23:57:23 +09002132 // there are three links between liba --> libz.
2133 // 1) myapex -> libx -> liba -> libz : this should be #30 link
Jooyung Han749dc692020-04-15 11:03:39 +09002134 // 2) otherapex -> liby -> liba -> libz : this should be #30 link
Jooyung Han03b51852020-02-26 22:45:42 +09002135 // 3) (platform) -> liba -> libz : this should be non-stub link
Colin Cross1c460562021-02-16 17:55:47 -08002136 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002137 apex {
2138 name: "myapex",
2139 key: "myapex.key",
2140 native_shared_libs: ["libx"],
Jooyung Han749dc692020-04-15 11:03:39 +09002141 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002142 }
2143
2144 apex {
2145 name: "otherapex",
2146 key: "myapex.key",
2147 native_shared_libs: ["liby"],
Jooyung Han749dc692020-04-15 11:03:39 +09002148 min_sdk_version: "30",
Jooyung Han03b51852020-02-26 22:45:42 +09002149 }
2150
2151 apex_key {
2152 name: "myapex.key",
2153 public_key: "testkey.avbpubkey",
2154 private_key: "testkey.pem",
2155 }
2156
2157 cc_library {
2158 name: "libx",
2159 shared_libs: ["liba"],
2160 system_shared_libs: [],
2161 stl: "none",
2162 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002163 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002164 }
2165
2166 cc_library {
2167 name: "liby",
2168 shared_libs: ["liba"],
2169 system_shared_libs: [],
2170 stl: "none",
2171 apex_available: [ "otherapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002172 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002173 }
2174
2175 cc_library {
2176 name: "liba",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002177 shared_libs: ["libz", "libz_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002178 system_shared_libs: [],
2179 stl: "none",
2180 apex_available: [
2181 "//apex_available:anyapex",
2182 "//apex_available:platform",
2183 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002184 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002185 }
2186
2187 cc_library {
2188 name: "libz",
2189 system_shared_libs: [],
2190 stl: "none",
2191 stubs: {
Jooyung Han749dc692020-04-15 11:03:39 +09002192 versions: ["28", "30"],
Jooyung Han03b51852020-02-26 22:45:42 +09002193 },
2194 }
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002195
2196 rust_ffi {
2197 name: "libz_rs",
2198 crate_name: "z_rs",
2199 srcs: ["foo.rs"],
2200 stubs: {
2201 versions: ["28", "30"],
2202 },
2203 }
Jooyung Han749dc692020-04-15 11:03:39 +09002204 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002205
2206 expectLink := func(from, from_variant, to, to_variant string) {
2207 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2208 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2209 }
2210 expectNoLink := func(from, from_variant, to, to_variant string) {
2211 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2212 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2213 }
2214 // platform liba is linked to non-stub version
2215 expectLink("liba", "shared", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002216 expectLink("liba", "shared", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002217 // liba in myapex is linked to current
2218 expectLink("liba", "shared_apex29", "libz", "shared_current")
2219 expectNoLink("liba", "shared_apex29", "libz", "shared_30")
Jiyong Park55549df2021-02-26 23:57:23 +09002220 expectNoLink("liba", "shared_apex29", "libz", "shared_28")
Colin Crossaede88c2020-08-11 12:17:01 -07002221 expectNoLink("liba", "shared_apex29", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002222 expectLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_current")
2223 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_30")
2224 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared_28")
2225 expectNoLink("liba", "shared_apex29", "unstripped/libz_rs", "shared")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002226 // liba in otherapex is linked to current
2227 expectLink("liba", "shared_apex30", "libz", "shared_current")
2228 expectNoLink("liba", "shared_apex30", "libz", "shared_30")
Colin Crossaede88c2020-08-11 12:17:01 -07002229 expectNoLink("liba", "shared_apex30", "libz", "shared_28")
2230 expectNoLink("liba", "shared_apex30", "libz", "shared")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002231 expectLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_current")
2232 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_30")
2233 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared_28")
2234 expectNoLink("liba", "shared_apex30", "unstripped/libz_rs", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002235}
2236
Jooyung Hanaed150d2020-04-02 01:41:41 +09002237func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002238 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002239 ctx := testApex(t, `
Jooyung Hanaed150d2020-04-02 01:41:41 +09002240 apex {
2241 name: "myapex",
2242 key: "myapex.key",
2243 native_shared_libs: ["libx"],
2244 min_sdk_version: "R",
2245 }
2246
2247 apex_key {
2248 name: "myapex.key",
2249 public_key: "testkey.avbpubkey",
2250 private_key: "testkey.pem",
2251 }
2252
2253 cc_library {
2254 name: "libx",
2255 shared_libs: ["libz"],
2256 system_shared_libs: [],
2257 stl: "none",
2258 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002259 min_sdk_version: "R",
Jooyung Hanaed150d2020-04-02 01:41:41 +09002260 }
2261
2262 cc_library {
2263 name: "libz",
2264 system_shared_libs: [],
2265 stl: "none",
2266 stubs: {
2267 versions: ["29", "R"],
2268 },
2269 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002270 `,
2271 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2272 variables.Platform_version_active_codenames = []string{"R"}
2273 }),
2274 )
Jooyung Hanaed150d2020-04-02 01:41:41 +09002275
2276 expectLink := func(from, from_variant, to, to_variant string) {
2277 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2278 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2279 }
2280 expectNoLink := func(from, from_variant, to, to_variant string) {
2281 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2282 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2283 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002284 expectLink("libx", "shared_apex10000", "libz", "shared_current")
2285 expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
Colin Crossaede88c2020-08-11 12:17:01 -07002286 expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
2287 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Hanaed150d2020-04-02 01:41:41 +09002288}
2289
Jooyung Han4c4da062021-06-23 10:23:16 +09002290func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002291 t.Parallel()
Jooyung Han4c4da062021-06-23 10:23:16 +09002292 testApex(t, `
2293 apex {
2294 name: "myapex",
2295 key: "myapex.key",
2296 java_libs: ["libx"],
2297 min_sdk_version: "S",
2298 }
2299
2300 apex_key {
2301 name: "myapex.key",
2302 public_key: "testkey.avbpubkey",
2303 private_key: "testkey.pem",
2304 }
2305
2306 java_library {
2307 name: "libx",
2308 srcs: ["a.java"],
2309 apex_available: [ "myapex" ],
2310 sdk_version: "current",
2311 min_sdk_version: "S", // should be okay
Colin Crosse4f34882024-11-14 12:26:00 -08002312 compile_dex: true,
Jooyung Han4c4da062021-06-23 10:23:16 +09002313 }
2314 `,
2315 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
2316 variables.Platform_version_active_codenames = []string{"S"}
2317 variables.Platform_sdk_codename = proptools.StringPtr("S")
2318 }),
2319 )
2320}
2321
Jooyung Han749dc692020-04-15 11:03:39 +09002322func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002323 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002324 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002325 apex {
2326 name: "myapex",
2327 key: "myapex.key",
2328 native_shared_libs: ["libx"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002329 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002330 }
2331
2332 apex_key {
2333 name: "myapex.key",
2334 public_key: "testkey.avbpubkey",
2335 private_key: "testkey.pem",
2336 }
2337
2338 cc_library {
2339 name: "libx",
2340 shared_libs: ["libz"],
2341 system_shared_libs: [],
2342 stl: "none",
2343 apex_available: [ "myapex" ],
2344 }
2345
2346 cc_library {
2347 name: "libz",
2348 system_shared_libs: [],
2349 stl: "none",
2350 stubs: {
2351 versions: ["1", "2"],
2352 },
2353 }
2354 `)
2355
2356 expectLink := func(from, from_variant, to, to_variant string) {
2357 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2358 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2359 }
2360 expectNoLink := func(from, from_variant, to, to_variant string) {
2361 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2362 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2363 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002364 expectLink("libx", "shared_apex10000", "libz", "shared_current")
Colin Crossaede88c2020-08-11 12:17:01 -07002365 expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002366 expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
Colin Crossaede88c2020-08-11 12:17:01 -07002367 expectNoLink("libx", "shared_apex10000", "libz", "shared")
Jooyung Han03b51852020-02-26 22:45:42 +09002368}
2369
Jooyung Handfc864c2023-03-20 18:19:07 +09002370func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002371 t.Parallel()
Jiyong Park5df7bd32021-08-25 16:18:46 +09002372 ctx := testApex(t, `
2373 apex {
2374 name: "myapex",
2375 key: "myapex.key",
2376 native_shared_libs: ["mylib"],
Jooyung Handfc864c2023-03-20 18:19:07 +09002377 updatable: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002378 vendor: true,
2379 min_sdk_version: "29",
2380 }
2381
2382 apex_key {
2383 name: "myapex.key",
2384 public_key: "testkey.avbpubkey",
2385 private_key: "testkey.pem",
2386 }
2387
2388 cc_library {
2389 name: "mylib",
Jooyung Handfc864c2023-03-20 18:19:07 +09002390 srcs: ["mylib.cpp"],
Jiyong Park5df7bd32021-08-25 16:18:46 +09002391 vendor_available: true,
Jiyong Park5df7bd32021-08-25 16:18:46 +09002392 min_sdk_version: "29",
Jooyung Handfc864c2023-03-20 18:19:07 +09002393 shared_libs: ["libbar"],
2394 }
2395
2396 cc_library {
2397 name: "libbar",
2398 stubs: { versions: ["29", "30"] },
2399 llndk: { symbol_file: "libbar.map.txt" },
Jiyong Park5df7bd32021-08-25 16:18:46 +09002400 }
2401 `)
2402
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002403 vendorVariant := "android_vendor_arm64_armv8-a"
Jiyong Park5df7bd32021-08-25 16:18:46 +09002404
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09002405 mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_apex29")
Jooyung Handfc864c2023-03-20 18:19:07 +09002406
2407 // Ensure that mylib links with "current" LLNDK
2408 libFlags := names(mylib.Rule("ld").Args["libFlags"])
Jooyung Han5e8994e2024-03-12 14:12:12 +09002409 ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared/libbar.so")
Jooyung Handfc864c2023-03-20 18:19:07 +09002410
2411 // Ensure that mylib is targeting 29
2412 ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
2413 ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
2414
2415 // Ensure that the correct variant of crtbegin_so is used.
2416 crtBegin := mylib.Rule("ld").Args["crtBegin"]
2417 ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
Jiyong Park5df7bd32021-08-25 16:18:46 +09002418
2419 // Ensure that the crtbegin_so used by the APEX is targeting 29
2420 cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
2421 android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
2422}
2423
Chan Wang54956a62025-01-14 18:04:39 +00002424func TestTrackAllowedDepsForAndroidApex(t *testing.T) {
2425 t.Parallel()
2426 ctx := testApex(t, `
2427 apex {
2428 name: "com.android.myapex",
2429 key: "myapex.key",
2430 updatable: true,
2431 native_shared_libs: [
2432 "mylib",
2433 "yourlib",
2434 ],
2435 min_sdk_version: "29",
2436 }
2437
2438 apex {
2439 name: "myapex2",
2440 key: "myapex.key",
2441 updatable: false,
2442 native_shared_libs: ["yourlib"],
2443 }
2444
2445 apex_key {
2446 name: "myapex.key",
2447 public_key: "testkey.avbpubkey",
2448 private_key: "testkey.pem",
2449 }
2450
2451 cc_library {
2452 name: "mylib",
2453 srcs: ["mylib.cpp"],
2454 shared_libs: ["libbar", "libbar_rs"],
2455 min_sdk_version: "29",
2456 apex_available: ["com.android.myapex"],
2457 }
2458
2459 cc_library {
2460 name: "libbar",
2461 stubs: { versions: ["29", "30"] },
2462 }
2463
2464 rust_ffi {
2465 name: "libbar_rs",
2466 crate_name: "bar_rs",
2467 srcs: ["bar.rs"],
2468 stubs: { versions: ["29", "30"] },
2469 }
2470
2471 cc_library {
2472 name: "yourlib",
2473 srcs: ["mylib.cpp"],
2474 min_sdk_version: "29",
2475 apex_available: ["com.android.myapex", "myapex2", "//apex_available:platform"],
2476 }
2477 `, withFiles(android.MockFS{
2478 "packages/modules/common/build/allowed_deps.txt": nil,
2479 }),
2480 android.FixtureMergeMockFs(android.MockFS{
2481 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2482 }))
2483
2484 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2485 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
2486 android.AssertStringListContains(t, "updatable com.android.myapex should generate depsinfo file", inputs,
2487 "out/soong/.intermediates/com.android.myapex/android_common_com.android.myapex/depsinfo/flatlist.txt")
2488 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
2489 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
2490
2491 myapex := ctx.ModuleForTests("com.android.myapex", "android_common_com.android.myapex")
2492 flatlist := strings.Split(android.ContentFromFileRuleForTests(t, ctx,
2493 myapex.Output("depsinfo/flatlist.txt")), "\n")
2494 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2495 flatlist, "libbar(minSdkVersion:(no version)) (external)")
2496 android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
2497 flatlist, "libbar_rs(minSdkVersion:(no version)) (external)")
2498 android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
2499 flatlist, "mylib:(minSdkVersion:29)")
2500 android.AssertStringListContains(t, "track platform-available lib",
2501 flatlist, "yourlib(minSdkVersion:29)")
2502}
2503
2504func TestNotTrackAllowedDepsForNonAndroidApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002505 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002506 ctx := testApex(t, `
2507 apex {
2508 name: "myapex",
2509 key: "myapex.key",
2510 updatable: true,
2511 native_shared_libs: [
2512 "mylib",
2513 "yourlib",
2514 ],
2515 min_sdk_version: "29",
2516 }
2517
2518 apex {
2519 name: "myapex2",
2520 key: "myapex.key",
2521 updatable: false,
2522 native_shared_libs: ["yourlib"],
2523 }
2524
2525 apex_key {
2526 name: "myapex.key",
2527 public_key: "testkey.avbpubkey",
2528 private_key: "testkey.pem",
2529 }
2530
2531 cc_library {
2532 name: "mylib",
2533 srcs: ["mylib.cpp"],
Chan Wang54956a62025-01-14 18:04:39 +00002534 shared_libs: ["libbar"],
Jooyung Han4495f842023-04-25 16:39:59 +09002535 min_sdk_version: "29",
2536 apex_available: ["myapex"],
2537 }
2538
2539 cc_library {
2540 name: "libbar",
2541 stubs: { versions: ["29", "30"] },
2542 }
2543
2544 cc_library {
2545 name: "yourlib",
2546 srcs: ["mylib.cpp"],
2547 min_sdk_version: "29",
2548 apex_available: ["myapex", "myapex2", "//apex_available:platform"],
2549 }
2550 `, withFiles(android.MockFS{
2551 "packages/modules/common/build/allowed_deps.txt": nil,
2552 }))
2553
2554 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2555 inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
Chan Wang54956a62025-01-14 18:04:39 +00002556 android.AssertStringListDoesNotContain(t, "updatable myapex should generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002557 "out/soong/.intermediates/myapex/android_common_myapex/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002558 android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
Jooyung Hana0503a52023-08-23 13:12:50 +09002559 "out/soong/.intermediates/myapex2/android_common_myapex2/depsinfo/flatlist.txt")
Jooyung Han4495f842023-04-25 16:39:59 +09002560}
2561
2562func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002563 t.Parallel()
Jooyung Han4495f842023-04-25 16:39:59 +09002564 ctx := testApex(t, `
2565 apex {
Chan Wang54956a62025-01-14 18:04:39 +00002566 name: "com.android.myapex",
Jooyung Han4495f842023-04-25 16:39:59 +09002567 key: "myapex.key",
2568 updatable: true,
2569 min_sdk_version: "29",
2570 }
2571
2572 apex_key {
2573 name: "myapex.key",
2574 public_key: "testkey.avbpubkey",
2575 private_key: "testkey.pem",
2576 }
Chan Wang54956a62025-01-14 18:04:39 +00002577 `,
2578 android.FixtureMergeMockFs(android.MockFS{
2579 "system/sepolicy/apex/com.android.myapex-file_contexts": nil,
2580 }))
Jooyung Han4495f842023-04-25 16:39:59 +09002581 depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
2582 if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
2583 t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
2584 }
2585}
2586
Jooyung Han03b51852020-02-26 22:45:42 +09002587func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002588 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002589 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002590 apex {
2591 name: "myapex",
2592 key: "myapex.key",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002593 native_shared_libs: ["libx", "libx_rs"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002594 updatable: false,
Jooyung Han03b51852020-02-26 22:45:42 +09002595 }
2596
2597 apex_key {
2598 name: "myapex.key",
2599 public_key: "testkey.avbpubkey",
2600 private_key: "testkey.pem",
2601 }
2602
2603 cc_library {
2604 name: "libx",
2605 system_shared_libs: [],
2606 stl: "none",
2607 apex_available: [ "myapex" ],
2608 stubs: {
2609 versions: ["1", "2"],
2610 },
2611 }
2612
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002613 rust_ffi {
2614 name: "libx_rs",
2615 crate_name: "x_rs",
2616 srcs: ["x.rs"],
2617 apex_available: [ "myapex" ],
2618 stubs: {
2619 versions: ["1", "2"],
2620 },
2621 }
2622
Jooyung Han03b51852020-02-26 22:45:42 +09002623 cc_library {
2624 name: "libz",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002625 shared_libs: ["libx", "libx_rs",],
Jooyung Han03b51852020-02-26 22:45:42 +09002626 system_shared_libs: [],
2627 stl: "none",
2628 }
2629 `)
2630
2631 expectLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002632 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002633 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2634 ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2635 }
2636 expectNoLink := func(from, from_variant, to, to_variant string) {
Colin Cross56a83212020-09-15 18:30:11 -07002637 t.Helper()
Jooyung Han03b51852020-02-26 22:45:42 +09002638 ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
2639 ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2640 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002641 expectLink("libz", "shared", "libx", "shared_current")
2642 expectNoLink("libz", "shared", "libx", "shared_2")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002643 expectLink("libz", "shared", "unstripped/libx_rs", "shared_current")
2644 expectNoLink("libz", "shared", "unstripped/libx_rs", "shared_2")
Jooyung Han03b51852020-02-26 22:45:42 +09002645 expectNoLink("libz", "shared", "libz", "shared_1")
2646 expectNoLink("libz", "shared", "libz", "shared")
2647}
2648
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002649var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
2650 func(variables android.FixtureProductVariables) {
2651 variables.SanitizeDevice = []string{"hwaddress"}
2652 },
2653)
2654
Jooyung Han75568392020-03-20 04:29:24 +09002655func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002656 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002657 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002658 apex {
2659 name: "myapex",
2660 key: "myapex.key",
2661 native_shared_libs: ["libx"],
2662 min_sdk_version: "29",
2663 }
2664
2665 apex_key {
2666 name: "myapex.key",
2667 public_key: "testkey.avbpubkey",
2668 private_key: "testkey.pem",
2669 }
2670
2671 cc_library {
2672 name: "libx",
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002673 shared_libs: ["libbar", "libbar_rs"],
Jooyung Han03b51852020-02-26 22:45:42 +09002674 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002675 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002676 }
2677
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002678 rust_ffi {
2679 name: "libbar_rs",
2680 crate_name: "bar_rs",
2681 srcs: ["bar.rs"],
2682 stubs: { versions: ["29", "30"] },
2683 }
2684
Jooyung Han03b51852020-02-26 22:45:42 +09002685 cc_library {
2686 name: "libbar",
2687 stubs: {
2688 versions: ["29", "30"],
2689 },
2690 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00002691 `,
2692 prepareForTestWithSantitizeHwaddress,
2693 )
Jooyung Han03b51852020-02-26 22:45:42 +09002694 expectLink := func(from, from_variant, to, to_variant string) {
2695 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
2696 libFlags := ld.Args["libFlags"]
2697 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
2698 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09002699 expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00002700 expectLink("libx", "shared_hwasan_apex29", "unstripped/libbar_rs", "shared_current")
Jooyung Han03b51852020-02-26 22:45:42 +09002701}
2702
Jooyung Han75568392020-03-20 04:29:24 +09002703func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002704 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08002705 ctx := testApex(t, `
Jooyung Han03b51852020-02-26 22:45:42 +09002706 apex {
2707 name: "myapex",
2708 key: "myapex.key",
2709 native_shared_libs: ["libx"],
2710 min_sdk_version: "29",
2711 }
2712
2713 apex_key {
2714 name: "myapex.key",
2715 public_key: "testkey.avbpubkey",
2716 private_key: "testkey.pem",
2717 }
2718
2719 cc_library {
2720 name: "libx",
2721 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09002722 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002723 }
Jooyung Han75568392020-03-20 04:29:24 +09002724 `)
Jooyung Han03b51852020-02-26 22:45:42 +09002725
2726 // ensure apex variant of c++ is linked with static unwinder
Colin Crossaede88c2020-08-11 12:17:01 -07002727 cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002728 ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002729 // note that platform variant is not.
2730 cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Ryan Prichardb35a85e2021-01-13 19:18:53 -08002731 ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
Jooyung Han03b51852020-02-26 22:45:42 +09002732}
2733
Jooyung Han749dc692020-04-15 11:03:39 +09002734func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002735 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002736 testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
Jooyung Han03b51852020-02-26 22:45:42 +09002737 apex {
2738 name: "myapex",
2739 key: "myapex.key",
Jooyung Han749dc692020-04-15 11:03:39 +09002740 native_shared_libs: ["mylib"],
2741 min_sdk_version: "29",
Jooyung Han03b51852020-02-26 22:45:42 +09002742 }
2743
2744 apex_key {
2745 name: "myapex.key",
2746 public_key: "testkey.avbpubkey",
2747 private_key: "testkey.pem",
2748 }
Jooyung Han749dc692020-04-15 11:03:39 +09002749
2750 cc_library {
2751 name: "mylib",
2752 srcs: ["mylib.cpp"],
2753 system_shared_libs: [],
2754 stl: "none",
2755 apex_available: [
2756 "myapex",
2757 ],
2758 min_sdk_version: "30",
2759 }
2760 `)
Ivan Lozano3e9f9e42020-12-04 15:05:43 -05002761
2762 testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
2763 apex {
2764 name: "myapex",
2765 key: "myapex.key",
2766 native_shared_libs: ["libfoo.ffi"],
2767 min_sdk_version: "29",
2768 }
2769
2770 apex_key {
2771 name: "myapex.key",
2772 public_key: "testkey.avbpubkey",
2773 private_key: "testkey.pem",
2774 }
2775
2776 rust_ffi_shared {
2777 name: "libfoo.ffi",
2778 srcs: ["foo.rs"],
2779 crate_name: "foo",
2780 apex_available: [
2781 "myapex",
2782 ],
2783 min_sdk_version: "30",
2784 }
2785 `)
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002786
2787 testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
2788 apex {
2789 name: "myapex",
2790 key: "myapex.key",
2791 java_libs: ["libfoo"],
2792 min_sdk_version: "29",
2793 }
2794
2795 apex_key {
2796 name: "myapex.key",
2797 public_key: "testkey.avbpubkey",
2798 private_key: "testkey.pem",
2799 }
2800
2801 java_import {
2802 name: "libfoo",
2803 jars: ["libfoo.jar"],
2804 apex_available: [
2805 "myapex",
2806 ],
2807 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002808 compile_dex: true,
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002809 }
2810 `)
Spandan Das7fa982c2023-02-24 18:38:56 +00002811
2812 // Skip check for modules compiling against core API surface
2813 testApex(t, `
2814 apex {
2815 name: "myapex",
2816 key: "myapex.key",
2817 java_libs: ["libfoo"],
2818 min_sdk_version: "29",
2819 }
2820
2821 apex_key {
2822 name: "myapex.key",
2823 public_key: "testkey.avbpubkey",
2824 private_key: "testkey.pem",
2825 }
2826
2827 java_library {
2828 name: "libfoo",
2829 srcs: ["Foo.java"],
2830 apex_available: [
2831 "myapex",
2832 ],
2833 // Compile against core API surface
2834 sdk_version: "core_current",
2835 min_sdk_version: "30",
Colin Crosse4f34882024-11-14 12:26:00 -08002836 compile_dex: true,
Spandan Das7fa982c2023-02-24 18:38:56 +00002837 }
2838 `)
2839
Jooyung Han749dc692020-04-15 11:03:39 +09002840}
2841
2842func TestApexMinSdkVersion_Okay(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002843 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09002844 testApex(t, `
2845 apex {
2846 name: "myapex",
2847 key: "myapex.key",
2848 native_shared_libs: ["libfoo"],
2849 java_libs: ["libbar"],
2850 min_sdk_version: "29",
2851 }
2852
2853 apex_key {
2854 name: "myapex.key",
2855 public_key: "testkey.avbpubkey",
2856 private_key: "testkey.pem",
2857 }
2858
2859 cc_library {
2860 name: "libfoo",
2861 srcs: ["mylib.cpp"],
2862 shared_libs: ["libfoo_dep"],
2863 apex_available: ["myapex"],
2864 min_sdk_version: "29",
2865 }
2866
2867 cc_library {
2868 name: "libfoo_dep",
2869 srcs: ["mylib.cpp"],
2870 apex_available: ["myapex"],
2871 min_sdk_version: "29",
2872 }
2873
2874 java_library {
2875 name: "libbar",
2876 sdk_version: "current",
2877 srcs: ["a.java"],
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002878 static_libs: [
2879 "libbar_dep",
2880 "libbar_import_dep",
2881 ],
Jooyung Han749dc692020-04-15 11:03:39 +09002882 apex_available: ["myapex"],
2883 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002884 compile_dex: true,
Jooyung Han749dc692020-04-15 11:03:39 +09002885 }
2886
2887 java_library {
2888 name: "libbar_dep",
2889 sdk_version: "current",
2890 srcs: ["a.java"],
2891 apex_available: ["myapex"],
2892 min_sdk_version: "29",
2893 }
Jaewoong Jung56e12db2021-04-02 00:38:25 +00002894
2895 java_import {
2896 name: "libbar_import_dep",
2897 jars: ["libbar.jar"],
2898 apex_available: ["myapex"],
2899 min_sdk_version: "29",
2900 }
Jooyung Han03b51852020-02-26 22:45:42 +09002901 `)
2902}
2903
Colin Cross8ca61c12022-10-06 21:00:14 -07002904func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002905 t.Parallel()
Colin Cross8ca61c12022-10-06 21:00:14 -07002906 // Tests that an apex dependency with min_sdk_version higher than the
2907 // min_sdk_version of the apex is allowed as long as the dependency's
2908 // min_sdk_version is less than or equal to the api level that the
2909 // architecture was introduced in. In this case, arm64 didn't exist
2910 // until api level 21, so the arm64 code will never need to run on
2911 // an api level 20 device, even if other architectures of the apex
2912 // will.
2913 testApex(t, `
2914 apex {
2915 name: "myapex",
2916 key: "myapex.key",
2917 native_shared_libs: ["libfoo"],
2918 min_sdk_version: "20",
2919 }
2920
2921 apex_key {
2922 name: "myapex.key",
2923 public_key: "testkey.avbpubkey",
2924 private_key: "testkey.pem",
2925 }
2926
2927 cc_library {
2928 name: "libfoo",
2929 srcs: ["mylib.cpp"],
2930 apex_available: ["myapex"],
2931 min_sdk_version: "21",
2932 stl: "none",
2933 }
2934 `)
2935}
2936
Artur Satayev8cf899a2020-04-15 17:29:42 +01002937func TestJavaStableSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07002938 t.Parallel()
Artur Satayev8cf899a2020-04-15 17:29:42 +01002939 testCases := []struct {
2940 name string
2941 expectedError string
2942 bp string
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00002943 preparer android.FixturePreparer
Artur Satayev8cf899a2020-04-15 17:29:42 +01002944 }{
2945 {
2946 name: "Non-updatable apex with non-stable dep",
2947 bp: `
2948 apex {
2949 name: "myapex",
2950 java_libs: ["myjar"],
2951 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00002952 updatable: false,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002953 }
2954 apex_key {
2955 name: "myapex.key",
2956 public_key: "testkey.avbpubkey",
2957 private_key: "testkey.pem",
2958 }
2959 java_library {
2960 name: "myjar",
2961 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00002962 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01002963 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08002964 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002965 }
2966 `,
2967 },
2968 {
2969 name: "Updatable apex with stable dep",
2970 bp: `
2971 apex {
2972 name: "myapex",
2973 java_libs: ["myjar"],
2974 key: "myapex.key",
2975 updatable: true,
2976 min_sdk_version: "29",
2977 }
2978 apex_key {
2979 name: "myapex.key",
2980 public_key: "testkey.avbpubkey",
2981 private_key: "testkey.pem",
2982 }
2983 java_library {
2984 name: "myjar",
2985 srcs: ["foo/bar/MyClass.java"],
2986 sdk_version: "current",
2987 apex_available: ["myapex"],
Jooyung Han749dc692020-04-15 11:03:39 +09002988 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -08002989 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01002990 }
2991 `,
2992 },
2993 {
2994 name: "Updatable apex with non-stable dep",
2995 expectedError: "cannot depend on \"myjar\"",
2996 bp: `
2997 apex {
2998 name: "myapex",
2999 java_libs: ["myjar"],
3000 key: "myapex.key",
3001 updatable: true,
3002 }
3003 apex_key {
3004 name: "myapex.key",
3005 public_key: "testkey.avbpubkey",
3006 private_key: "testkey.pem",
3007 }
3008 java_library {
3009 name: "myjar",
3010 srcs: ["foo/bar/MyClass.java"],
Paul Duffin043f5e72021-03-05 00:00:01 +00003011 sdk_version: "test_current",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003012 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003013 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003014 }
3015 `,
3016 },
3017 {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003018 name: "Updatable apex with non-stable legacy core platform dep",
3019 expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
3020 bp: `
3021 apex {
3022 name: "myapex",
3023 java_libs: ["myjar-uses-legacy"],
3024 key: "myapex.key",
3025 updatable: true,
3026 }
3027 apex_key {
3028 name: "myapex.key",
3029 public_key: "testkey.avbpubkey",
3030 private_key: "testkey.pem",
3031 }
3032 java_library {
3033 name: "myjar-uses-legacy",
3034 srcs: ["foo/bar/MyClass.java"],
3035 sdk_version: "core_platform",
3036 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08003037 compile_dex: true,
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003038 }
3039 `,
3040 preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
3041 },
3042 {
Paul Duffin043f5e72021-03-05 00:00:01 +00003043 name: "Updatable apex with non-stable transitive dep",
3044 // This is not actually detecting that the transitive dependency is unstable, rather it is
3045 // detecting that the transitive dependency is building against a wider API surface than the
3046 // module that depends on it is using.
Jiyong Park670e0f62021-02-18 13:10:18 +09003047 expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
Artur Satayev8cf899a2020-04-15 17:29:42 +01003048 bp: `
3049 apex {
3050 name: "myapex",
3051 java_libs: ["myjar"],
3052 key: "myapex.key",
3053 updatable: true,
3054 }
3055 apex_key {
3056 name: "myapex.key",
3057 public_key: "testkey.avbpubkey",
3058 private_key: "testkey.pem",
3059 }
3060 java_library {
3061 name: "myjar",
3062 srcs: ["foo/bar/MyClass.java"],
3063 sdk_version: "current",
3064 apex_available: ["myapex"],
3065 static_libs: ["transitive-jar"],
Colin Crosse4f34882024-11-14 12:26:00 -08003066 compile_dex: true,
Artur Satayev8cf899a2020-04-15 17:29:42 +01003067 }
3068 java_library {
3069 name: "transitive-jar",
3070 srcs: ["foo/bar/MyClass.java"],
3071 sdk_version: "core_platform",
3072 apex_available: ["myapex"],
3073 }
3074 `,
3075 },
3076 }
3077
3078 for _, test := range testCases {
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003079 if test.name != "Updatable apex with non-stable legacy core platform dep" {
3080 continue
3081 }
Artur Satayev8cf899a2020-04-15 17:29:42 +01003082 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003083 t.Parallel()
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003084 errorHandler := android.FixtureExpectsNoErrors
3085 if test.expectedError != "" {
3086 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003087 }
Paul Duffin1ea7c9f2021-03-15 09:39:13 +00003088 android.GroupFixturePreparers(
3089 java.PrepareForTestWithJavaDefaultModules,
3090 PrepareForTestWithApexBuildComponents,
3091 prepareForTestWithMyapex,
3092 android.OptionalFixturePreparer(test.preparer),
3093 ).
3094 ExtendWithErrorHandler(errorHandler).
3095 RunTestWithBp(t, test.bp)
Artur Satayev8cf899a2020-04-15 17:29:42 +01003096 })
3097 }
3098}
3099
Jooyung Han749dc692020-04-15 11:03:39 +09003100func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
3101 testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
3102 apex {
3103 name: "myapex",
3104 key: "myapex.key",
3105 native_shared_libs: ["mylib"],
3106 min_sdk_version: "29",
3107 }
3108
3109 apex_key {
3110 name: "myapex.key",
3111 public_key: "testkey.avbpubkey",
3112 private_key: "testkey.pem",
3113 }
3114
3115 cc_library {
3116 name: "mylib",
3117 srcs: ["mylib.cpp"],
3118 shared_libs: ["mylib2"],
3119 system_shared_libs: [],
3120 stl: "none",
3121 apex_available: [
3122 "myapex",
3123 ],
3124 min_sdk_version: "29",
3125 }
3126
3127 // indirect part of the apex
3128 cc_library {
3129 name: "mylib2",
3130 srcs: ["mylib.cpp"],
3131 system_shared_libs: [],
3132 stl: "none",
3133 apex_available: [
3134 "myapex",
3135 ],
3136 min_sdk_version: "30",
3137 }
3138 `)
3139}
3140
3141func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003142 t.Parallel()
Jooyung Han749dc692020-04-15 11:03:39 +09003143 testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
3144 apex {
3145 name: "myapex",
3146 key: "myapex.key",
3147 apps: ["AppFoo"],
3148 min_sdk_version: "29",
Spandan Das42e89502022-05-06 22:12:55 +00003149 updatable: false,
Jooyung Han749dc692020-04-15 11:03:39 +09003150 }
3151
3152 apex_key {
3153 name: "myapex.key",
3154 public_key: "testkey.avbpubkey",
3155 private_key: "testkey.pem",
3156 }
3157
3158 android_app {
3159 name: "AppFoo",
3160 srcs: ["foo/bar/MyClass.java"],
3161 sdk_version: "current",
3162 min_sdk_version: "29",
3163 system_modules: "none",
3164 stl: "none",
3165 static_libs: ["bar"],
3166 apex_available: [ "myapex" ],
3167 }
3168
3169 java_library {
3170 name: "bar",
3171 sdk_version: "current",
3172 srcs: ["a.java"],
3173 apex_available: [ "myapex" ],
3174 }
3175 `)
3176}
3177
3178func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003179 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003180 ctx := testApex(t, `
Jooyung Han749dc692020-04-15 11:03:39 +09003181 apex {
3182 name: "myapex",
3183 key: "myapex.key",
3184 native_shared_libs: ["mylib"],
3185 min_sdk_version: "29",
3186 }
3187
3188 apex_key {
3189 name: "myapex.key",
3190 public_key: "testkey.avbpubkey",
3191 private_key: "testkey.pem",
3192 }
3193
Colin Crossea91a172024-11-05 16:14:05 -08003194 // mylib will link to mylib2#current
Jooyung Han749dc692020-04-15 11:03:39 +09003195 cc_library {
3196 name: "mylib",
3197 srcs: ["mylib.cpp"],
3198 shared_libs: ["mylib2"],
3199 system_shared_libs: [],
3200 stl: "none",
3201 apex_available: ["myapex", "otherapex"],
3202 min_sdk_version: "29",
3203 }
3204
3205 cc_library {
3206 name: "mylib2",
3207 srcs: ["mylib.cpp"],
3208 system_shared_libs: [],
3209 stl: "none",
3210 apex_available: ["otherapex"],
3211 stubs: { versions: ["29", "30"] },
3212 min_sdk_version: "30",
3213 }
3214
3215 apex {
3216 name: "otherapex",
3217 key: "myapex.key",
3218 native_shared_libs: ["mylib", "mylib2"],
3219 min_sdk_version: "30",
3220 }
3221 `)
3222 expectLink := func(from, from_variant, to, to_variant string) {
3223 ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
3224 libFlags := ld.Args["libFlags"]
3225 ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
3226 }
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003227 expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
Colin Crossea91a172024-11-05 16:14:05 -08003228 expectLink("mylib", "shared_apex30", "mylib2", "shared_current")
Jooyung Han749dc692020-04-15 11:03:39 +09003229}
3230
Jooyung Haned124c32021-01-26 11:43:46 +09003231func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003232 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003233 withSAsActiveCodeNames := android.FixtureModifyProductVariables(
3234 func(variables android.FixtureProductVariables) {
3235 variables.Platform_sdk_codename = proptools.StringPtr("S")
3236 variables.Platform_version_active_codenames = []string{"S"}
3237 },
3238 )
Jooyung Haned124c32021-01-26 11:43:46 +09003239 testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
3240 apex {
3241 name: "myapex",
3242 key: "myapex.key",
3243 native_shared_libs: ["libfoo"],
3244 min_sdk_version: "S",
3245 }
3246 apex_key {
3247 name: "myapex.key",
3248 public_key: "testkey.avbpubkey",
3249 private_key: "testkey.pem",
3250 }
3251 cc_library {
3252 name: "libfoo",
3253 shared_libs: ["libbar"],
3254 apex_available: ["myapex"],
3255 min_sdk_version: "29",
3256 }
3257 cc_library {
3258 name: "libbar",
3259 apex_available: ["myapex"],
3260 }
3261 `, withSAsActiveCodeNames)
3262}
3263
3264func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003265 t.Parallel()
Paul Duffin0a49fdc2021-03-08 11:28:25 +00003266 withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
3267 variables.Platform_sdk_codename = proptools.StringPtr("S")
3268 variables.Platform_version_active_codenames = []string{"S", "T"}
3269 })
Colin Cross1c460562021-02-16 17:55:47 -08003270 ctx := testApex(t, `
Jooyung Haned124c32021-01-26 11:43:46 +09003271 apex {
3272 name: "myapex",
3273 key: "myapex.key",
3274 native_shared_libs: ["libfoo"],
3275 min_sdk_version: "S",
3276 }
3277 apex_key {
3278 name: "myapex.key",
3279 public_key: "testkey.avbpubkey",
3280 private_key: "testkey.pem",
3281 }
3282 cc_library {
3283 name: "libfoo",
3284 shared_libs: ["libbar"],
3285 apex_available: ["myapex"],
3286 min_sdk_version: "S",
3287 }
3288 cc_library {
3289 name: "libbar",
3290 stubs: {
3291 symbol_file: "libbar.map.txt",
3292 versions: ["30", "S", "T"],
3293 },
3294 }
3295 `, withSAsActiveCodeNames)
3296
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003297 // ensure libfoo is linked with current version of libbar stub
Jooyung Haned124c32021-01-26 11:43:46 +09003298 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
3299 libFlags := libfoo.Rule("ld").Args["libFlags"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09003300 ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
Jooyung Haned124c32021-01-26 11:43:46 +09003301}
3302
Jiyong Park7c2ee712018-12-07 00:42:25 +09003303func TestFilesInSubDir(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003304 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003305 ctx := testApex(t, `
Jiyong Park7c2ee712018-12-07 00:42:25 +09003306 apex {
3307 name: "myapex",
3308 key: "myapex.key",
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003309 native_shared_libs: ["mylib"],
Jooyung Han4ed512b2023-08-11 16:30:04 +09003310 binaries: ["mybin", "mybin.rust"],
Jiyong Park7c2ee712018-12-07 00:42:25 +09003311 prebuilts: ["myetc"],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003312 compile_multilib: "both",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003313 updatable: false,
Jiyong Park7c2ee712018-12-07 00:42:25 +09003314 }
3315
3316 apex_key {
3317 name: "myapex.key",
3318 public_key: "testkey.avbpubkey",
3319 private_key: "testkey.pem",
3320 }
3321
3322 prebuilt_etc {
3323 name: "myetc",
3324 src: "myprebuilt",
3325 sub_dir: "foo/bar",
3326 }
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003327
3328 cc_library {
3329 name: "mylib",
3330 srcs: ["mylib.cpp"],
3331 relative_install_path: "foo/bar",
3332 system_shared_libs: [],
3333 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003334 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003335 }
3336
3337 cc_binary {
3338 name: "mybin",
3339 srcs: ["mylib.cpp"],
3340 relative_install_path: "foo/bar",
3341 system_shared_libs: [],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003342 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003343 apex_available: [ "myapex" ],
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003344 }
Jooyung Han4ed512b2023-08-11 16:30:04 +09003345
3346 rust_binary {
3347 name: "mybin.rust",
3348 srcs: ["foo.rs"],
3349 relative_install_path: "rust_subdir",
3350 apex_available: [ "myapex" ],
3351 }
Jiyong Park7c2ee712018-12-07 00:42:25 +09003352 `)
3353
Jooyung Hana0503a52023-08-23 13:12:50 +09003354 generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("generateFsConfig")
Jiyong Park1b0893e2021-12-13 23:40:17 +09003355 cmd := generateFsRule.RuleParams.Command
Jiyong Park7c2ee712018-12-07 00:42:25 +09003356
Jiyong Parkb7c24df2019-02-01 12:03:59 +09003357 // Ensure that the subdirectories are all listed
Jiyong Park1b0893e2021-12-13 23:40:17 +09003358 ensureContains(t, cmd, "/etc ")
3359 ensureContains(t, cmd, "/etc/foo ")
3360 ensureContains(t, cmd, "/etc/foo/bar ")
3361 ensureContains(t, cmd, "/lib64 ")
3362 ensureContains(t, cmd, "/lib64/foo ")
3363 ensureContains(t, cmd, "/lib64/foo/bar ")
3364 ensureContains(t, cmd, "/lib ")
3365 ensureContains(t, cmd, "/lib/foo ")
3366 ensureContains(t, cmd, "/lib/foo/bar ")
3367 ensureContains(t, cmd, "/bin ")
3368 ensureContains(t, cmd, "/bin/foo ")
3369 ensureContains(t, cmd, "/bin/foo/bar ")
Jooyung Han4ed512b2023-08-11 16:30:04 +09003370 ensureContains(t, cmd, "/bin/rust_subdir ")
Jiyong Park7c2ee712018-12-07 00:42:25 +09003371}
Jiyong Parkda6eb592018-12-19 17:12:36 +09003372
Jooyung Han35155c42020-02-06 17:33:20 +09003373func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003375 ctx := testApex(t, `
Jooyung Han35155c42020-02-06 17:33:20 +09003376 apex {
3377 name: "myapex",
3378 key: "myapex.key",
3379 multilib: {
3380 both: {
3381 native_shared_libs: ["mylib"],
3382 binaries: ["mybin"],
3383 },
3384 },
3385 compile_multilib: "both",
3386 native_bridge_supported: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003387 updatable: false,
Jooyung Han35155c42020-02-06 17:33:20 +09003388 }
3389
3390 apex_key {
3391 name: "myapex.key",
3392 public_key: "testkey.avbpubkey",
3393 private_key: "testkey.pem",
3394 }
3395
3396 cc_library {
3397 name: "mylib",
3398 relative_install_path: "foo/bar",
3399 system_shared_libs: [],
3400 stl: "none",
3401 apex_available: [ "myapex" ],
3402 native_bridge_supported: true,
3403 }
3404
3405 cc_binary {
3406 name: "mybin",
3407 relative_install_path: "foo/bar",
3408 system_shared_libs: [],
Jooyung Han35155c42020-02-06 17:33:20 +09003409 stl: "none",
3410 apex_available: [ "myapex" ],
3411 native_bridge_supported: true,
3412 compile_multilib: "both", // default is "first" for binary
3413 multilib: {
3414 lib64: {
3415 suffix: "64",
3416 },
3417 },
3418 }
Spandan Das45e40012024-12-02 22:45:48 +00003419 `, android.PrepareForNativeBridgeEnabled)
Jooyung Hana0503a52023-08-23 13:12:50 +09003420 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han35155c42020-02-06 17:33:20 +09003421 "bin/foo/bar/mybin",
3422 "bin/foo/bar/mybin64",
3423 "bin/arm/foo/bar/mybin",
3424 "bin/arm64/foo/bar/mybin64",
3425 "lib/foo/bar/mylib.so",
3426 "lib/arm/foo/bar/mylib.so",
3427 "lib64/foo/bar/mylib.so",
3428 "lib64/arm64/foo/bar/mylib.so",
3429 })
3430}
3431
Jooyung Han85d61762020-06-24 23:50:26 +09003432func TestVendorApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003433 t.Parallel()
Colin Crossc68db4b2021-11-11 18:59:15 -08003434 result := android.GroupFixturePreparers(
3435 prepareForApexTest,
3436 android.FixtureModifyConfig(android.SetKatiEnabledForTests),
3437 ).RunTestWithBp(t, `
Jooyung Han85d61762020-06-24 23:50:26 +09003438 apex {
3439 name: "myapex",
3440 key: "myapex.key",
3441 binaries: ["mybin"],
3442 vendor: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003443 updatable: false,
Jooyung Han85d61762020-06-24 23:50:26 +09003444 }
3445 apex_key {
3446 name: "myapex.key",
3447 public_key: "testkey.avbpubkey",
3448 private_key: "testkey.pem",
3449 }
3450 cc_binary {
3451 name: "mybin",
3452 vendor: true,
3453 shared_libs: ["libfoo"],
3454 }
3455 cc_library {
3456 name: "libfoo",
3457 proprietary: true,
3458 }
3459 `)
3460
Jooyung Hana0503a52023-08-23 13:12:50 +09003461 ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex", []string{
Jooyung Han85d61762020-06-24 23:50:26 +09003462 "bin/mybin",
3463 "lib64/libfoo.so",
3464 // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
3465 "lib64/libc++.so",
3466 })
3467
Jooyung Hana0503a52023-08-23 13:12:50 +09003468 apexBundle := result.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossc68db4b2021-11-11 18:59:15 -08003469 data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
Jooyung Han85d61762020-06-24 23:50:26 +09003470 name := apexBundle.BaseModuleName()
3471 prefix := "TARGET_"
3472 var builder strings.Builder
3473 data.Custom(&builder, name, prefix, "", data)
Colin Crossc68db4b2021-11-11 18:59:15 -08003474 androidMk := android.StringRelativeToTop(result.Config, builder.String())
Paul Duffin37ba3442021-03-29 00:21:08 +01003475 installPath := "out/target/product/test_device/vendor/apex"
Lukacs T. Berki7690c092021-02-26 14:27:36 +01003476 ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003477
Jooyung Hana0503a52023-08-23 13:12:50 +09003478 apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han6c4cc9c2020-07-29 16:00:54 +09003479 requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
3480 ensureListNotContains(t, requireNativeLibs, ":vndk")
Jooyung Han85d61762020-06-24 23:50:26 +09003481}
3482
Justin Yun13decfb2021-03-08 19:25:55 +09003483func TestProductVariant(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003484 t.Parallel()
Justin Yun13decfb2021-03-08 19:25:55 +09003485 ctx := testApex(t, `
3486 apex {
3487 name: "myapex",
3488 key: "myapex.key",
3489 updatable: false,
3490 product_specific: true,
3491 binaries: ["foo"],
3492 }
3493
3494 apex_key {
3495 name: "myapex.key",
3496 public_key: "testkey.avbpubkey",
3497 private_key: "testkey.pem",
3498 }
3499
3500 cc_binary {
3501 name: "foo",
3502 product_available: true,
3503 apex_available: ["myapex"],
3504 srcs: ["foo.cpp"],
3505 }
Justin Yunaf1fde42023-09-27 16:22:10 +09003506 `)
Justin Yun13decfb2021-03-08 19:25:55 +09003507
3508 cflags := strings.Fields(
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09003509 ctx.ModuleForTests("foo", "android_product_arm64_armv8-a_apex10000").Rule("cc").Args["cFlags"])
Justin Yun13decfb2021-03-08 19:25:55 +09003510 ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
3511 ensureListContains(t, cflags, "-D__ANDROID_APEX__")
3512 ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
3513 ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
3514}
3515
Jooyung Han8e5685d2020-09-21 11:02:57 +09003516func TestApex_withPrebuiltFirmware(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003517 t.Parallel()
Jooyung Han8e5685d2020-09-21 11:02:57 +09003518 testCases := []struct {
3519 name string
3520 additionalProp string
3521 }{
3522 {"system apex with prebuilt_firmware", ""},
3523 {"vendor apex with prebuilt_firmware", "vendor: true,"},
3524 }
3525 for _, tc := range testCases {
3526 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003527 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003528 ctx := testApex(t, `
Jooyung Han8e5685d2020-09-21 11:02:57 +09003529 apex {
3530 name: "myapex",
3531 key: "myapex.key",
3532 prebuilts: ["myfirmware"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003533 updatable: false,
Jooyung Han8e5685d2020-09-21 11:02:57 +09003534 `+tc.additionalProp+`
3535 }
3536 apex_key {
3537 name: "myapex.key",
3538 public_key: "testkey.avbpubkey",
3539 private_key: "testkey.pem",
3540 }
3541 prebuilt_firmware {
3542 name: "myfirmware",
3543 src: "myfirmware.bin",
3544 filename_from_src: true,
3545 `+tc.additionalProp+`
3546 }
3547 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09003548 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han8e5685d2020-09-21 11:02:57 +09003549 "etc/firmware/myfirmware.bin",
3550 })
3551 })
3552 }
Jooyung Han0703fd82020-08-26 22:11:53 +09003553}
3554
Jooyung Hanefb184e2020-06-25 17:14:25 +09003555func TestAndroidMk_VendorApexRequired(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003556 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003557 ctx := testApex(t, `
Jooyung Hanefb184e2020-06-25 17:14:25 +09003558 apex {
3559 name: "myapex",
3560 key: "myapex.key",
3561 vendor: true,
3562 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003563 updatable: false,
Jooyung Hanefb184e2020-06-25 17:14:25 +09003564 }
3565
3566 apex_key {
3567 name: "myapex.key",
3568 public_key: "testkey.avbpubkey",
3569 private_key: "testkey.pem",
3570 }
3571
3572 cc_library {
3573 name: "mylib",
3574 vendor_available: true,
3575 }
3576 `)
3577
Jooyung Hana0503a52023-08-23 13:12:50 +09003578 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003579 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Hanefb184e2020-06-25 17:14:25 +09003580 name := apexBundle.BaseModuleName()
3581 prefix := "TARGET_"
3582 var builder strings.Builder
3583 data.Custom(&builder, name, prefix, "", data)
3584 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09003585 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 libc.vendor libm.vendor libdl.vendor\n")
Jooyung Hanefb184e2020-06-25 17:14:25 +09003586}
3587
Jooyung Han2ed99d02020-06-24 23:26:26 +09003588func TestAndroidMkWritesCommonProperties(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08003589 ctx := testApex(t, `
Jooyung Han2ed99d02020-06-24 23:26:26 +09003590 apex {
3591 name: "myapex",
3592 key: "myapex.key",
3593 vintf_fragments: ["fragment.xml"],
3594 init_rc: ["init.rc"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003595 updatable: false,
Jooyung Han2ed99d02020-06-24 23:26:26 +09003596 }
3597 apex_key {
3598 name: "myapex.key",
3599 public_key: "testkey.avbpubkey",
3600 private_key: "testkey.pem",
3601 }
3602 cc_binary {
3603 name: "mybin",
3604 }
3605 `)
3606
Jooyung Hana0503a52023-08-23 13:12:50 +09003607 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07003608 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jooyung Han2ed99d02020-06-24 23:26:26 +09003609 name := apexBundle.BaseModuleName()
3610 prefix := "TARGET_"
3611 var builder strings.Builder
3612 data.Custom(&builder, name, prefix, "", data)
3613 androidMk := builder.String()
Liz Kammer7b3dc8a2021-04-16 16:41:59 -04003614 ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
Liz Kammer0c4f71c2021-04-06 10:35:10 -04003615 ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
Jooyung Han2ed99d02020-06-24 23:26:26 +09003616}
3617
Jiyong Park16e91a02018-12-20 18:18:08 +09003618func TestStaticLinking(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003619 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003620 ctx := testApex(t, `
Jiyong Park16e91a02018-12-20 18:18:08 +09003621 apex {
3622 name: "myapex",
3623 key: "myapex.key",
3624 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003625 updatable: false,
Jiyong Park16e91a02018-12-20 18:18:08 +09003626 }
3627
3628 apex_key {
3629 name: "myapex.key",
3630 public_key: "testkey.avbpubkey",
3631 private_key: "testkey.pem",
3632 }
3633
3634 cc_library {
3635 name: "mylib",
3636 srcs: ["mylib.cpp"],
3637 system_shared_libs: [],
3638 stl: "none",
3639 stubs: {
3640 versions: ["1", "2", "3"],
3641 },
Spandan Das20fce2d2023-04-12 17:21:39 +00003642 apex_available: ["myapex"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003643 }
3644
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003645 rust_ffi {
3646 name: "libmylib_rs",
3647 crate_name: "mylib_rs",
3648 srcs: ["mylib.rs"],
3649 stubs: {
3650 versions: ["1", "2", "3"],
3651 },
3652 apex_available: ["myapex"],
3653 }
3654
Jiyong Park16e91a02018-12-20 18:18:08 +09003655 cc_binary {
3656 name: "not_in_apex",
3657 srcs: ["mylib.cpp"],
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003658 static_libs: ["mylib", "libmylib_rs"],
Jiyong Park16e91a02018-12-20 18:18:08 +09003659 static_executable: true,
3660 system_shared_libs: [],
3661 stl: "none",
3662 }
Jiyong Park16e91a02018-12-20 18:18:08 +09003663 `)
3664
Colin Cross7113d202019-11-20 16:39:12 -08003665 ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
Jiyong Park16e91a02018-12-20 18:18:08 +09003666
3667 // Ensure that not_in_apex is linking with the static variant of mylib
Colin Cross7113d202019-11-20 16:39:12 -08003668 ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +00003669 ensureContains(t, ldFlags, "generated_rust_staticlib/librustlibs.a")
Jiyong Park16e91a02018-12-20 18:18:08 +09003670}
Jiyong Park9335a262018-12-24 11:31:58 +09003671
3672func TestKeys(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003673 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003674 ctx := testApex(t, `
Jiyong Park9335a262018-12-24 11:31:58 +09003675 apex {
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003676 name: "myapex_keytest",
Jiyong Park9335a262018-12-24 11:31:58 +09003677 key: "myapex.key",
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003678 certificate: ":myapex.certificate",
Jiyong Park9335a262018-12-24 11:31:58 +09003679 native_shared_libs: ["mylib"],
Jooyung Han54aca7b2019-11-20 02:26:02 +09003680 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003681 updatable: false,
Jiyong Park9335a262018-12-24 11:31:58 +09003682 }
3683
3684 cc_library {
3685 name: "mylib",
3686 srcs: ["mylib.cpp"],
3687 system_shared_libs: [],
3688 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003689 apex_available: [ "myapex_keytest" ],
Jiyong Park9335a262018-12-24 11:31:58 +09003690 }
3691
3692 apex_key {
3693 name: "myapex.key",
3694 public_key: "testkey.avbpubkey",
3695 private_key: "testkey.pem",
3696 }
3697
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003698 android_app_certificate {
3699 name: "myapex.certificate",
3700 certificate: "testkey",
3701 }
3702
3703 android_app_certificate {
3704 name: "myapex.certificate.override",
3705 certificate: "testkey.override",
3706 }
3707
Jiyong Park9335a262018-12-24 11:31:58 +09003708 `)
3709
3710 // check the APEX keys
Jiyong Parkd1e293d2019-03-15 02:13:21 +09003711 keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
Jiyong Park9335a262018-12-24 11:31:58 +09003712
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003713 if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
3714 t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003715 "vendor/foo/devkeys/testkey.avbpubkey")
3716 }
Jaewoong Jung18aefc12020-12-21 09:11:10 -08003717 if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
3718 t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
Jiyong Park9335a262018-12-24 11:31:58 +09003719 "vendor/foo/devkeys/testkey.pem")
3720 }
3721
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003722 // check the APK certs. It should be overridden to myapex.certificate.override
Jooyung Hana0503a52023-08-23 13:12:50 +09003723 certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk").Args["certificates"]
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003724 if certs != "testkey.override.x509.pem testkey.override.pk8" {
Jiyong Park9335a262018-12-24 11:31:58 +09003725 t.Errorf("cert and private key %q are not %q", certs,
Jiyong Parkb2742fd2019-02-11 11:38:15 +09003726 "testkey.override.509.pem testkey.override.pk8")
Jiyong Park9335a262018-12-24 11:31:58 +09003727 }
3728}
Jiyong Park58e364a2019-01-19 19:24:06 +09003729
Jooyung Hanf121a652019-12-17 14:30:11 +09003730func TestCertificate(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003731 t.Parallel()
Jooyung Hanf121a652019-12-17 14:30:11 +09003732 t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003733 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003734 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003735 apex {
3736 name: "myapex",
3737 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003738 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003739 }
3740 apex_key {
3741 name: "myapex.key",
3742 public_key: "testkey.avbpubkey",
3743 private_key: "testkey.pem",
3744 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003745 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003746 expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
3747 if actual := rule.Args["certificates"]; actual != expected {
3748 t.Errorf("certificates should be %q, not %q", expected, actual)
3749 }
3750 })
3751 t.Run("override when unspecified", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003752 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003753 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003754 apex {
3755 name: "myapex_keytest",
3756 key: "myapex.key",
3757 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003758 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003759 }
3760 apex_key {
3761 name: "myapex.key",
3762 public_key: "testkey.avbpubkey",
3763 private_key: "testkey.pem",
3764 }
3765 android_app_certificate {
3766 name: "myapex.certificate.override",
3767 certificate: "testkey.override",
3768 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003769 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003770 expected := "testkey.override.x509.pem testkey.override.pk8"
3771 if actual := rule.Args["certificates"]; actual != expected {
3772 t.Errorf("certificates should be %q, not %q", expected, actual)
3773 }
3774 })
3775 t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003776 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003777 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003778 apex {
3779 name: "myapex",
3780 key: "myapex.key",
3781 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003782 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003783 }
3784 apex_key {
3785 name: "myapex.key",
3786 public_key: "testkey.avbpubkey",
3787 private_key: "testkey.pem",
3788 }
3789 android_app_certificate {
3790 name: "myapex.certificate",
3791 certificate: "testkey",
3792 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003793 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003794 expected := "testkey.x509.pem testkey.pk8"
3795 if actual := rule.Args["certificates"]; actual != expected {
3796 t.Errorf("certificates should be %q, not %q", expected, actual)
3797 }
3798 })
3799 t.Run("override when specifiec as <:module>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003800 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003801 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003802 apex {
3803 name: "myapex_keytest",
3804 key: "myapex.key",
3805 file_contexts: ":myapex-file_contexts",
3806 certificate: ":myapex.certificate",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003807 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003808 }
3809 apex_key {
3810 name: "myapex.key",
3811 public_key: "testkey.avbpubkey",
3812 private_key: "testkey.pem",
3813 }
3814 android_app_certificate {
3815 name: "myapex.certificate.override",
3816 certificate: "testkey.override",
3817 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003818 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003819 expected := "testkey.override.x509.pem testkey.override.pk8"
3820 if actual := rule.Args["certificates"]; actual != expected {
3821 t.Errorf("certificates should be %q, not %q", expected, actual)
3822 }
3823 })
3824 t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003825 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003826 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003827 apex {
3828 name: "myapex",
3829 key: "myapex.key",
3830 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003831 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003832 }
3833 apex_key {
3834 name: "myapex.key",
3835 public_key: "testkey.avbpubkey",
3836 private_key: "testkey.pem",
Spandan Das7701d5f2024-12-17 17:52:26 +00003837 }`,
3838 android.MockFS{
3839 "vendor/foo/devkeys/testkey.x509.pem": nil,
3840 }.AddToFixture(),
3841 )
Jooyung Hana0503a52023-08-23 13:12:50 +09003842 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003843 expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
3844 if actual := rule.Args["certificates"]; actual != expected {
3845 t.Errorf("certificates should be %q, not %q", expected, actual)
3846 }
3847 })
3848 t.Run("override when specified as <name>", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003849 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003850 ctx := testApex(t, `
Jooyung Hanf121a652019-12-17 14:30:11 +09003851 apex {
3852 name: "myapex_keytest",
3853 key: "myapex.key",
3854 file_contexts: ":myapex-file_contexts",
3855 certificate: "testkey",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003856 updatable: false,
Jooyung Hanf121a652019-12-17 14:30:11 +09003857 }
3858 apex_key {
3859 name: "myapex.key",
3860 public_key: "testkey.avbpubkey",
3861 private_key: "testkey.pem",
3862 }
3863 android_app_certificate {
3864 name: "myapex.certificate.override",
3865 certificate: "testkey.override",
3866 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09003867 rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest").Rule("signapk")
Jooyung Hanf121a652019-12-17 14:30:11 +09003868 expected := "testkey.override.x509.pem testkey.override.pk8"
3869 if actual := rule.Args["certificates"]; actual != expected {
3870 t.Errorf("certificates should be %q, not %q", expected, actual)
3871 }
3872 })
3873}
3874
Jiyong Park58e364a2019-01-19 19:24:06 +09003875func TestMacro(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003876 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003877 ctx := testApex(t, `
Jiyong Park58e364a2019-01-19 19:24:06 +09003878 apex {
3879 name: "myapex",
3880 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003881 native_shared_libs: ["mylib", "mylib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003882 updatable: false,
Jiyong Park58e364a2019-01-19 19:24:06 +09003883 }
3884
3885 apex {
3886 name: "otherapex",
3887 key: "myapex.key",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003888 native_shared_libs: ["mylib", "mylib2"],
Jooyung Hanccce2f22020-03-07 03:45:53 +09003889 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003890 }
3891
3892 apex_key {
3893 name: "myapex.key",
3894 public_key: "testkey.avbpubkey",
3895 private_key: "testkey.pem",
3896 }
3897
3898 cc_library {
3899 name: "mylib",
3900 srcs: ["mylib.cpp"],
3901 system_shared_libs: [],
3902 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003903 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00003904 "myapex",
3905 "otherapex",
3906 ],
Jooyung Han24282772020-03-21 23:20:55 +09003907 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003908 min_sdk_version: "29",
Jiyong Park58e364a2019-01-19 19:24:06 +09003909 }
Jooyung Hanc87a0592020-03-02 17:44:33 +09003910 cc_library {
3911 name: "mylib2",
3912 srcs: ["mylib.cpp"],
3913 system_shared_libs: [],
3914 stl: "none",
3915 apex_available: [
3916 "myapex",
3917 "otherapex",
3918 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003919 static_libs: ["mylib3"],
3920 recovery_available: true,
3921 min_sdk_version: "29",
3922 }
3923 cc_library {
3924 name: "mylib3",
3925 srcs: ["mylib.cpp"],
3926 system_shared_libs: [],
3927 stl: "none",
3928 apex_available: [
3929 "myapex",
3930 "otherapex",
3931 ],
Colin Crossaede88c2020-08-11 12:17:01 -07003932 recovery_available: true,
Jooyung Han749dc692020-04-15 11:03:39 +09003933 min_sdk_version: "29",
Jooyung Hanc87a0592020-03-02 17:44:33 +09003934 }
Jiyong Park58e364a2019-01-19 19:24:06 +09003935 `)
3936
Jooyung Hanc87a0592020-03-02 17:44:33 +09003937 // non-APEX variant does not have __ANDROID_APEX__ defined
Colin Cross7113d202019-11-20 16:39:12 -08003938 mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han6b8459b2019-10-30 08:29:25 +09003939 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003940
Vinh Tranf9754732023-01-19 22:41:46 -05003941 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003942 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003943 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jooyung Hanc87a0592020-03-02 17:44:33 +09003944
Vinh Tranf9754732023-01-19 22:41:46 -05003945 // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
Colin Crossaede88c2020-08-11 12:17:01 -07003946 mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
Jooyung Hanc87a0592020-03-02 17:44:33 +09003947 ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003948
Colin Crossaede88c2020-08-11 12:17:01 -07003949 // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
3950 // each variant defines additional macros to distinguish which apex variant it is built for
3951
3952 // non-APEX variant does not have __ANDROID_APEX__ defined
3953 mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3954 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3955
Vinh Tranf9754732023-01-19 22:41:46 -05003956 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003957 mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3958 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Colin Crossaede88c2020-08-11 12:17:01 -07003959
Jooyung Hanc87a0592020-03-02 17:44:33 +09003960 // non-APEX variant does not have __ANDROID_APEX__ defined
3961 mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
3962 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
3963
Vinh Tranf9754732023-01-19 22:41:46 -05003964 // recovery variant does not set __ANDROID_APEX__
Colin Crossaede88c2020-08-11 12:17:01 -07003965 mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jooyung Han24282772020-03-21 23:20:55 +09003966 ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
Jiyong Park58e364a2019-01-19 19:24:06 +09003967}
Jiyong Park7e636d02019-01-28 16:16:54 +09003968
3969func TestHeaderLibsDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07003970 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08003971 ctx := testApex(t, `
Jiyong Park7e636d02019-01-28 16:16:54 +09003972 apex {
3973 name: "myapex",
3974 key: "myapex.key",
3975 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00003976 updatable: false,
Jiyong Park7e636d02019-01-28 16:16:54 +09003977 }
3978
3979 apex_key {
3980 name: "myapex.key",
3981 public_key: "testkey.avbpubkey",
3982 private_key: "testkey.pem",
3983 }
3984
3985 cc_library_headers {
3986 name: "mylib_headers",
3987 export_include_dirs: ["my_include"],
3988 system_shared_libs: [],
3989 stl: "none",
Jiyong Park0f80c182020-01-31 02:49:53 +09003990 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09003991 }
3992
3993 cc_library {
3994 name: "mylib",
3995 srcs: ["mylib.cpp"],
3996 system_shared_libs: [],
3997 stl: "none",
3998 header_libs: ["mylib_headers"],
3999 export_header_lib_headers: ["mylib_headers"],
4000 stubs: {
4001 versions: ["1", "2", "3"],
4002 },
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004003 apex_available: [ "myapex" ],
Jiyong Park7e636d02019-01-28 16:16:54 +09004004 }
4005
4006 cc_library {
4007 name: "otherlib",
4008 srcs: ["mylib.cpp"],
4009 system_shared_libs: [],
4010 stl: "none",
4011 shared_libs: ["mylib"],
4012 }
4013 `)
4014
Colin Cross7113d202019-11-20 16:39:12 -08004015 cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
Jiyong Park7e636d02019-01-28 16:16:54 +09004016
4017 // Ensure that the include path of the header lib is exported to 'otherlib'
4018 ensureContains(t, cFlags, "-Imy_include")
4019}
Alex Light9670d332019-01-29 18:07:33 -08004020
Jiyong Park7cd10e32020-01-14 09:22:18 +09004021type fileInApex struct {
4022 path string // path in apex
Jooyung Hana57af4a2020-01-23 05:36:59 +00004023 src string // src path
Jiyong Park7cd10e32020-01-14 09:22:18 +09004024 isLink bool
4025}
4026
Jooyung Han1724d582022-12-21 10:17:44 +09004027func (f fileInApex) String() string {
4028 return f.src + ":" + f.path
4029}
4030
4031func (f fileInApex) match(expectation string) bool {
4032 parts := strings.Split(expectation, ":")
4033 if len(parts) == 1 {
4034 match, _ := path.Match(parts[0], f.path)
4035 return match
4036 }
4037 if len(parts) == 2 {
4038 matchSrc, _ := path.Match(parts[0], f.src)
4039 matchDst, _ := path.Match(parts[1], f.path)
4040 return matchSrc && matchDst
4041 }
4042 panic("invalid expected file specification: " + expectation)
4043}
4044
Jooyung Hana57af4a2020-01-23 05:36:59 +00004045func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
Jooyung Han31c470b2019-10-18 16:26:59 +09004046 t.Helper()
Jooyung Han1724d582022-12-21 10:17:44 +09004047 module := ctx.ModuleForTests(moduleName, variant)
4048 apexRule := module.MaybeRule("apexRule")
4049 apexDir := "/image.apex/"
Jooyung Han31c470b2019-10-18 16:26:59 +09004050 copyCmds := apexRule.Args["copy_commands"]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004051 var ret []fileInApex
Jooyung Han31c470b2019-10-18 16:26:59 +09004052 for _, cmd := range strings.Split(copyCmds, "&&") {
4053 cmd = strings.TrimSpace(cmd)
4054 if cmd == "" {
4055 continue
4056 }
4057 terms := strings.Split(cmd, " ")
Jooyung Hana57af4a2020-01-23 05:36:59 +00004058 var dst, src string
Jiyong Park7cd10e32020-01-14 09:22:18 +09004059 var isLink bool
Jooyung Han31c470b2019-10-18 16:26:59 +09004060 switch terms[0] {
4061 case "mkdir":
4062 case "cp":
Jiyong Park7cd10e32020-01-14 09:22:18 +09004063 if len(terms) != 3 && len(terms) != 4 {
Jooyung Han31c470b2019-10-18 16:26:59 +09004064 t.Fatal("copyCmds contains invalid cp command", cmd)
4065 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004066 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004067 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004068 isLink = false
4069 case "ln":
4070 if len(terms) != 3 && len(terms) != 4 {
4071 // ln LINK TARGET or ln -s LINK TARGET
4072 t.Fatal("copyCmds contains invalid ln command", cmd)
4073 }
4074 dst = terms[len(terms)-1]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004075 src = terms[len(terms)-2]
Jiyong Park7cd10e32020-01-14 09:22:18 +09004076 isLink = true
4077 default:
4078 t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
4079 }
4080 if dst != "" {
Jooyung Han1724d582022-12-21 10:17:44 +09004081 index := strings.Index(dst, apexDir)
Jooyung Han31c470b2019-10-18 16:26:59 +09004082 if index == -1 {
Jooyung Han1724d582022-12-21 10:17:44 +09004083 t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
Jooyung Han31c470b2019-10-18 16:26:59 +09004084 }
Jooyung Han1724d582022-12-21 10:17:44 +09004085 dstFile := dst[index+len(apexDir):]
Jooyung Hana57af4a2020-01-23 05:36:59 +00004086 ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
Jooyung Han31c470b2019-10-18 16:26:59 +09004087 }
4088 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004089 return ret
4090}
4091
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004092func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
Jooyung Hana57af4a2020-01-23 05:36:59 +00004093 t.Helper()
Jiyong Park7cd10e32020-01-14 09:22:18 +09004094 var failed bool
4095 var surplus []string
4096 filesMatched := make(map[string]bool)
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004097 for _, file := range actualFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004098 matchFound := false
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004099 for _, expected := range expectedFiles {
Jooyung Han1724d582022-12-21 10:17:44 +09004100 if file.match(expected) {
4101 matchFound = true
Jiyong Park7cd10e32020-01-14 09:22:18 +09004102 filesMatched[expected] = true
Jooyung Hane6436d72020-02-27 13:31:56 +09004103 break
Jiyong Park7cd10e32020-01-14 09:22:18 +09004104 }
4105 }
Jooyung Han1724d582022-12-21 10:17:44 +09004106 if !matchFound {
4107 surplus = append(surplus, file.String())
Jooyung Hane6436d72020-02-27 13:31:56 +09004108 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09004109 }
Jooyung Han31c470b2019-10-18 16:26:59 +09004110
Jooyung Han31c470b2019-10-18 16:26:59 +09004111 if len(surplus) > 0 {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004112 sort.Strings(surplus)
Jooyung Han31c470b2019-10-18 16:26:59 +09004113 t.Log("surplus files", surplus)
4114 failed = true
4115 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004116
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004117 if len(expectedFiles) > len(filesMatched) {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004118 var missing []string
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004119 for _, expected := range expectedFiles {
Jooyung Han39edb6c2019-11-06 16:53:07 +09004120 if !filesMatched[expected] {
4121 missing = append(missing, expected)
4122 }
4123 }
4124 sort.Strings(missing)
Jooyung Han31c470b2019-10-18 16:26:59 +09004125 t.Log("missing files", missing)
4126 failed = true
4127 }
4128 if failed {
4129 t.Fail()
4130 }
4131}
4132
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004133func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
4134 assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
4135}
4136
4137func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
Spandan Das52c01a12024-09-20 01:09:48 +00004138 deapexer := ctx.ModuleForTests(moduleName, variant).Description("deapex")
Jiakai Zhangebf48bf2023-02-10 01:51:53 +08004139 outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
4140 if deapexer.Output != nil {
4141 outputs = append(outputs, deapexer.Output.String())
4142 }
4143 for _, output := range deapexer.ImplicitOutputs {
4144 outputs = append(outputs, output.String())
4145 }
4146 actualFiles := make([]fileInApex, 0, len(outputs))
4147 for _, output := range outputs {
4148 dir := "/deapexer/"
4149 pos := strings.LastIndex(output, dir)
4150 if pos == -1 {
4151 t.Fatal("Unknown deapexer output ", output)
4152 }
4153 path := output[pos+len(dir):]
4154 actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
4155 }
4156 assertFileListEquals(t, files, actualFiles)
4157}
4158
Jooyung Han39edb6c2019-11-06 16:53:07 +09004159func vndkLibrariesTxtFiles(vers ...string) (result string) {
4160 for _, v := range vers {
Kiyoung Kim973cb6f2024-04-29 14:14:53 +09004161 for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
Justin Yund5784122023-10-25 13:25:32 +09004162 result += `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004163 prebuilt_etc {
4164 name: "` + txt + `.libraries.` + v + `.txt",
4165 src: "dummy.txt",
4166 }
4167 `
Jooyung Han39edb6c2019-11-06 16:53:07 +09004168 }
4169 }
4170 return
4171}
4172
Jooyung Han344d5432019-08-23 11:17:39 +09004173func TestVndkApexVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004174 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004175 ctx := testApex(t, `
Jooyung Han344d5432019-08-23 11:17:39 +09004176 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004177 name: "com.android.vndk.v27",
Jooyung Han344d5432019-08-23 11:17:39 +09004178 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004179 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004180 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004181 updatable: false,
Jooyung Han344d5432019-08-23 11:17:39 +09004182 }
4183
4184 apex_key {
4185 name: "myapex.key",
4186 public_key: "testkey.avbpubkey",
4187 private_key: "testkey.pem",
4188 }
4189
Jooyung Han31c470b2019-10-18 16:26:59 +09004190 vndk_prebuilt_shared {
4191 name: "libvndk27",
4192 version: "27",
Jooyung Han344d5432019-08-23 11:17:39 +09004193 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004194 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004195 vndk: {
4196 enabled: true,
4197 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004198 target_arch: "arm64",
4199 arch: {
4200 arm: {
4201 srcs: ["libvndk27_arm.so"],
4202 },
4203 arm64: {
4204 srcs: ["libvndk27_arm64.so"],
4205 },
4206 },
Colin Cross2807f002021-03-02 10:15:29 -08004207 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han344d5432019-08-23 11:17:39 +09004208 }
4209
4210 vndk_prebuilt_shared {
4211 name: "libvndk27",
4212 version: "27",
4213 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004214 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004215 vndk: {
4216 enabled: true,
4217 },
Jooyung Han31c470b2019-10-18 16:26:59 +09004218 target_arch: "x86_64",
4219 arch: {
4220 x86: {
4221 srcs: ["libvndk27_x86.so"],
4222 },
4223 x86_64: {
4224 srcs: ["libvndk27_x86_64.so"],
4225 },
4226 },
Jooyung Han39edb6c2019-11-06 16:53:07 +09004227 }
4228 `+vndkLibrariesTxtFiles("27"),
4229 withFiles(map[string][]byte{
4230 "libvndk27_arm.so": nil,
4231 "libvndk27_arm64.so": nil,
4232 "libvndk27_x86.so": nil,
4233 "libvndk27_x86_64.so": nil,
4234 }))
Jooyung Han344d5432019-08-23 11:17:39 +09004235
Jooyung Hana0503a52023-08-23 13:12:50 +09004236 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004237 "lib/libvndk27_arm.so",
4238 "lib64/libvndk27_arm64.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004239 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004240 })
Jooyung Han344d5432019-08-23 11:17:39 +09004241}
4242
Jooyung Han90eee022019-10-01 20:02:42 +09004243func TestVndkApexNameRule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004244 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004245 ctx := testApex(t, `
Jooyung Han90eee022019-10-01 20:02:42 +09004246 apex_vndk {
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004247 name: "com.android.vndk.v29",
Jooyung Han90eee022019-10-01 20:02:42 +09004248 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004249 file_contexts: ":myapex-file_contexts",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004250 vndk_version: "29",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004251 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004252 }
4253 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004254 name: "com.android.vndk.v28",
Jooyung Han90eee022019-10-01 20:02:42 +09004255 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004256 file_contexts: ":myapex-file_contexts",
Jooyung Han90eee022019-10-01 20:02:42 +09004257 vndk_version: "28",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004258 updatable: false,
Jooyung Han90eee022019-10-01 20:02:42 +09004259 }
4260 apex_key {
4261 name: "myapex.key",
4262 public_key: "testkey.avbpubkey",
4263 private_key: "testkey.pem",
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004264 }`+vndkLibrariesTxtFiles("28", "29"))
Jooyung Han90eee022019-10-01 20:02:42 +09004265
4266 assertApexName := func(expected, moduleName string) {
Jooyung Hana0503a52023-08-23 13:12:50 +09004267 module := ctx.ModuleForTests(moduleName, "android_common")
Jooyung Han2cd2f9a2023-02-06 18:29:08 +09004268 apexManifestRule := module.Rule("apexManifestRule")
4269 ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
Jooyung Han90eee022019-10-01 20:02:42 +09004270 }
4271
Kiyoung Kim0d1c1e62024-03-26 16:33:58 +09004272 assertApexName("com.android.vndk.v29", "com.android.vndk.v29")
Colin Cross2807f002021-03-02 10:15:29 -08004273 assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
Jooyung Han90eee022019-10-01 20:02:42 +09004274}
4275
Jooyung Han344d5432019-08-23 11:17:39 +09004276func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004277 t.Parallel()
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004278 testApexError(t, `module "com.android.vndk.v30" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
Jooyung Han344d5432019-08-23 11:17:39 +09004279 apex_vndk {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004280 name: "com.android.vndk.v30",
4281 key: "com.android.vndk.v30.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004282 file_contexts: ":myapex-file_contexts",
Jooyung Han344d5432019-08-23 11:17:39 +09004283 native_bridge_supported: true,
4284 }
4285
4286 apex_key {
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004287 name: "com.android.vndk.v30.key",
Jooyung Han344d5432019-08-23 11:17:39 +09004288 public_key: "testkey.avbpubkey",
4289 private_key: "testkey.pem",
4290 }
4291
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004292 vndk_prebuilt_shared {
Jooyung Han344d5432019-08-23 11:17:39 +09004293 name: "libvndk",
Kiyoung Kim9f26fcf2024-05-27 17:25:52 +09004294 version: "30",
4295 target_arch: "arm",
Jooyung Han344d5432019-08-23 11:17:39 +09004296 srcs: ["mylib.cpp"],
4297 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004298 product_available: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004299 native_bridge_supported: true,
Jooyung Han344d5432019-08-23 11:17:39 +09004300 vndk: {
4301 enabled: true,
4302 },
Jooyung Han344d5432019-08-23 11:17:39 +09004303 }
4304 `)
4305}
4306
Jooyung Han31c470b2019-10-18 16:26:59 +09004307func TestVndkApexWithBinder32(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004308 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004309 ctx := testApex(t, `
Jooyung Han31c470b2019-10-18 16:26:59 +09004310 apex_vndk {
Colin Cross2807f002021-03-02 10:15:29 -08004311 name: "com.android.vndk.v27",
Jooyung Han31c470b2019-10-18 16:26:59 +09004312 key: "myapex.key",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004313 file_contexts: ":myapex-file_contexts",
Jooyung Han31c470b2019-10-18 16:26:59 +09004314 vndk_version: "27",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004315 updatable: false,
Jooyung Han31c470b2019-10-18 16:26:59 +09004316 }
4317
4318 apex_key {
4319 name: "myapex.key",
4320 public_key: "testkey.avbpubkey",
4321 private_key: "testkey.pem",
4322 }
4323
4324 vndk_prebuilt_shared {
4325 name: "libvndk27",
4326 version: "27",
4327 target_arch: "arm",
4328 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004329 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004330 vndk: {
4331 enabled: true,
4332 },
4333 arch: {
4334 arm: {
4335 srcs: ["libvndk27.so"],
4336 }
4337 },
4338 }
4339
4340 vndk_prebuilt_shared {
4341 name: "libvndk27",
4342 version: "27",
4343 target_arch: "arm",
4344 binder32bit: true,
4345 vendor_available: true,
Justin Yun63e9ec72020-10-29 16:49:43 +09004346 product_available: true,
Jooyung Han31c470b2019-10-18 16:26:59 +09004347 vndk: {
4348 enabled: true,
4349 },
4350 arch: {
4351 arm: {
4352 srcs: ["libvndk27binder32.so"],
4353 }
4354 },
Colin Cross2807f002021-03-02 10:15:29 -08004355 apex_available: [ "com.android.vndk.v27" ],
Jooyung Han31c470b2019-10-18 16:26:59 +09004356 }
Jooyung Han39edb6c2019-11-06 16:53:07 +09004357 `+vndkLibrariesTxtFiles("27"),
Jooyung Han31c470b2019-10-18 16:26:59 +09004358 withFiles(map[string][]byte{
4359 "libvndk27.so": nil,
4360 "libvndk27binder32.so": nil,
4361 }),
4362 withBinder32bit,
Cole Faust69788792024-10-10 11:00:36 -07004363 android.FixtureModifyConfig(func(config android.Config) {
4364 target := android.Target{
4365 Os: android.Android,
4366 Arch: android.Arch{
4367 ArchType: android.Arm,
4368 ArchVariant: "armv7-a-neon",
4369 Abi: []string{"armeabi-v7a"},
4370 },
4371 NativeBridge: android.NativeBridgeDisabled,
4372 NativeBridgeHostArchName: "",
4373 NativeBridgeRelativePath: "",
4374 }
4375 config.Targets[android.Android] = []android.Target{target}
4376 config.AndroidFirstDeviceTarget = target
Jooyung Han31c470b2019-10-18 16:26:59 +09004377 }),
4378 )
4379
Jooyung Hana0503a52023-08-23 13:12:50 +09004380 ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common", []string{
Jooyung Han31c470b2019-10-18 16:26:59 +09004381 "lib/libvndk27binder32.so",
Jooyung Han39edb6c2019-11-06 16:53:07 +09004382 "etc/*",
Jooyung Han31c470b2019-10-18 16:26:59 +09004383 })
4384}
4385
Jooyung Hane1633032019-08-01 17:41:43 +09004386func TestDependenciesInApexManifest(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004387 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004388 ctx := testApex(t, `
Jooyung Hane1633032019-08-01 17:41:43 +09004389 apex {
4390 name: "myapex_nodep",
4391 key: "myapex.key",
4392 native_shared_libs: ["lib_nodep"],
4393 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004394 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004395 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004396 }
4397
4398 apex {
4399 name: "myapex_dep",
4400 key: "myapex.key",
4401 native_shared_libs: ["lib_dep"],
4402 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004403 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004404 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004405 }
4406
4407 apex {
4408 name: "myapex_provider",
4409 key: "myapex.key",
4410 native_shared_libs: ["libfoo"],
4411 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004412 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004413 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004414 }
4415
4416 apex {
4417 name: "myapex_selfcontained",
4418 key: "myapex.key",
Spandan Das20fce2d2023-04-12 17:21:39 +00004419 native_shared_libs: ["lib_dep_on_bar", "libbar"],
Jooyung Hane1633032019-08-01 17:41:43 +09004420 compile_multilib: "both",
Jooyung Han54aca7b2019-11-20 02:26:02 +09004421 file_contexts: ":myapex-file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004422 updatable: false,
Jooyung Hane1633032019-08-01 17:41:43 +09004423 }
4424
4425 apex_key {
4426 name: "myapex.key",
4427 public_key: "testkey.avbpubkey",
4428 private_key: "testkey.pem",
4429 }
4430
4431 cc_library {
4432 name: "lib_nodep",
4433 srcs: ["mylib.cpp"],
4434 system_shared_libs: [],
4435 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004436 apex_available: [ "myapex_nodep" ],
Jooyung Hane1633032019-08-01 17:41:43 +09004437 }
4438
4439 cc_library {
4440 name: "lib_dep",
4441 srcs: ["mylib.cpp"],
4442 shared_libs: ["libfoo"],
4443 system_shared_libs: [],
4444 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004445 apex_available: [
4446 "myapex_dep",
4447 "myapex_provider",
4448 "myapex_selfcontained",
4449 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004450 }
4451
4452 cc_library {
Spandan Das20fce2d2023-04-12 17:21:39 +00004453 name: "lib_dep_on_bar",
4454 srcs: ["mylib.cpp"],
4455 shared_libs: ["libbar"],
4456 system_shared_libs: [],
4457 stl: "none",
4458 apex_available: [
4459 "myapex_selfcontained",
4460 ],
4461 }
4462
4463
4464 cc_library {
Jooyung Hane1633032019-08-01 17:41:43 +09004465 name: "libfoo",
4466 srcs: ["mytest.cpp"],
4467 stubs: {
4468 versions: ["1"],
4469 },
4470 system_shared_libs: [],
4471 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004472 apex_available: [
4473 "myapex_provider",
Spandan Das20fce2d2023-04-12 17:21:39 +00004474 ],
4475 }
4476
4477 cc_library {
4478 name: "libbar",
4479 srcs: ["mytest.cpp"],
4480 stubs: {
4481 versions: ["1"],
4482 },
4483 system_shared_libs: [],
4484 stl: "none",
4485 apex_available: [
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004486 "myapex_selfcontained",
4487 ],
Jooyung Hane1633032019-08-01 17:41:43 +09004488 }
Spandan Das20fce2d2023-04-12 17:21:39 +00004489
Jooyung Hane1633032019-08-01 17:41:43 +09004490 `)
4491
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004492 var apexManifestRule android.TestingBuildParams
Jooyung Hane1633032019-08-01 17:41:43 +09004493 var provideNativeLibs, requireNativeLibs []string
4494
Jooyung Hana0503a52023-08-23 13:12:50 +09004495 apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004496 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4497 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004498 ensureListEmpty(t, provideNativeLibs)
4499 ensureListEmpty(t, requireNativeLibs)
4500
Jooyung Hana0503a52023-08-23 13:12:50 +09004501 apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004502 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4503 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004504 ensureListEmpty(t, provideNativeLibs)
4505 ensureListContains(t, requireNativeLibs, "libfoo.so")
4506
Jooyung Hana0503a52023-08-23 13:12:50 +09004507 apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004508 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4509 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Jooyung Hane1633032019-08-01 17:41:43 +09004510 ensureListContains(t, provideNativeLibs, "libfoo.so")
4511 ensureListEmpty(t, requireNativeLibs)
4512
Jooyung Hana0503a52023-08-23 13:12:50 +09004513 apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained").Rule("apexManifestRule")
Jooyung Hand15aa1f2019-09-27 00:38:03 +09004514 provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
4515 requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
Spandan Das20fce2d2023-04-12 17:21:39 +00004516 ensureListContains(t, provideNativeLibs, "libbar.so")
Jooyung Hane1633032019-08-01 17:41:43 +09004517 ensureListEmpty(t, requireNativeLibs)
4518}
4519
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004520func TestOverrideApexManifestDefaultVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004521 t.Parallel()
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004522 ctx := testApex(t, `
4523 apex {
4524 name: "myapex",
4525 key: "myapex.key",
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004526 native_shared_libs: ["mylib"],
4527 updatable: false,
4528 }
4529
4530 apex_key {
4531 name: "myapex.key",
4532 public_key: "testkey.avbpubkey",
4533 private_key: "testkey.pem",
4534 }
4535
4536 cc_library {
4537 name: "mylib",
4538 srcs: ["mylib.cpp"],
4539 system_shared_libs: [],
4540 stl: "none",
4541 apex_available: [
4542 "//apex_available:platform",
4543 "myapex",
4544 ],
4545 }
4546 `, android.FixtureMergeEnv(map[string]string{
4547 "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
4548 }))
4549
Jooyung Hana0503a52023-08-23 13:12:50 +09004550 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sahana Rao16ebdfd2022-12-02 17:00:22 +00004551 apexManifestRule := module.Rule("apexManifestRule")
4552 ensureContains(t, apexManifestRule.Args["default_version"], "1234")
4553}
4554
Vinh Tran8f5310f2022-10-07 18:16:47 -04004555func TestCompileMultilibProp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004556 t.Parallel()
Vinh Tran8f5310f2022-10-07 18:16:47 -04004557 testCases := []struct {
4558 compileMultiLibProp string
4559 containedLibs []string
4560 notContainedLibs []string
4561 }{
4562 {
4563 containedLibs: []string{
4564 "image.apex/lib64/mylib.so",
4565 "image.apex/lib/mylib.so",
4566 },
4567 compileMultiLibProp: `compile_multilib: "both",`,
4568 },
4569 {
4570 containedLibs: []string{"image.apex/lib64/mylib.so"},
4571 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4572 compileMultiLibProp: `compile_multilib: "first",`,
4573 },
4574 {
4575 containedLibs: []string{"image.apex/lib64/mylib.so"},
4576 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4577 // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
4578 },
4579 {
4580 containedLibs: []string{"image.apex/lib64/mylib.so"},
4581 notContainedLibs: []string{"image.apex/lib/mylib.so"},
4582 compileMultiLibProp: `compile_multilib: "64",`,
4583 },
4584 {
4585 containedLibs: []string{"image.apex/lib/mylib.so"},
4586 notContainedLibs: []string{"image.apex/lib64/mylib.so"},
4587 compileMultiLibProp: `compile_multilib: "32",`,
4588 },
4589 }
4590 for _, testCase := range testCases {
4591 ctx := testApex(t, fmt.Sprintf(`
4592 apex {
4593 name: "myapex",
4594 key: "myapex.key",
4595 %s
4596 native_shared_libs: ["mylib"],
4597 updatable: false,
4598 }
4599 apex_key {
4600 name: "myapex.key",
4601 public_key: "testkey.avbpubkey",
4602 private_key: "testkey.pem",
4603 }
4604 cc_library {
4605 name: "mylib",
4606 srcs: ["mylib.cpp"],
4607 apex_available: [
4608 "//apex_available:platform",
4609 "myapex",
4610 ],
4611 }
4612 `, testCase.compileMultiLibProp),
4613 )
Jooyung Hana0503a52023-08-23 13:12:50 +09004614 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Vinh Tran8f5310f2022-10-07 18:16:47 -04004615 apexRule := module.Rule("apexRule")
4616 copyCmds := apexRule.Args["copy_commands"]
4617 for _, containedLib := range testCase.containedLibs {
4618 ensureContains(t, copyCmds, containedLib)
4619 }
4620 for _, notContainedLib := range testCase.notContainedLibs {
4621 ensureNotContains(t, copyCmds, notContainedLib)
4622 }
4623 }
4624}
4625
Alex Light0851b882019-02-07 13:20:53 -08004626func TestNonTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004627 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004628 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004629 apex {
4630 name: "myapex",
4631 key: "myapex.key",
4632 native_shared_libs: ["mylib_common"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004633 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004634 }
4635
4636 apex_key {
4637 name: "myapex.key",
4638 public_key: "testkey.avbpubkey",
4639 private_key: "testkey.pem",
4640 }
4641
4642 cc_library {
4643 name: "mylib_common",
4644 srcs: ["mylib.cpp"],
4645 system_shared_libs: [],
4646 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004647 apex_available: [
4648 "//apex_available:platform",
4649 "myapex",
4650 ],
Alex Light0851b882019-02-07 13:20:53 -08004651 }
4652 `)
4653
Jooyung Hana0503a52023-08-23 13:12:50 +09004654 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004655 apexRule := module.Rule("apexRule")
4656 copyCmds := apexRule.Args["copy_commands"]
4657
4658 if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
4659 t.Log("Apex was a test apex!")
4660 t.Fail()
4661 }
4662 // Ensure that main rule creates an output
4663 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4664
4665 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004666 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004667
4668 // Ensure that both direct and indirect deps are copied into apex
4669 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4670
Colin Cross7113d202019-11-20 16:39:12 -08004671 // Ensure that the platform variant ends with _shared
4672 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004673
Colin Cross56a83212020-09-15 18:30:11 -07004674 if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
Alex Light0851b882019-02-07 13:20:53 -08004675 t.Log("Found mylib_common not in any apex!")
4676 t.Fail()
4677 }
4678}
4679
4680func TestTestApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004681 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004682 ctx := testApex(t, `
Alex Light0851b882019-02-07 13:20:53 -08004683 apex_test {
4684 name: "myapex",
4685 key: "myapex.key",
4686 native_shared_libs: ["mylib_common_test"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004687 updatable: false,
Alex Light0851b882019-02-07 13:20:53 -08004688 }
4689
4690 apex_key {
4691 name: "myapex.key",
4692 public_key: "testkey.avbpubkey",
4693 private_key: "testkey.pem",
4694 }
4695
4696 cc_library {
4697 name: "mylib_common_test",
4698 srcs: ["mylib.cpp"],
4699 system_shared_libs: [],
4700 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004701 // TODO: remove //apex_available:platform
4702 apex_available: [
4703 "//apex_available:platform",
4704 "myapex",
4705 ],
Alex Light0851b882019-02-07 13:20:53 -08004706 }
4707 `)
4708
Jooyung Hana0503a52023-08-23 13:12:50 +09004709 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Alex Light0851b882019-02-07 13:20:53 -08004710 apexRule := module.Rule("apexRule")
4711 copyCmds := apexRule.Args["copy_commands"]
4712
4713 if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
4714 t.Log("Apex was not a test apex!")
4715 t.Fail()
4716 }
4717 // Ensure that main rule creates an output
4718 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4719
4720 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004721 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
Alex Light0851b882019-02-07 13:20:53 -08004722
4723 // Ensure that both direct and indirect deps are copied into apex
4724 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
4725
Colin Cross7113d202019-11-20 16:39:12 -08004726 // Ensure that the platform variant ends with _shared
4727 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
Alex Light0851b882019-02-07 13:20:53 -08004728}
4729
Jooyung Han85707de2023-12-01 14:21:13 +09004730func TestLibzVendorIsntStable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004731 t.Parallel()
Jooyung Han85707de2023-12-01 14:21:13 +09004732 ctx := testApex(t, `
4733 apex {
4734 name: "myapex",
4735 key: "myapex.key",
4736 updatable: false,
4737 binaries: ["mybin"],
4738 }
4739 apex {
4740 name: "myvendorapex",
4741 key: "myapex.key",
4742 file_contexts: "myvendorapex_file_contexts",
4743 vendor: true,
4744 updatable: false,
4745 binaries: ["mybin"],
4746 }
4747 apex_key {
4748 name: "myapex.key",
4749 public_key: "testkey.avbpubkey",
4750 private_key: "testkey.pem",
4751 }
4752 cc_binary {
4753 name: "mybin",
4754 vendor_available: true,
4755 system_shared_libs: [],
4756 stl: "none",
4757 shared_libs: ["libz"],
4758 apex_available: ["//apex_available:anyapex"],
4759 }
4760 cc_library {
4761 name: "libz",
4762 vendor_available: true,
4763 system_shared_libs: [],
4764 stl: "none",
4765 stubs: {
4766 versions: ["28", "30"],
4767 },
4768 target: {
4769 vendor: {
4770 no_stubs: true,
4771 },
4772 },
4773 }
4774 `, withFiles(map[string][]byte{
4775 "myvendorapex_file_contexts": nil,
4776 }))
4777
4778 // libz provides stubs for core variant.
4779 {
4780 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
4781 "bin/mybin",
4782 })
4783 apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
4784 android.AssertStringEquals(t, "should require libz", apexManifestRule.Args["requireNativeLibs"], "libz.so")
4785 }
4786 // libz doesn't provide stubs for vendor variant.
4787 {
4788 ensureExactContents(t, ctx, "myvendorapex", "android_common_myvendorapex", []string{
4789 "bin/mybin",
4790 "lib64/libz.so",
4791 })
4792 apexManifestRule := ctx.ModuleForTests("myvendorapex", "android_common_myvendorapex").Rule("apexManifestRule")
4793 android.AssertStringEquals(t, "should not require libz", apexManifestRule.Args["requireNativeLibs"], "")
4794 }
4795}
4796
Alex Light9670d332019-01-29 18:07:33 -08004797func TestApexWithTarget(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004798 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004799 ctx := testApex(t, `
Alex Light9670d332019-01-29 18:07:33 -08004800 apex {
4801 name: "myapex",
4802 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004803 updatable: false,
Alex Light9670d332019-01-29 18:07:33 -08004804 multilib: {
4805 first: {
4806 native_shared_libs: ["mylib_common"],
4807 }
4808 },
4809 target: {
4810 android: {
4811 multilib: {
4812 first: {
4813 native_shared_libs: ["mylib"],
4814 }
4815 }
4816 },
4817 host: {
4818 multilib: {
4819 first: {
4820 native_shared_libs: ["mylib2"],
4821 }
4822 }
4823 }
4824 }
4825 }
4826
4827 apex_key {
4828 name: "myapex.key",
4829 public_key: "testkey.avbpubkey",
4830 private_key: "testkey.pem",
4831 }
4832
4833 cc_library {
4834 name: "mylib",
4835 srcs: ["mylib.cpp"],
4836 system_shared_libs: [],
4837 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004838 // TODO: remove //apex_available:platform
4839 apex_available: [
4840 "//apex_available:platform",
4841 "myapex",
4842 ],
Alex Light9670d332019-01-29 18:07:33 -08004843 }
4844
4845 cc_library {
4846 name: "mylib_common",
4847 srcs: ["mylib.cpp"],
4848 system_shared_libs: [],
4849 stl: "none",
4850 compile_multilib: "first",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00004851 // TODO: remove //apex_available:platform
4852 apex_available: [
4853 "//apex_available:platform",
4854 "myapex",
4855 ],
Alex Light9670d332019-01-29 18:07:33 -08004856 }
4857
4858 cc_library {
4859 name: "mylib2",
4860 srcs: ["mylib.cpp"],
4861 system_shared_libs: [],
4862 stl: "none",
4863 compile_multilib: "first",
4864 }
4865 `)
4866
Jooyung Hana0503a52023-08-23 13:12:50 +09004867 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Alex Light9670d332019-01-29 18:07:33 -08004868 copyCmds := apexRule.Args["copy_commands"]
4869
4870 // Ensure that main rule creates an output
4871 ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
4872
4873 // Ensure that apex variant is created for the direct dep
Colin Crossaede88c2020-08-11 12:17:01 -07004874 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
4875 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
4876 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
Alex Light9670d332019-01-29 18:07:33 -08004877
4878 // Ensure that both direct and indirect deps are copied into apex
4879 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
4880 ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
4881 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
4882
Colin Cross7113d202019-11-20 16:39:12 -08004883 // Ensure that the platform variant ends with _shared
4884 ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
4885 ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
4886 ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
Alex Light9670d332019-01-29 18:07:33 -08004887}
Jiyong Park04480cf2019-02-06 00:16:29 +09004888
Jiyong Park59140302020-12-14 18:44:04 +09004889func TestApexWithArch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004890 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004891 ctx := testApex(t, `
Jiyong Park59140302020-12-14 18:44:04 +09004892 apex {
4893 name: "myapex",
4894 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004895 updatable: false,
Colin Cross70572ed2022-11-02 13:14:20 -07004896 native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004897 arch: {
4898 arm64: {
4899 native_shared_libs: ["mylib.arm64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004900 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004901 },
4902 x86_64: {
4903 native_shared_libs: ["mylib.x64"],
Colin Cross70572ed2022-11-02 13:14:20 -07004904 exclude_native_shared_libs: ["mylib.generic"],
Jiyong Park59140302020-12-14 18:44:04 +09004905 },
4906 }
4907 }
4908
4909 apex_key {
4910 name: "myapex.key",
4911 public_key: "testkey.avbpubkey",
4912 private_key: "testkey.pem",
4913 }
4914
4915 cc_library {
Colin Cross70572ed2022-11-02 13:14:20 -07004916 name: "mylib.generic",
4917 srcs: ["mylib.cpp"],
4918 system_shared_libs: [],
4919 stl: "none",
4920 // TODO: remove //apex_available:platform
4921 apex_available: [
4922 "//apex_available:platform",
4923 "myapex",
4924 ],
4925 }
4926
4927 cc_library {
Jiyong Park59140302020-12-14 18:44:04 +09004928 name: "mylib.arm64",
4929 srcs: ["mylib.cpp"],
4930 system_shared_libs: [],
4931 stl: "none",
4932 // TODO: remove //apex_available:platform
4933 apex_available: [
4934 "//apex_available:platform",
4935 "myapex",
4936 ],
4937 }
4938
4939 cc_library {
4940 name: "mylib.x64",
4941 srcs: ["mylib.cpp"],
4942 system_shared_libs: [],
4943 stl: "none",
4944 // TODO: remove //apex_available:platform
4945 apex_available: [
4946 "//apex_available:platform",
4947 "myapex",
4948 ],
4949 }
4950 `)
4951
Jooyung Hana0503a52023-08-23 13:12:50 +09004952 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park59140302020-12-14 18:44:04 +09004953 copyCmds := apexRule.Args["copy_commands"]
4954
4955 // Ensure that apex variant is created for the direct dep
4956 ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
Colin Cross70572ed2022-11-02 13:14:20 -07004957 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
Jiyong Park59140302020-12-14 18:44:04 +09004958 ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
4959
4960 // Ensure that both direct and indirect deps are copied into apex
4961 ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
4962 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
4963}
4964
Jiyong Park04480cf2019-02-06 00:16:29 +09004965func TestApexWithShBinary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004966 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08004967 ctx := testApex(t, `
Jiyong Park04480cf2019-02-06 00:16:29 +09004968 apex {
4969 name: "myapex",
4970 key: "myapex.key",
Sundong Ahn80c04892021-11-23 00:57:19 +00004971 sh_binaries: ["myscript"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00004972 updatable: false,
Riya Thakur654461c2024-02-27 07:21:05 +00004973 compile_multilib: "both",
Jiyong Park04480cf2019-02-06 00:16:29 +09004974 }
4975
4976 apex_key {
4977 name: "myapex.key",
4978 public_key: "testkey.avbpubkey",
4979 private_key: "testkey.pem",
4980 }
4981
4982 sh_binary {
4983 name: "myscript",
4984 src: "mylib.cpp",
4985 filename: "myscript.sh",
4986 sub_dir: "script",
4987 }
4988 `)
4989
Jooyung Hana0503a52023-08-23 13:12:50 +09004990 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Jiyong Park04480cf2019-02-06 00:16:29 +09004991 copyCmds := apexRule.Args["copy_commands"]
4992
4993 ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
4994}
Jiyong Parkd1e293d2019-03-15 02:13:21 +09004995
Jooyung Han91df2082019-11-20 01:49:42 +09004996func TestApexInVariousPartition(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07004997 t.Parallel()
Jooyung Han91df2082019-11-20 01:49:42 +09004998 testcases := []struct {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09004999 propName, partition string
Jooyung Han91df2082019-11-20 01:49:42 +09005000 }{
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005001 {"", "system"},
5002 {"product_specific: true", "product"},
5003 {"soc_specific: true", "vendor"},
5004 {"proprietary: true", "vendor"},
5005 {"vendor: true", "vendor"},
5006 {"system_ext_specific: true", "system_ext"},
Jooyung Han91df2082019-11-20 01:49:42 +09005007 }
5008 for _, tc := range testcases {
Jooyung Haneec1b3f2023-06-20 16:25:59 +09005009 t.Run(tc.propName+":"+tc.partition, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005010 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005011 ctx := testApex(t, `
Jooyung Han91df2082019-11-20 01:49:42 +09005012 apex {
5013 name: "myapex",
5014 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005015 updatable: false,
Jooyung Han91df2082019-11-20 01:49:42 +09005016 `+tc.propName+`
5017 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005018
Jooyung Han91df2082019-11-20 01:49:42 +09005019 apex_key {
5020 name: "myapex.key",
5021 public_key: "testkey.avbpubkey",
5022 private_key: "testkey.pem",
5023 }
5024 `)
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005025
Jooyung Hana0503a52023-08-23 13:12:50 +09005026 apex := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Cole Faust6b7075f2024-12-17 10:42:42 -08005027 expected := "out/target/product/test_device/" + tc.partition + "/apex"
Paul Duffin37ba3442021-03-29 00:21:08 +01005028 actual := apex.installDir.RelativeToTop().String()
Jooyung Han91df2082019-11-20 01:49:42 +09005029 if actual != expected {
5030 t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
5031 }
Jooyung Han91df2082019-11-20 01:49:42 +09005032 })
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005033 }
Jiyong Parkd1e293d2019-03-15 02:13:21 +09005034}
Jiyong Park67882562019-03-21 01:11:21 +09005035
Jooyung Han580eb4f2020-06-24 19:33:06 +09005036func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005037 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005038 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005039 apex {
5040 name: "myapex",
5041 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005042 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005043 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005044
Jooyung Han580eb4f2020-06-24 19:33:06 +09005045 apex_key {
5046 name: "myapex.key",
5047 public_key: "testkey.avbpubkey",
5048 private_key: "testkey.pem",
5049 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005050 `)
Jooyung Hana0503a52023-08-23 13:12:50 +09005051 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005052 rule := module.Output("file_contexts")
5053 ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
5054}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005055
Jooyung Han580eb4f2020-06-24 19:33:06 +09005056func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005057 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005058 testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005059 apex {
5060 name: "myapex",
5061 key: "myapex.key",
5062 file_contexts: "my_own_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005063 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005064 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005065
Jooyung Han580eb4f2020-06-24 19:33:06 +09005066 apex_key {
5067 name: "myapex.key",
5068 public_key: "testkey.avbpubkey",
5069 private_key: "testkey.pem",
5070 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005071 `, withFiles(map[string][]byte{
5072 "my_own_file_contexts": nil,
5073 }))
Jooyung Han580eb4f2020-06-24 19:33:06 +09005074}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005075
Jooyung Han580eb4f2020-06-24 19:33:06 +09005076func TestFileContexts_ProductSpecificApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005077 t.Parallel()
Jooyung Han54aca7b2019-11-20 02:26:02 +09005078 testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005079 apex {
5080 name: "myapex",
5081 key: "myapex.key",
5082 product_specific: true,
5083 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005084 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005085 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005086
Jooyung Han580eb4f2020-06-24 19:33:06 +09005087 apex_key {
5088 name: "myapex.key",
5089 public_key: "testkey.avbpubkey",
5090 private_key: "testkey.pem",
5091 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005092 `)
5093
Colin Cross1c460562021-02-16 17:55:47 -08005094 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005095 apex {
5096 name: "myapex",
5097 key: "myapex.key",
5098 product_specific: true,
5099 file_contexts: "product_specific_file_contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005100 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005101 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005102
Jooyung Han580eb4f2020-06-24 19:33:06 +09005103 apex_key {
5104 name: "myapex.key",
5105 public_key: "testkey.avbpubkey",
5106 private_key: "testkey.pem",
5107 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005108 `, withFiles(map[string][]byte{
5109 "product_specific_file_contexts": nil,
5110 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005111 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005112 rule := module.Output("file_contexts")
5113 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
5114}
Jooyung Han54aca7b2019-11-20 02:26:02 +09005115
Jooyung Han580eb4f2020-06-24 19:33:06 +09005116func TestFileContexts_SetViaFileGroup(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005117 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005118 ctx := testApex(t, `
Jooyung Han580eb4f2020-06-24 19:33:06 +09005119 apex {
5120 name: "myapex",
5121 key: "myapex.key",
5122 product_specific: true,
5123 file_contexts: ":my-file-contexts",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005124 updatable: false,
Jooyung Han580eb4f2020-06-24 19:33:06 +09005125 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005126
Jooyung Han580eb4f2020-06-24 19:33:06 +09005127 apex_key {
5128 name: "myapex.key",
5129 public_key: "testkey.avbpubkey",
5130 private_key: "testkey.pem",
5131 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005132
Jooyung Han580eb4f2020-06-24 19:33:06 +09005133 filegroup {
5134 name: "my-file-contexts",
5135 srcs: ["product_specific_file_contexts"],
5136 }
Jooyung Han54aca7b2019-11-20 02:26:02 +09005137 `, withFiles(map[string][]byte{
5138 "product_specific_file_contexts": nil,
5139 }))
Jooyung Hana0503a52023-08-23 13:12:50 +09005140 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han580eb4f2020-06-24 19:33:06 +09005141 rule := module.Output("file_contexts")
5142 ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
Jooyung Han54aca7b2019-11-20 02:26:02 +09005143}
5144
Jiyong Park67882562019-03-21 01:11:21 +09005145func TestApexKeyFromOtherModule(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005146 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005147 ctx := testApex(t, `
Jiyong Park67882562019-03-21 01:11:21 +09005148 apex_key {
5149 name: "myapex.key",
5150 public_key: ":my.avbpubkey",
5151 private_key: ":my.pem",
5152 product_specific: true,
5153 }
5154
5155 filegroup {
5156 name: "my.avbpubkey",
5157 srcs: ["testkey2.avbpubkey"],
5158 }
5159
5160 filegroup {
5161 name: "my.pem",
5162 srcs: ["testkey2.pem"],
5163 }
5164 `)
5165
5166 apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
5167 expected_pubkey := "testkey2.avbpubkey"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005168 actual_pubkey := apex_key.publicKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005169 if actual_pubkey != expected_pubkey {
5170 t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
5171 }
5172 expected_privkey := "testkey2.pem"
Jaewoong Jung18aefc12020-12-21 09:11:10 -08005173 actual_privkey := apex_key.privateKeyFile.String()
Jiyong Park67882562019-03-21 01:11:21 +09005174 if actual_privkey != expected_privkey {
5175 t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
5176 }
5177}
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005178
5179func TestPrebuilt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005180 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005181 ctx := testApex(t, `
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005182 prebuilt_apex {
5183 name: "myapex",
Jiyong Parkc95714e2019-03-29 14:23:10 +09005184 arch: {
5185 arm64: {
5186 src: "myapex-arm64.apex",
5187 },
5188 arm: {
5189 src: "myapex-arm.apex",
5190 },
5191 },
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005192 }
5193 `)
5194
Wei Li340ee8e2022-03-18 17:33:24 -07005195 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5196 prebuilt := testingModule.Module().(*Prebuilt)
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005197
Jiyong Parkc95714e2019-03-29 14:23:10 +09005198 expectedInput := "myapex-arm64.apex"
5199 if prebuilt.inputApex.String() != expectedInput {
5200 t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
5201 }
Wei Li340ee8e2022-03-18 17:33:24 -07005202 android.AssertStringDoesContain(t, "Invalid provenance metadata file",
5203 prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
5204 rule := testingModule.Rule("genProvenanceMetaData")
5205 android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
5206 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5207 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5208 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
Wei Li598f92d2023-01-04 17:12:24 -08005209
5210 entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
5211 android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
Jaewoong Jung939ebd52019-03-26 15:07:36 -07005212}
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005213
Paul Duffinc0609c62021-03-01 17:27:16 +00005214func TestPrebuiltMissingSrc(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005215 t.Parallel()
Paul Duffin6717d882021-06-15 19:09:41 +01005216 testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
Paul Duffinc0609c62021-03-01 17:27:16 +00005217 prebuilt_apex {
5218 name: "myapex",
5219 }
5220 `)
5221}
5222
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005223func TestPrebuiltFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005224 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005225 ctx := testApex(t, `
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005226 prebuilt_apex {
5227 name: "myapex",
5228 src: "myapex-arm.apex",
5229 filename: "notmyapex.apex",
5230 }
5231 `)
5232
Wei Li340ee8e2022-03-18 17:33:24 -07005233 testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
5234 p := testingModule.Module().(*Prebuilt)
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005235
5236 expected := "notmyapex.apex"
5237 if p.installFilename != expected {
5238 t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
5239 }
Wei Li340ee8e2022-03-18 17:33:24 -07005240 rule := testingModule.Rule("genProvenanceMetaData")
5241 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5242 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
5243 android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
5244 android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
Nikita Ioffe7a41ebd2019-04-04 18:09:48 +01005245}
Jaewoong Jungc1001ec2019-06-25 11:20:53 -07005246
Samiul Islam7c02e262021-09-08 17:48:28 +01005247func TestApexSetFilenameOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005248 t.Parallel()
Samiul Islam7c02e262021-09-08 17:48:28 +01005249 testApex(t, `
5250 apex_set {
5251 name: "com.company.android.myapex",
5252 apex_name: "com.android.myapex",
5253 set: "company-myapex.apks",
5254 filename: "com.company.android.myapex.apex"
5255 }
5256 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5257
5258 testApex(t, `
5259 apex_set {
5260 name: "com.company.android.myapex",
5261 apex_name: "com.android.myapex",
5262 set: "company-myapex.apks",
5263 filename: "com.company.android.myapex.capex"
5264 }
5265 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5266
5267 testApexError(t, `filename should end in .apex or .capex for apex_set`, `
5268 apex_set {
5269 name: "com.company.android.myapex",
5270 apex_name: "com.android.myapex",
5271 set: "company-myapex.apks",
5272 filename: "some-random-suffix"
5273 }
5274 `)
5275}
5276
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005277func TestPrebuiltOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005278 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08005279 ctx := testApex(t, `
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005280 prebuilt_apex {
5281 name: "myapex.prebuilt",
5282 src: "myapex-arm.apex",
5283 overrides: [
5284 "myapex",
5285 ],
5286 }
5287 `)
5288
Wei Li340ee8e2022-03-18 17:33:24 -07005289 testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
5290 p := testingModule.Module().(*Prebuilt)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005291
5292 expected := []string{"myapex"}
Colin Crossaa255532020-07-03 13:18:24 -07005293 actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005294 if !reflect.DeepEqual(actual, expected) {
Jiyong Parkb0a012c2019-11-14 17:17:03 +09005295 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005296 }
Wei Li340ee8e2022-03-18 17:33:24 -07005297 rule := testingModule.Rule("genProvenanceMetaData")
5298 android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
5299 android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
5300 android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
5301 android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
Jaewoong Jung22f7d182019-07-16 18:25:41 -07005302}
5303
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005304func TestPrebuiltApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005305 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005306 testApex(t, `
5307 prebuilt_apex {
5308 name: "com.company.android.myapex",
5309 apex_name: "com.android.myapex",
5310 src: "company-myapex-arm.apex",
5311 }
5312 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5313
5314 testApex(t, `
5315 apex_set {
5316 name: "com.company.android.myapex",
5317 apex_name: "com.android.myapex",
5318 set: "company-myapex.apks",
5319 }
5320 `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
5321}
5322
5323func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005324 t.Parallel()
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005325 _ = android.GroupFixturePreparers(
5326 java.PrepareForTestWithJavaDefaultModules,
5327 PrepareForTestWithApexBuildComponents,
5328 android.FixtureWithRootAndroidBp(`
5329 platform_bootclasspath {
5330 name: "platform-bootclasspath",
5331 fragments: [
5332 {
5333 apex: "com.android.art",
5334 module: "art-bootclasspath-fragment",
5335 },
5336 ],
5337 }
5338
5339 prebuilt_apex {
5340 name: "com.company.android.art",
5341 apex_name: "com.android.art",
5342 src: "com.company.android.art-arm.apex",
5343 exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
5344 }
5345
5346 prebuilt_bootclasspath_fragment {
5347 name: "art-bootclasspath-fragment",
satayevabcd5972021-08-06 17:49:46 +01005348 image_name: "art",
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005349 contents: ["core-oj"],
Paul Duffin54e41972021-07-19 13:23:40 +01005350 hidden_api: {
5351 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5352 metadata: "my-bootclasspath-fragment/metadata.csv",
5353 index: "my-bootclasspath-fragment/index.csv",
5354 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5355 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5356 },
Martin Stjernholmbfffae72021-06-24 14:37:13 +01005357 }
5358
5359 java_import {
5360 name: "core-oj",
5361 jars: ["prebuilt.jar"],
5362 }
5363 `),
5364 ).RunTest(t)
5365}
5366
Spandan Das59a4a2b2024-01-09 21:35:56 +00005367// A minimal context object for use with DexJarBuildPath
5368type moduleErrorfTestCtx struct {
5369}
5370
5371func (ctx moduleErrorfTestCtx) ModuleErrorf(format string, args ...interface{}) {
5372}
5373
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005374func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005375 t.Parallel()
Paul Duffinb6f53c02021-05-14 07:52:42 +01005376 preparer := android.GroupFixturePreparers(
satayevabcd5972021-08-06 17:49:46 +01005377 java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005378 // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
5379 // is disabled.
5380 android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
Spandan Das81fe4d12024-05-15 18:43:47 +00005381
5382 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
5383 // file creation.
5384 java.FixtureConfigureBootJars("platform:foo"),
5385 android.FixtureModifyMockFS(func(fs android.MockFS) {
5386 fs["platform/Android.bp"] = []byte(`
5387 java_library {
5388 name: "foo",
5389 srcs: ["Test.java"],
5390 compile_dex: true,
5391 }
5392 `)
5393 fs["platform/Test.java"] = nil
5394 }),
Paul Duffinb6f53c02021-05-14 07:52:42 +01005395 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005396
Paul Duffin40a3f652021-07-19 13:11:24 +01005397 checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
Paul Duffin37856732021-02-26 14:24:15 +00005398 t.Helper()
Paul Duffin00b2bfd2021-04-12 17:24:36 +01005399 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
Paul Duffind061d402021-06-07 21:36:01 +01005400 var rule android.TestingBuildParams
5401
5402 rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
5403 java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005404 }
5405
Paul Duffin40a3f652021-07-19 13:11:24 +01005406 checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
5407 t.Helper()
5408 platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
5409 var rule android.TestingBuildParams
5410
5411 rule = platformBootclasspath.Output("hiddenapi-index.csv")
5412 java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
5413 }
5414
Paul Duffin89f570a2021-06-16 01:42:33 +01005415 fragment := java.ApexVariantReference{
5416 Apex: proptools.StringPtr("myapex"),
5417 Module: proptools.StringPtr("my-bootclasspath-fragment"),
5418 }
5419
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005420 t.Run("prebuilt only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005421 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005422 bp := `
5423 prebuilt_apex {
5424 name: "myapex",
5425 arch: {
5426 arm64: {
5427 src: "myapex-arm64.apex",
5428 },
5429 arm: {
5430 src: "myapex-arm.apex",
5431 },
5432 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005433 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5434 }
5435
5436 prebuilt_bootclasspath_fragment {
5437 name: "my-bootclasspath-fragment",
5438 contents: ["libfoo", "libbar"],
5439 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005440 hidden_api: {
5441 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5442 metadata: "my-bootclasspath-fragment/metadata.csv",
5443 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005444 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5445 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5446 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005447 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005448 }
5449
Spandan Das52c01a12024-09-20 01:09:48 +00005450 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005451 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005452 public: {
5453 jars: ["libfoo.jar"],
5454 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005455 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005456 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005457 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005458 }
Paul Duffin37856732021-02-26 14:24:15 +00005459
5460 java_sdk_library_import {
5461 name: "libbar",
5462 public: {
5463 jars: ["libbar.jar"],
5464 },
5465 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005466 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005467 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005468 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005469 `
5470
Paul Duffin89f570a2021-06-16 01:42:33 +01005471 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005472
Paul Duffin537ea3d2021-05-14 10:38:00 +01005473 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005474 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005475 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005476 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005477 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005478 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005479 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005480 })
5481
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005482 t.Run("apex_set only", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005483 t.Parallel()
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005484 bp := `
5485 apex_set {
5486 name: "myapex",
5487 set: "myapex.apks",
Paul Duffin89f570a2021-06-16 01:42:33 +01005488 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
Liz Kammer2dc72442023-04-20 10:10:48 -04005489 exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
5490 }
5491
Paul Duffin89f570a2021-06-16 01:42:33 +01005492 prebuilt_bootclasspath_fragment {
5493 name: "my-bootclasspath-fragment",
5494 contents: ["libfoo", "libbar"],
5495 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005496 hidden_api: {
5497 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5498 metadata: "my-bootclasspath-fragment/metadata.csv",
5499 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005500 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5501 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5502 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005503 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005504 }
5505
Liz Kammer2dc72442023-04-20 10:10:48 -04005506 prebuilt_systemserverclasspath_fragment {
5507 name: "my-systemserverclasspath-fragment",
5508 contents: ["libbaz"],
5509 apex_available: ["myapex"],
5510 }
5511
Spandan Das52c01a12024-09-20 01:09:48 +00005512 java_sdk_library_import {
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005513 name: "libfoo",
Spandan Das52c01a12024-09-20 01:09:48 +00005514 public: {
5515 jars: ["libfoo.jar"],
5516 },
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005517 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005518 shared_library: false,
5519 permitted_packages: ["libfoo"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005520 }
5521
Spandan Das52c01a12024-09-20 01:09:48 +00005522
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005523 java_sdk_library_import {
5524 name: "libbar",
5525 public: {
5526 jars: ["libbar.jar"],
5527 },
5528 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005529 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005530 permitted_packages: ["bar"],
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005531 }
Liz Kammer2dc72442023-04-20 10:10:48 -04005532
5533 java_sdk_library_import {
5534 name: "libbaz",
5535 public: {
5536 jars: ["libbaz.jar"],
5537 },
5538 apex_available: ["myapex"],
5539 shared_library: false,
5540 permitted_packages: ["baz"],
5541 }
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005542 `
5543
Paul Duffin89f570a2021-06-16 01:42:33 +01005544 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005545
Paul Duffin537ea3d2021-05-14 10:38:00 +01005546 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005547 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005548 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005549 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005550 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005551 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005552 `)
Liz Kammer2dc72442023-04-20 10:10:48 -04005553
5554 myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
5555
5556 overrideNames := []string{
Spandan Dasa8e2d612024-07-26 19:24:27 +00005557 "",
Liz Kammer2dc72442023-04-20 10:10:48 -04005558 "myjavalib.myapex",
5559 "libfoo.myapex",
5560 "libbar.myapex",
5561 "libbaz.myapex",
5562 }
5563 mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
5564 for i, e := range mkEntries {
5565 g := e.OverrideName
5566 if w := overrideNames[i]; w != g {
5567 t.Errorf("Expected override name %q, got %q", w, g)
5568 }
5569 }
5570
Paul Duffinf58fd9a2021-04-06 16:00:22 +01005571 })
5572
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005573 t.Run("prebuilt with source library preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005574 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005575 bp := `
5576 prebuilt_apex {
5577 name: "myapex",
5578 arch: {
5579 arm64: {
5580 src: "myapex-arm64.apex",
5581 },
5582 arm: {
5583 src: "myapex-arm.apex",
5584 },
5585 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005586 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5587 }
5588
5589 prebuilt_bootclasspath_fragment {
5590 name: "my-bootclasspath-fragment",
5591 contents: ["libfoo", "libbar"],
5592 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005593 hidden_api: {
5594 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5595 metadata: "my-bootclasspath-fragment/metadata.csv",
5596 index: "my-bootclasspath-fragment/index.csv",
5597 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
5598 all_flags: "my-bootclasspath-fragment/all-flags.csv",
5599 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005600 }
5601
5602 java_import {
5603 name: "libfoo",
5604 jars: ["libfoo.jar"],
5605 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005606 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005607 }
5608
5609 java_library {
5610 name: "libfoo",
5611 srcs: ["foo/bar/MyClass.java"],
5612 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005613 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005614 }
Paul Duffin37856732021-02-26 14:24:15 +00005615
5616 java_sdk_library_import {
5617 name: "libbar",
5618 public: {
5619 jars: ["libbar.jar"],
5620 },
5621 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005622 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005623 }
5624
5625 java_sdk_library {
5626 name: "libbar",
5627 srcs: ["foo/bar/MyClass.java"],
5628 unsafe_ignore_missing_latest_api: true,
5629 apex_available: ["myapex"],
5630 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005631 `
5632
5633 // In this test the source (java_library) libfoo is active since the
5634 // prebuilt (java_import) defaults to prefer:false. However the
5635 // prebuilt_apex module always depends on the prebuilt, and so it doesn't
5636 // find the dex boot jar in it. We either need to disable the source libfoo
5637 // or make the prebuilt libfoo preferred.
Paul Duffin89f570a2021-06-16 01:42:33 +01005638 testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
Spandan Das10ea4bf2021-08-20 19:18:16 +00005639 // dexbootjar check is skipped if AllowMissingDependencies is true
5640 preparerAllowMissingDeps := android.GroupFixturePreparers(
5641 preparer,
5642 android.PrepareForTestWithAllowMissingDependencies,
5643 )
5644 testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005645 })
5646
5647 t.Run("prebuilt library preferred with source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005648 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005649 bp := `
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005650 apex {
5651 name: "myapex",
5652 key: "myapex.key",
5653 updatable: false,
5654 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5655 }
5656
5657 apex_key {
5658 name: "myapex.key",
5659 public_key: "testkey.avbpubkey",
5660 private_key: "testkey.pem",
5661 }
5662
5663 bootclasspath_fragment {
5664 name: "my-bootclasspath-fragment",
5665 contents: ["libfoo", "libbar"],
5666 apex_available: ["myapex"],
5667 hidden_api: {
5668 split_packages: ["*"],
5669 },
5670 }
5671
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005672 prebuilt_apex {
5673 name: "myapex",
5674 arch: {
5675 arm64: {
5676 src: "myapex-arm64.apex",
5677 },
5678 arm: {
5679 src: "myapex-arm.apex",
5680 },
5681 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005682 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5683 }
5684
5685 prebuilt_bootclasspath_fragment {
5686 name: "my-bootclasspath-fragment",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005687 prefer: true,
Paul Duffin89f570a2021-06-16 01:42:33 +01005688 contents: ["libfoo", "libbar"],
5689 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005690 hidden_api: {
5691 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5692 metadata: "my-bootclasspath-fragment/metadata.csv",
5693 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005694 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5695 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5696 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005697 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005698 }
5699
Spandan Das52c01a12024-09-20 01:09:48 +00005700 java_sdk_library_import {
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005701 name: "libfoo",
5702 prefer: true,
Spandan Das52c01a12024-09-20 01:09:48 +00005703 public: {
5704 jars: ["libfoo.jar"],
5705 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005706 apex_available: ["myapex"],
Spandan Das52c01a12024-09-20 01:09:48 +00005707 shared_library: false,
5708 permitted_packages: ["libfoo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005709 }
5710
5711 java_library {
5712 name: "libfoo",
5713 srcs: ["foo/bar/MyClass.java"],
5714 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005715 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005716 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005717 }
Paul Duffin37856732021-02-26 14:24:15 +00005718
5719 java_sdk_library_import {
5720 name: "libbar",
5721 prefer: true,
5722 public: {
5723 jars: ["libbar.jar"],
5724 },
5725 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005726 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005727 permitted_packages: ["bar"],
Paul Duffin37856732021-02-26 14:24:15 +00005728 }
5729
5730 java_sdk_library {
5731 name: "libbar",
5732 srcs: ["foo/bar/MyClass.java"],
5733 unsafe_ignore_missing_latest_api: true,
5734 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005735 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005736 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005737 `
5738
Paul Duffin89f570a2021-06-16 01:42:33 +01005739 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005740
Paul Duffin537ea3d2021-05-14 10:38:00 +01005741 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005742 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005743 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005744 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005745 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005746 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005747 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005748 })
5749
5750 t.Run("prebuilt with source apex preferred", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005751 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005752 bp := `
5753 apex {
5754 name: "myapex",
5755 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00005756 updatable: false,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005757 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005758 }
5759
5760 apex_key {
5761 name: "myapex.key",
5762 public_key: "testkey.avbpubkey",
5763 private_key: "testkey.pem",
5764 }
5765
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005766 bootclasspath_fragment {
5767 name: "my-bootclasspath-fragment",
5768 contents: ["libfoo", "libbar"],
5769 apex_available: ["myapex"],
5770 hidden_api: {
5771 split_packages: ["*"],
5772 },
5773 }
5774
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005775 prebuilt_apex {
5776 name: "myapex",
5777 arch: {
5778 arm64: {
5779 src: "myapex-arm64.apex",
5780 },
5781 arm: {
5782 src: "myapex-arm.apex",
5783 },
5784 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005785 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5786 }
5787
5788 prebuilt_bootclasspath_fragment {
5789 name: "my-bootclasspath-fragment",
5790 contents: ["libfoo", "libbar"],
5791 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005792 hidden_api: {
5793 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5794 metadata: "my-bootclasspath-fragment/metadata.csv",
5795 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005796 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5797 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5798 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005799 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005800 }
5801
5802 java_import {
5803 name: "libfoo",
5804 jars: ["libfoo.jar"],
5805 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00005806 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005807 }
5808
5809 java_library {
5810 name: "libfoo",
5811 srcs: ["foo/bar/MyClass.java"],
5812 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005813 permitted_packages: ["foo"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005814 installable: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005815 sdk_version: "core_current",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005816 }
Paul Duffin37856732021-02-26 14:24:15 +00005817
5818 java_sdk_library_import {
5819 name: "libbar",
5820 public: {
5821 jars: ["libbar.jar"],
5822 },
5823 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005824 shared_library: false,
Paul Duffin37856732021-02-26 14:24:15 +00005825 }
5826
5827 java_sdk_library {
5828 name: "libbar",
5829 srcs: ["foo/bar/MyClass.java"],
5830 unsafe_ignore_missing_latest_api: true,
5831 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005832 permitted_packages: ["bar"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005833 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00005834 sdk_version: "core_current",
Paul Duffin37856732021-02-26 14:24:15 +00005835 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005836 `
5837
Paul Duffin89f570a2021-06-16 01:42:33 +01005838 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005839
Paul Duffin537ea3d2021-05-14 10:38:00 +01005840 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005841 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005842 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
5843 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005844 out/soong/.intermediates/my-bootclasspath-fragment/android_common_myapex/modular-hiddenapi/index.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005845 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005846 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005847 })
5848
5849 t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005850 t.Parallel()
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005851 bp := `
5852 apex {
5853 name: "myapex",
5854 enabled: false,
5855 key: "myapex.key",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005856 bootclasspath_fragments: ["my-bootclasspath-fragment"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005857 }
5858
5859 apex_key {
5860 name: "myapex.key",
5861 public_key: "testkey.avbpubkey",
5862 private_key: "testkey.pem",
5863 }
5864
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005865 bootclasspath_fragment {
5866 name: "my-bootclasspath-fragment",
5867 enabled: false,
5868 contents: ["libfoo", "libbar"],
5869 apex_available: ["myapex"],
5870 hidden_api: {
5871 split_packages: ["*"],
5872 },
5873 }
5874
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005875 prebuilt_apex {
5876 name: "myapex",
5877 arch: {
5878 arm64: {
5879 src: "myapex-arm64.apex",
5880 },
5881 arm: {
5882 src: "myapex-arm.apex",
5883 },
5884 },
Paul Duffin89f570a2021-06-16 01:42:33 +01005885 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5886 }
5887
5888 prebuilt_bootclasspath_fragment {
5889 name: "my-bootclasspath-fragment",
5890 contents: ["libfoo", "libbar"],
5891 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01005892 hidden_api: {
5893 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
5894 metadata: "my-bootclasspath-fragment/metadata.csv",
5895 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01005896 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
5897 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
5898 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01005899 },
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005900 }
5901
5902 java_import {
5903 name: "libfoo",
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005904 jars: ["libfoo.jar"],
5905 apex_available: ["myapex"],
satayevabcd5972021-08-06 17:49:46 +01005906 permitted_packages: ["foo"],
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005907 }
5908
5909 java_library {
5910 name: "libfoo",
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005911 enabled: false,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005912 srcs: ["foo/bar/MyClass.java"],
5913 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005914 installable: true,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005915 }
Paul Duffin37856732021-02-26 14:24:15 +00005916
5917 java_sdk_library_import {
5918 name: "libbar",
Paul Duffin37856732021-02-26 14:24:15 +00005919 public: {
5920 jars: ["libbar.jar"],
5921 },
5922 apex_available: ["myapex"],
Paul Duffin89f570a2021-06-16 01:42:33 +01005923 shared_library: false,
satayevabcd5972021-08-06 17:49:46 +01005924 permitted_packages: ["bar"],
Jihoon Kanga6d0aa82024-09-24 00:34:49 +00005925 prefer: true,
Paul Duffin37856732021-02-26 14:24:15 +00005926 }
5927
5928 java_sdk_library {
5929 name: "libbar",
5930 srcs: ["foo/bar/MyClass.java"],
5931 unsafe_ignore_missing_latest_api: true,
5932 apex_available: ["myapex"],
Jiakai Zhangb69e8952023-07-11 14:31:22 +01005933 compile_dex: true,
Paul Duffin37856732021-02-26 14:24:15 +00005934 }
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005935 `
Cole Fausta963b942024-04-11 17:43:00 -07005936 // This test disables libbar, which causes the ComponentDepsMutator to add
5937 // deps on libbar.stubs and other sub-modules that don't exist. We can
5938 // enable AllowMissingDependencies to work around that, but enabling that
5939 // causes extra checks for missing source files to dex_bootjars, so add those
5940 // to the mock fs as well.
5941 preparer2 := android.GroupFixturePreparers(
5942 preparer,
5943 android.PrepareForTestWithAllowMissingDependencies,
5944 android.FixtureMergeMockFs(map[string][]byte{
5945 "build/soong/scripts/check_boot_jars/package_allowed_list.txt": nil,
Colin Cross99939e92024-10-01 16:02:46 -07005946 "frameworks/base/boot/boot-profile.txt": nil,
Cole Fausta963b942024-04-11 17:43:00 -07005947 }),
5948 )
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005949
Cole Fausta963b942024-04-11 17:43:00 -07005950 ctx := testDexpreoptWithApexes(t, bp, "", preparer2, fragment)
Paul Duffin4fd997b2021-02-03 20:06:33 +00005951
Paul Duffin537ea3d2021-05-14 10:38:00 +01005952 // Verify the correct module jars contribute to the hiddenapi index file.
Spandan Das81fe4d12024-05-15 18:43:47 +00005953 checkHiddenAPIIndexFromClassesInputs(t, ctx, `out/soong/.intermediates/platform/foo/android_common/javac/foo.jar`)
Paul Duffin40a3f652021-07-19 13:11:24 +01005954 checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
Paul Duffin54e41972021-07-19 13:23:40 +01005955 my-bootclasspath-fragment/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005956 out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
Colin Crosse5c7d7c2024-12-18 17:08:07 -08005957 out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_com.android.art/modular-hiddenapi/index.csv
Paul Duffin40a3f652021-07-19 13:11:24 +01005958 `)
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00005959 })
Spandan Das3a392012024-01-17 18:26:27 +00005960
Spandan Dasf2c10572024-02-27 04:49:52 +00005961 t.Run("Co-existing unflagged apexes should create a duplicate module error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07005962 t.Parallel()
Spandan Das3a392012024-01-17 18:26:27 +00005963 bp := `
5964 // Source
5965 apex {
5966 name: "myapex",
5967 enabled: false,
5968 key: "myapex.key",
5969 bootclasspath_fragments: ["my-bootclasspath-fragment"],
5970 }
5971
5972 apex_key {
5973 name: "myapex.key",
5974 public_key: "testkey.avbpubkey",
5975 private_key: "testkey.pem",
5976 }
5977
5978 // Prebuilt
5979 prebuilt_apex {
5980 name: "myapex.v1",
5981 source_apex_name: "myapex",
5982 arch: {
5983 arm64: {
5984 src: "myapex-arm64.apex",
5985 },
5986 arm: {
5987 src: "myapex-arm.apex",
5988 },
5989 },
5990 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
5991 prefer: true,
5992 }
5993 prebuilt_apex {
5994 name: "myapex.v2",
5995 source_apex_name: "myapex",
5996 arch: {
5997 arm64: {
5998 src: "myapex-arm64.apex",
5999 },
6000 arm: {
6001 src: "myapex-arm.apex",
6002 },
6003 },
6004 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
6005 prefer: true,
6006 }
6007
6008 prebuilt_bootclasspath_fragment {
6009 name: "my-bootclasspath-fragment",
6010 contents: ["libfoo", "libbar"],
6011 apex_available: ["myapex"],
6012 hidden_api: {
6013 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
6014 metadata: "my-bootclasspath-fragment/metadata.csv",
6015 index: "my-bootclasspath-fragment/index.csv",
6016 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
6017 all_flags: "my-bootclasspath-fragment/all-flags.csv",
6018 },
6019 prefer: true,
6020 }
6021
6022 java_import {
6023 name: "libfoo",
6024 jars: ["libfoo.jar"],
6025 apex_available: ["myapex"],
6026 prefer: true,
6027 }
6028 java_import {
6029 name: "libbar",
6030 jars: ["libbar.jar"],
6031 apex_available: ["myapex"],
6032 prefer: true,
6033 }
6034 `
6035
Spandan Dasf2c10572024-02-27 04:49:52 +00006036 testDexpreoptWithApexes(t, bp, "Multiple prebuilt modules prebuilt_myapex.v1 and prebuilt_myapex.v2 have been marked as preferred for this source module", preparer, fragment)
Spandan Das3a392012024-01-17 18:26:27 +00006037 })
6038
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00006039}
6040
Roland Levillain630846d2019-06-26 12:48:34 +01006041func TestApexWithTests(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006042 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006043 ctx := testApex(t, `
Roland Levillain630846d2019-06-26 12:48:34 +01006044 apex_test {
6045 name: "myapex",
6046 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006047 updatable: false,
Roland Levillain630846d2019-06-26 12:48:34 +01006048 tests: [
6049 "mytest",
6050 ],
6051 }
6052
6053 apex_key {
6054 name: "myapex.key",
6055 public_key: "testkey.avbpubkey",
6056 private_key: "testkey.pem",
6057 }
6058
Liz Kammer1c14a212020-05-12 15:26:55 -07006059 filegroup {
6060 name: "fg",
6061 srcs: [
6062 "baz",
6063 "bar/baz"
6064 ],
6065 }
6066
Roland Levillain630846d2019-06-26 12:48:34 +01006067 cc_test {
6068 name: "mytest",
6069 gtest: false,
6070 srcs: ["mytest.cpp"],
6071 relative_install_path: "test",
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006072 shared_libs: ["mylib"],
Roland Levillain630846d2019-06-26 12:48:34 +01006073 system_shared_libs: [],
Roland Levillain630846d2019-06-26 12:48:34 +01006074 stl: "none",
Liz Kammer1c14a212020-05-12 15:26:55 -07006075 data: [":fg"],
Roland Levillain630846d2019-06-26 12:48:34 +01006076 }
Roland Levillain9b5fde92019-06-28 15:41:19 +01006077
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006078 cc_library {
6079 name: "mylib",
6080 srcs: ["mylib.cpp"],
6081 system_shared_libs: [],
6082 stl: "none",
6083 }
6084
Liz Kammer5bd365f2020-05-27 15:15:11 -07006085 filegroup {
6086 name: "fg2",
6087 srcs: [
6088 "testdata/baz"
6089 ],
6090 }
Roland Levillain630846d2019-06-26 12:48:34 +01006091 `)
6092
Jooyung Hana0503a52023-08-23 13:12:50 +09006093 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Roland Levillain630846d2019-06-26 12:48:34 +01006094 copyCmds := apexRule.Args["copy_commands"]
6095
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006096 // Ensure that test dep (and their transitive dependencies) are copied into apex.
Roland Levillain630846d2019-06-26 12:48:34 +01006097 ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
Jiyong Parkaf9539f2020-05-04 10:31:32 +09006098 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
Roland Levillain9b5fde92019-06-28 15:41:19 +01006099
Liz Kammer1c14a212020-05-12 15:26:55 -07006100 //Ensure that test data are copied into apex.
6101 ensureContains(t, copyCmds, "image.apex/bin/test/baz")
6102 ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
6103
Roland Levillainf89cd092019-07-29 16:22:59 +01006104 // Ensure the module is correctly translated.
Jooyung Hana0503a52023-08-23 13:12:50 +09006105 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07006106 data := android.AndroidMkDataForTest(t, ctx, bundle)
Liz Kammer81faaaf2020-05-20 09:57:08 -07006107 name := bundle.BaseModuleName()
Roland Levillainf89cd092019-07-29 16:22:59 +01006108 prefix := "TARGET_"
6109 var builder strings.Builder
6110 data.Custom(&builder, name, prefix, "", data)
6111 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00006112 ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
Roland Levillainf89cd092019-07-29 16:22:59 +01006113 ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
Roland Levillain630846d2019-06-26 12:48:34 +01006114}
6115
Jooyung Hand48f3c32019-08-23 11:18:57 +09006116func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006117 t.Parallel()
Jooyung Hand48f3c32019-08-23 11:18:57 +09006118 testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
6119 apex {
6120 name: "myapex",
6121 key: "myapex.key",
6122 native_shared_libs: ["libfoo"],
6123 }
6124
6125 apex_key {
6126 name: "myapex.key",
6127 public_key: "testkey.avbpubkey",
6128 private_key: "testkey.pem",
6129 }
6130
6131 cc_library {
6132 name: "libfoo",
6133 stl: "none",
6134 system_shared_libs: [],
6135 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006136 apex_available: ["myapex"],
Jooyung Hand48f3c32019-08-23 11:18:57 +09006137 }
6138 `)
6139 testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
6140 apex {
6141 name: "myapex",
6142 key: "myapex.key",
6143 java_libs: ["myjar"],
6144 }
6145
6146 apex_key {
6147 name: "myapex.key",
6148 public_key: "testkey.avbpubkey",
6149 private_key: "testkey.pem",
6150 }
6151
6152 java_library {
6153 name: "myjar",
6154 srcs: ["foo/bar/MyClass.java"],
6155 sdk_version: "none",
6156 system_modules: "none",
Jooyung Hand48f3c32019-08-23 11:18:57 +09006157 enabled: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09006158 apex_available: ["myapex"],
Colin Crosse4f34882024-11-14 12:26:00 -08006159 compile_dex: true,
Jooyung Hand48f3c32019-08-23 11:18:57 +09006160 }
6161 `)
6162}
6163
Bill Peckhama41a6962021-01-11 10:58:54 -08006164func TestApexWithJavaImport(t *testing.T) {
Colin Cross1c460562021-02-16 17:55:47 -08006165 ctx := testApex(t, `
Bill Peckhama41a6962021-01-11 10:58:54 -08006166 apex {
6167 name: "myapex",
6168 key: "myapex.key",
6169 java_libs: ["myjavaimport"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006170 updatable: false,
Bill Peckhama41a6962021-01-11 10:58:54 -08006171 }
6172
6173 apex_key {
6174 name: "myapex.key",
6175 public_key: "testkey.avbpubkey",
6176 private_key: "testkey.pem",
6177 }
6178
6179 java_import {
6180 name: "myjavaimport",
6181 apex_available: ["myapex"],
6182 jars: ["my.jar"],
6183 compile_dex: true,
6184 }
6185 `)
6186
Jooyung Hana0503a52023-08-23 13:12:50 +09006187 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Bill Peckhama41a6962021-01-11 10:58:54 -08006188 apexRule := module.Rule("apexRule")
6189 copyCmds := apexRule.Args["copy_commands"]
6190 ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
6191}
6192
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006193func TestApexWithApps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006194 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006195 ctx := testApex(t, `
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006196 apex {
6197 name: "myapex",
6198 key: "myapex.key",
6199 apps: [
6200 "AppFoo",
Jiyong Parkf7487312019-10-17 12:54:30 +09006201 "AppFooPriv",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006202 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006203 updatable: false,
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006204 }
6205
6206 apex_key {
6207 name: "myapex.key",
6208 public_key: "testkey.avbpubkey",
6209 private_key: "testkey.pem",
6210 }
6211
6212 android_app {
6213 name: "AppFoo",
6214 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006215 sdk_version: "current",
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006216 system_modules: "none",
Jiyong Park970c5242024-05-17 22:58:54 +00006217 use_embedded_native_libs: true,
Jiyong Park8be103b2019-11-08 15:53:48 +09006218 jni_libs: ["libjni"],
Colin Cross094cde42020-02-15 10:38:00 -08006219 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006220 apex_available: [ "myapex" ],
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006221 }
Jiyong Parkf7487312019-10-17 12:54:30 +09006222
6223 android_app {
6224 name: "AppFooPriv",
6225 srcs: ["foo/bar/MyClass.java"],
Colin Cross094cde42020-02-15 10:38:00 -08006226 sdk_version: "current",
Jiyong Parkf7487312019-10-17 12:54:30 +09006227 system_modules: "none",
6228 privileged: true,
Sam Delmerico15809f82023-05-15 17:21:47 -04006229 privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
Colin Cross094cde42020-02-15 10:38:00 -08006230 stl: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006231 apex_available: [ "myapex" ],
Jiyong Parkf7487312019-10-17 12:54:30 +09006232 }
Jiyong Park8be103b2019-11-08 15:53:48 +09006233
6234 cc_library_shared {
6235 name: "libjni",
6236 srcs: ["mylib.cpp"],
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006237 shared_libs: ["libfoo"],
6238 stl: "none",
6239 system_shared_libs: [],
6240 apex_available: [ "myapex" ],
6241 sdk_version: "current",
6242 }
6243
6244 cc_library_shared {
6245 name: "libfoo",
Jiyong Park8be103b2019-11-08 15:53:48 +09006246 stl: "none",
6247 system_shared_libs: [],
Jiyong Park0f80c182020-01-31 02:49:53 +09006248 apex_available: [ "myapex" ],
Colin Cross094cde42020-02-15 10:38:00 -08006249 sdk_version: "current",
Jiyong Park8be103b2019-11-08 15:53:48 +09006250 }
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006251 `)
6252
Jooyung Hana0503a52023-08-23 13:12:50 +09006253 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006254 apexRule := module.Rule("apexRule")
6255 copyCmds := apexRule.Args["copy_commands"]
6256
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006257 ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
6258 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
Andrei Onea580636b2022-08-17 16:53:46 +00006259 ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006260
Colin Crossaede88c2020-08-11 12:17:01 -07006261 appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006262 // JNI libraries are uncompressed
Jiyong Park52cd06f2019-11-11 10:14:32 +09006263 if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006264 t.Errorf("jni libs are not uncompressed for AppFoo")
Jiyong Park52cd06f2019-11-11 10:14:32 +09006265 }
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006266 // JNI libraries including transitive deps are
6267 for _, jni := range []string{"libjni", "libfoo"} {
Paul Duffinafdd4062021-03-30 19:44:07 +01006268 jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
Jooyung Hanb7bebe22020-02-25 16:59:29 +09006269 // ... embedded inside APK (jnilibs.zip)
6270 ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
6271 // ... and not directly inside the APEX
6272 ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
6273 }
Sam Delmericob1daccd2023-05-25 14:45:30 -04006274
6275 apexBundle := module.Module().(*apexBundle)
6276 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
6277 var builder strings.Builder
6278 data.Custom(&builder, apexBundle.Name(), "TARGET_", "", data)
6279 androidMk := builder.String()
6280 ensureContains(t, androidMk, "LOCAL_MODULE := AppFooPriv.myapex")
6281 ensureContains(t, androidMk, "LOCAL_MODULE := AppFoo.myapex")
6282 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFooPriv.apk")
6283 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALLED_MODULE := \\S+AppFoo.apk")
6284 ensureMatches(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := \\S+AppFooPriv.apk")
6285 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS := privapp_allowlist_com.android.AppFooPriv.xml:$(PRODUCT_OUT)/apex/myapex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
Dario Frenicde2a032019-10-27 00:29:22 +01006286}
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006287
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006288func TestApexWithAppImportBuildId(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006289 t.Parallel()
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006290 invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
6291 for _, id := range invalidBuildIds {
6292 message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
6293 fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
6294 variables.BuildId = proptools.StringPtr(id)
6295 })
6296 testApexError(t, message, `apex {
6297 name: "myapex",
6298 key: "myapex.key",
6299 apps: ["AppFooPrebuilt"],
6300 updatable: false,
6301 }
6302
6303 apex_key {
6304 name: "myapex.key",
6305 public_key: "testkey.avbpubkey",
6306 private_key: "testkey.pem",
6307 }
6308
6309 android_app_import {
6310 name: "AppFooPrebuilt",
6311 apk: "PrebuiltAppFoo.apk",
6312 presigned: true,
6313 apex_available: ["myapex"],
6314 }
6315 `, fixture)
6316 }
6317}
6318
Dario Frenicde2a032019-10-27 00:29:22 +01006319func TestApexWithAppImports(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006320 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006321 ctx := testApex(t, `
Dario Frenicde2a032019-10-27 00:29:22 +01006322 apex {
6323 name: "myapex",
6324 key: "myapex.key",
6325 apps: [
6326 "AppFooPrebuilt",
6327 "AppFooPrivPrebuilt",
6328 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006329 updatable: false,
Dario Frenicde2a032019-10-27 00:29:22 +01006330 }
6331
6332 apex_key {
6333 name: "myapex.key",
6334 public_key: "testkey.avbpubkey",
6335 private_key: "testkey.pem",
6336 }
6337
6338 android_app_import {
6339 name: "AppFooPrebuilt",
6340 apk: "PrebuiltAppFoo.apk",
6341 presigned: true,
6342 dex_preopt: {
6343 enabled: false,
6344 },
Jiyong Park592a6a42020-04-21 22:34:28 +09006345 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006346 }
6347
6348 android_app_import {
6349 name: "AppFooPrivPrebuilt",
6350 apk: "PrebuiltAppFooPriv.apk",
6351 privileged: true,
6352 presigned: true,
6353 dex_preopt: {
6354 enabled: false,
6355 },
Jooyung Han39ee1192020-03-23 20:21:11 +09006356 filename: "AwesomePrebuiltAppFooPriv.apk",
Jiyong Park592a6a42020-04-21 22:34:28 +09006357 apex_available: ["myapex"],
Dario Frenicde2a032019-10-27 00:29:22 +01006358 }
6359 `)
6360
Jooyung Hana0503a52023-08-23 13:12:50 +09006361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Frenicde2a032019-10-27 00:29:22 +01006362 apexRule := module.Rule("apexRule")
6363 copyCmds := apexRule.Args["copy_commands"]
6364
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006365 ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
6366 ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
Jooyung Han39ee1192020-03-23 20:21:11 +09006367}
6368
6369func TestApexWithAppImportsPrefer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006370 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006371 ctx := testApex(t, `
Jooyung Han39ee1192020-03-23 20:21:11 +09006372 apex {
6373 name: "myapex",
6374 key: "myapex.key",
6375 apps: [
6376 "AppFoo",
6377 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006378 updatable: false,
Jooyung Han39ee1192020-03-23 20:21:11 +09006379 }
6380
6381 apex_key {
6382 name: "myapex.key",
6383 public_key: "testkey.avbpubkey",
6384 private_key: "testkey.pem",
6385 }
6386
6387 android_app {
6388 name: "AppFoo",
6389 srcs: ["foo/bar/MyClass.java"],
6390 sdk_version: "none",
6391 system_modules: "none",
6392 apex_available: [ "myapex" ],
6393 }
6394
6395 android_app_import {
6396 name: "AppFoo",
6397 apk: "AppFooPrebuilt.apk",
6398 filename: "AppFooPrebuilt.apk",
6399 presigned: true,
6400 prefer: true,
Jiyong Park592a6a42020-04-21 22:34:28 +09006401 apex_available: ["myapex"],
Jooyung Han39ee1192020-03-23 20:21:11 +09006402 }
6403 `, withFiles(map[string][]byte{
6404 "AppFooPrebuilt.apk": nil,
6405 }))
6406
Jooyung Hana0503a52023-08-23 13:12:50 +09006407 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006408 "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
Jooyung Han39ee1192020-03-23 20:21:11 +09006409 })
Sundong Ahne1f05aa2019-08-27 13:55:42 +09006410}
6411
Dario Freni6f3937c2019-12-20 22:58:03 +00006412func TestApexWithTestHelperApp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006413 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08006414 ctx := testApex(t, `
Dario Freni6f3937c2019-12-20 22:58:03 +00006415 apex {
6416 name: "myapex",
6417 key: "myapex.key",
6418 apps: [
6419 "TesterHelpAppFoo",
6420 ],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006421 updatable: false,
Dario Freni6f3937c2019-12-20 22:58:03 +00006422 }
6423
6424 apex_key {
6425 name: "myapex.key",
6426 public_key: "testkey.avbpubkey",
6427 private_key: "testkey.pem",
6428 }
6429
6430 android_test_helper_app {
6431 name: "TesterHelpAppFoo",
6432 srcs: ["foo/bar/MyClass.java"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00006433 apex_available: [ "myapex" ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00006434 sdk_version: "test_current",
Dario Freni6f3937c2019-12-20 22:58:03 +00006435 }
6436
6437 `)
6438
Jooyung Hana0503a52023-08-23 13:12:50 +09006439 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Dario Freni6f3937c2019-12-20 22:58:03 +00006440 apexRule := module.Rule("apexRule")
6441 copyCmds := apexRule.Args["copy_commands"]
6442
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00006443 ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
Dario Freni6f3937c2019-12-20 22:58:03 +00006444}
6445
Jooyung Han18020ea2019-11-13 10:50:48 +09006446func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006447 t.Parallel()
Jooyung Han18020ea2019-11-13 10:50:48 +09006448 // libfoo's apex_available comes from cc_defaults
Steven Moreland6e36cd62020-10-22 01:08:35 +00006449 testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
Jooyung Han18020ea2019-11-13 10:50:48 +09006450 apex {
6451 name: "myapex",
6452 key: "myapex.key",
6453 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006454 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006455 }
6456
6457 apex_key {
6458 name: "myapex.key",
6459 public_key: "testkey.avbpubkey",
6460 private_key: "testkey.pem",
6461 }
6462
6463 apex {
6464 name: "otherapex",
6465 key: "myapex.key",
6466 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006467 updatable: false,
Jooyung Han18020ea2019-11-13 10:50:48 +09006468 }
6469
6470 cc_defaults {
6471 name: "libfoo-defaults",
6472 apex_available: ["otherapex"],
6473 }
6474
6475 cc_library {
6476 name: "libfoo",
6477 defaults: ["libfoo-defaults"],
6478 stl: "none",
6479 system_shared_libs: [],
6480 }`)
6481}
6482
Paul Duffine52e66f2020-03-30 17:54:29 +01006483func TestApexAvailable_DirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006484 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006485 // libfoo is not available to myapex, but only to otherapex
Steven Moreland6e36cd62020-10-22 01:08:35 +00006486 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
Jiyong Park127b40b2019-09-30 16:04:35 +09006487 apex {
6488 name: "myapex",
6489 key: "myapex.key",
6490 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006491 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006492 }
6493
6494 apex_key {
6495 name: "myapex.key",
6496 public_key: "testkey.avbpubkey",
6497 private_key: "testkey.pem",
6498 }
6499
6500 apex {
6501 name: "otherapex",
6502 key: "otherapex.key",
6503 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006504 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006505 }
6506
6507 apex_key {
6508 name: "otherapex.key",
6509 public_key: "testkey.avbpubkey",
6510 private_key: "testkey.pem",
6511 }
6512
6513 cc_library {
6514 name: "libfoo",
6515 stl: "none",
6516 system_shared_libs: [],
6517 apex_available: ["otherapex"],
6518 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006519
6520 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6521 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6522 testApex(t, `
6523 apex {
6524 name: "com.sdv.myapex",
6525 key: "myapex.key",
6526 native_shared_libs: ["libfoo"],
6527 updatable: false,
6528 product_specific: true,
6529 }
6530
6531 apex_key {
6532 name: "myapex.key",
6533 public_key: "testkey.avbpubkey",
6534 private_key: "testkey.pem",
6535 }
6536
6537 apex {
6538 name: "com.any.otherapex",
6539 key: "otherapex.key",
6540 native_shared_libs: ["libfoo"],
6541 updatable: false,
6542 }
6543
6544 apex_key {
6545 name: "otherapex.key",
6546 public_key: "testkey.avbpubkey",
6547 private_key: "testkey.pem",
6548 }
6549
6550 cc_library {
6551 name: "libfoo",
6552 stl: "none",
6553 system_shared_libs: [],
6554 apex_available: ["com.any.otherapex"],
6555 product_specific: true,
6556 }`,
6557 android.FixtureMergeMockFs(android.MockFS{
6558 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6559 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6560 }))
6561
6562 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6563 testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
6564 apex {
6565 name: "com.sdv.myapex",
6566 key: "myapex.key",
6567 native_shared_libs: ["libfoo"],
6568 updatable: false,
6569 }
6570
6571 apex_key {
6572 name: "myapex.key",
6573 public_key: "testkey.avbpubkey",
6574 private_key: "testkey.pem",
6575 }
6576
6577 apex {
6578 name: "com.any.otherapex",
6579 key: "otherapex.key",
6580 native_shared_libs: ["libfoo"],
6581 updatable: false,
6582 }
6583
6584 apex_key {
6585 name: "otherapex.key",
6586 public_key: "testkey.avbpubkey",
6587 private_key: "testkey.pem",
6588 }
6589
6590 cc_library {
6591 name: "libfoo",
6592 stl: "none",
6593 system_shared_libs: [],
6594 apex_available: ["com.any.otherapex"],
6595 }`,
6596 android.FixtureMergeMockFs(android.MockFS{
6597 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6598 "system/sepolicy/apex/com.any.otherapex-file_contexts": nil,
6599 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006600}
Jiyong Park127b40b2019-09-30 16:04:35 +09006601
Paul Duffine52e66f2020-03-30 17:54:29 +01006602func TestApexAvailable_IndirectDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006603 t.Parallel()
Jooyung Han5e9013b2020-03-10 06:23:13 +09006604 // libbbaz is an indirect dep
Jiyong Park767dbd92021-03-04 13:03:10 +09006605 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
Paul Duffin520917a2022-05-13 13:01:59 +00006606.*via tag apex\.dependencyTag\{"sharedLib"\}
Paul Duffindf915ff2020-03-30 17:58:21 +01006607.*-> libfoo.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006608.*via tag cc\.dependencyTag.*
6609.*-> libfoo.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006610.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Paul Duffindf915ff2020-03-30 17:58:21 +01006611.*-> libbar.*link:shared.*
Yu Liub73c3a62024-12-10 00:58:06 +00006612.*via tag cc\.dependencyTag.*
6613.*-> libbar.*link:static.*
Colin Cross6e511a92020-07-27 21:26:48 -07006614.*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
Yu Liub73c3a62024-12-10 00:58:06 +00006615.*-> libbaz.*link:shared.*
6616.*via tag cc\.dependencyTag.*
6617.*-> libbaz.*link:static.*`, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006618 apex {
6619 name: "myapex",
6620 key: "myapex.key",
6621 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006622 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006623 }
6624
6625 apex_key {
6626 name: "myapex.key",
6627 public_key: "testkey.avbpubkey",
6628 private_key: "testkey.pem",
6629 }
6630
Jiyong Park127b40b2019-09-30 16:04:35 +09006631 cc_library {
6632 name: "libfoo",
6633 stl: "none",
6634 shared_libs: ["libbar"],
6635 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006636 apex_available: ["myapex"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006637 }
6638
6639 cc_library {
6640 name: "libbar",
6641 stl: "none",
Jooyung Han5e9013b2020-03-10 06:23:13 +09006642 shared_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006643 system_shared_libs: [],
Jooyung Han5e9013b2020-03-10 06:23:13 +09006644 apex_available: ["myapex"],
6645 }
6646
6647 cc_library {
6648 name: "libbaz",
6649 stl: "none",
6650 system_shared_libs: [],
Jiyong Park127b40b2019-09-30 16:04:35 +09006651 }`)
Chan Wang490a6f92024-09-23 11:52:00 +00006652
6653 // 'apex_available' check is bypassed for /product apex with a specific prefix.
6654 // TODO: b/352818241 - Remove below two cases after APEX availability is enforced for /product APEXes.
6655 testApex(t, `
6656 apex {
6657 name: "com.sdv.myapex",
6658 key: "myapex.key",
6659 native_shared_libs: ["libfoo"],
6660 updatable: false,
6661 product_specific: true,
6662 }
6663
6664 apex_key {
6665 name: "myapex.key",
6666 public_key: "testkey.avbpubkey",
6667 private_key: "testkey.pem",
6668 }
6669
6670 cc_library {
6671 name: "libfoo",
6672 stl: "none",
6673 shared_libs: ["libbar"],
6674 system_shared_libs: [],
6675 apex_available: ["com.sdv.myapex"],
6676 product_specific: true,
6677 }
6678
6679 cc_library {
6680 name: "libbar",
6681 stl: "none",
6682 shared_libs: ["libbaz"],
6683 system_shared_libs: [],
6684 apex_available: ["com.sdv.myapex"],
6685 product_specific: true,
6686 }
6687
6688 cc_library {
6689 name: "libbaz",
6690 stl: "none",
6691 system_shared_libs: [],
6692 product_specific: true,
6693 }`,
6694 android.FixtureMergeMockFs(android.MockFS{
6695 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6696 }))
6697
6698 // 'apex_available' check is not bypassed for non-product apex with a specific prefix.
6699 testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.`, `
6700 apex {
6701 name: "com.sdv.myapex",
6702 key: "myapex.key",
6703 native_shared_libs: ["libfoo"],
6704 updatable: false,
6705 }
6706
6707 apex_key {
6708 name: "myapex.key",
6709 public_key: "testkey.avbpubkey",
6710 private_key: "testkey.pem",
6711 }
6712
6713 cc_library {
6714 name: "libfoo",
6715 stl: "none",
6716 shared_libs: ["libbar"],
6717 system_shared_libs: [],
6718 apex_available: ["com.sdv.myapex"],
6719 }
6720
6721 cc_library {
6722 name: "libbar",
6723 stl: "none",
6724 shared_libs: ["libbaz"],
6725 system_shared_libs: [],
6726 apex_available: ["com.sdv.myapex"],
6727 }
6728
6729 cc_library {
6730 name: "libbaz",
6731 stl: "none",
6732 system_shared_libs: [],
6733 }`,
6734 android.FixtureMergeMockFs(android.MockFS{
6735 "system/sepolicy/apex/com.sdv.myapex-file_contexts": nil,
6736 }))
Paul Duffine52e66f2020-03-30 17:54:29 +01006737}
Jiyong Park127b40b2019-09-30 16:04:35 +09006738
Liz Kammer5f108fa2023-05-11 14:33:17 -04006739func TestApexAvailable_IndirectStaticDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006740 t.Parallel()
Liz Kammer5f108fa2023-05-11 14:33:17 -04006741 testApex(t, `
6742 apex {
6743 name: "myapex",
6744 key: "myapex.key",
6745 native_shared_libs: ["libfoo"],
6746 updatable: false,
6747 }
6748
6749 apex_key {
6750 name: "myapex.key",
6751 public_key: "testkey.avbpubkey",
6752 private_key: "testkey.pem",
6753 }
6754
6755 cc_library {
6756 name: "libfoo",
6757 stl: "none",
6758 static_libs: ["libbar"],
6759 system_shared_libs: [],
6760 apex_available: ["myapex"],
6761 }
6762
6763 cc_library {
6764 name: "libbar",
6765 stl: "none",
6766 shared_libs: ["libbaz"],
6767 system_shared_libs: [],
6768 apex_available: ["myapex"],
6769 }
6770
6771 cc_library {
6772 name: "libbaz",
6773 stl: "none",
6774 system_shared_libs: [],
6775 }`)
6776
6777 testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
6778 apex {
6779 name: "myapex",
6780 key: "myapex.key",
6781 native_shared_libs: ["libfoo"],
6782 updatable: false,
6783 }
6784
6785 apex_key {
6786 name: "myapex.key",
6787 public_key: "testkey.avbpubkey",
6788 private_key: "testkey.pem",
6789 }
6790
6791 cc_library {
6792 name: "libfoo",
6793 stl: "none",
6794 static_libs: ["libbar"],
6795 system_shared_libs: [],
6796 apex_available: ["myapex"],
6797 }
6798
6799 cc_library {
6800 name: "libbar",
6801 stl: "none",
6802 system_shared_libs: [],
6803 }`)
6804}
6805
Paul Duffine52e66f2020-03-30 17:54:29 +01006806func TestApexAvailable_InvalidApexName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006807 t.Parallel()
Jiyong Park127b40b2019-09-30 16:04:35 +09006808 testApexError(t, "\"otherapex\" is not a valid module name", `
6809 apex {
6810 name: "myapex",
6811 key: "myapex.key",
6812 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006813 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006814 }
6815
6816 apex_key {
6817 name: "myapex.key",
6818 public_key: "testkey.avbpubkey",
6819 private_key: "testkey.pem",
6820 }
6821
6822 cc_library {
6823 name: "libfoo",
6824 stl: "none",
6825 system_shared_libs: [],
6826 apex_available: ["otherapex"],
6827 }`)
6828
Paul Duffine52e66f2020-03-30 17:54:29 +01006829 testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09006830 apex {
6831 name: "myapex",
6832 key: "myapex.key",
6833 native_shared_libs: ["libfoo", "libbar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00006834 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09006835 }
6836
6837 apex_key {
6838 name: "myapex.key",
6839 public_key: "testkey.avbpubkey",
6840 private_key: "testkey.pem",
6841 }
6842
6843 cc_library {
6844 name: "libfoo",
6845 stl: "none",
6846 system_shared_libs: [],
Jiyong Park323a4c32020-03-01 17:29:06 +09006847 runtime_libs: ["libbaz"],
Jiyong Park127b40b2019-09-30 16:04:35 +09006848 apex_available: ["myapex"],
6849 }
6850
6851 cc_library {
6852 name: "libbar",
6853 stl: "none",
6854 system_shared_libs: [],
6855 apex_available: ["//apex_available:anyapex"],
Jiyong Park323a4c32020-03-01 17:29:06 +09006856 }
6857
6858 cc_library {
6859 name: "libbaz",
6860 stl: "none",
6861 system_shared_libs: [],
6862 stubs: {
6863 versions: ["10", "20", "30"],
6864 },
Jiyong Park127b40b2019-09-30 16:04:35 +09006865 }`)
Paul Duffine52e66f2020-03-30 17:54:29 +01006866}
Jiyong Park127b40b2019-09-30 16:04:35 +09006867
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006868func TestApexAvailable_ApexAvailableNameWithVersionCodeError(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006869 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006870 t.Run("negative variant_version produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006871 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006872 testApexError(t, "expected an integer between 0-9; got -1", `
6873 apex {
6874 name: "myapex",
6875 key: "myapex.key",
6876 apex_available_name: "com.android.foo",
6877 variant_version: "-1",
6878 updatable: false,
6879 }
6880 apex_key {
6881 name: "myapex.key",
6882 public_key: "testkey.avbpubkey",
6883 private_key: "testkey.pem",
6884 }
6885 `)
6886 })
6887
6888 t.Run("variant_version greater than 9 produces error", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006889 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006890 testApexError(t, "expected an integer between 0-9; got 10", `
6891 apex {
6892 name: "myapex",
6893 key: "myapex.key",
6894 apex_available_name: "com.android.foo",
6895 variant_version: "10",
6896 updatable: false,
6897 }
6898 apex_key {
6899 name: "myapex.key",
6900 public_key: "testkey.avbpubkey",
6901 private_key: "testkey.pem",
6902 }
6903 `)
6904 })
6905}
6906
6907func TestApexAvailable_ApexAvailableNameWithVersionCode(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006908 t.Parallel()
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006909 context := android.GroupFixturePreparers(
6910 android.PrepareForIntegrationTestWithAndroid,
6911 PrepareForTestWithApexBuildComponents,
6912 android.FixtureMergeMockFs(android.MockFS{
6913 "system/sepolicy/apex/foo-file_contexts": nil,
6914 "system/sepolicy/apex/bar-file_contexts": nil,
6915 }),
6916 )
6917 result := context.RunTestWithBp(t, `
6918 apex {
6919 name: "foo",
6920 key: "myapex.key",
6921 apex_available_name: "com.android.foo",
6922 variant_version: "0",
6923 updatable: false,
6924 }
6925 apex {
6926 name: "bar",
6927 key: "myapex.key",
6928 apex_available_name: "com.android.foo",
6929 variant_version: "3",
6930 updatable: false,
6931 }
6932 apex_key {
6933 name: "myapex.key",
6934 public_key: "testkey.avbpubkey",
6935 private_key: "testkey.pem",
6936 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006937 override_apex {
6938 name: "myoverrideapex",
6939 base: "bar",
6940 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006941 `)
6942
Jooyung Hana0503a52023-08-23 13:12:50 +09006943 fooManifestRule := result.ModuleForTests("foo", "android_common_foo").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006944 fooExpectedDefaultVersion := testDefaultUpdatableModuleVersion
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006945 fooActualDefaultVersion := fooManifestRule.Args["default_version"]
6946 if fooActualDefaultVersion != fooExpectedDefaultVersion {
6947 t.Errorf("expected to find defaultVersion %q; got %q", fooExpectedDefaultVersion, fooActualDefaultVersion)
6948 }
6949
Jooyung Hana0503a52023-08-23 13:12:50 +09006950 barManifestRule := result.ModuleForTests("bar", "android_common_bar").Rule("apexManifestRule")
Alyssa Ketpreechasawat3a6eced2024-08-22 15:09:16 +00006951 defaultVersionInt, _ := strconv.Atoi(testDefaultUpdatableModuleVersion)
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006952 barExpectedDefaultVersion := fmt.Sprint(defaultVersionInt + 3)
6953 barActualDefaultVersion := barManifestRule.Args["default_version"]
6954 if barActualDefaultVersion != barExpectedDefaultVersion {
6955 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6956 }
Sam Delmerico419f9a32023-07-21 12:00:13 -04006957
Spandan Das50801e22024-05-13 18:29:45 +00006958 overrideBarManifestRule := result.ModuleForTests("bar", "android_common_myoverrideapex_myoverrideapex").Rule("apexManifestRule")
Sam Delmerico419f9a32023-07-21 12:00:13 -04006959 overrideBarActualDefaultVersion := overrideBarManifestRule.Args["default_version"]
6960 if overrideBarActualDefaultVersion != barExpectedDefaultVersion {
6961 t.Errorf("expected to find defaultVersion %q; got %q", barExpectedDefaultVersion, barActualDefaultVersion)
6962 }
Sam Delmerico6d65a0f2023-06-05 15:55:57 -04006963}
6964
Sam Delmericoca816532023-06-02 14:09:50 -04006965func TestApexAvailable_ApexAvailableName(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006966 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006967 t.Run("using name of apex that sets apex_available_name is not allowed", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07006968 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04006969 testApexError(t, "Consider adding \"myapex\" to 'apex_available' property of \"AppFoo\"", `
6970 apex {
6971 name: "myapex_sminus",
6972 key: "myapex.key",
6973 apps: ["AppFoo"],
6974 apex_available_name: "myapex",
6975 updatable: false,
6976 }
6977 apex {
6978 name: "myapex",
6979 key: "myapex.key",
6980 apps: ["AppFoo"],
6981 updatable: false,
6982 }
6983 apex_key {
6984 name: "myapex.key",
6985 public_key: "testkey.avbpubkey",
6986 private_key: "testkey.pem",
6987 }
6988 android_app {
6989 name: "AppFoo",
6990 srcs: ["foo/bar/MyClass.java"],
6991 sdk_version: "none",
6992 system_modules: "none",
6993 apex_available: [ "myapex_sminus" ],
6994 }`,
6995 android.FixtureMergeMockFs(android.MockFS{
6996 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
6997 }),
6998 )
6999 })
7000
7001 t.Run("apex_available_name allows module to be used in two different apexes", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007002 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007003 testApex(t, `
7004 apex {
7005 name: "myapex_sminus",
7006 key: "myapex.key",
7007 apps: ["AppFoo"],
7008 apex_available_name: "myapex",
7009 updatable: false,
7010 }
7011 apex {
7012 name: "myapex",
7013 key: "myapex.key",
7014 apps: ["AppFoo"],
7015 updatable: false,
7016 }
7017 apex_key {
7018 name: "myapex.key",
7019 public_key: "testkey.avbpubkey",
7020 private_key: "testkey.pem",
7021 }
7022 android_app {
7023 name: "AppFoo",
7024 srcs: ["foo/bar/MyClass.java"],
7025 sdk_version: "none",
7026 system_modules: "none",
7027 apex_available: [ "myapex" ],
7028 }`,
7029 android.FixtureMergeMockFs(android.MockFS{
7030 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7031 }),
7032 )
7033 })
7034
7035 t.Run("override_apexes work with apex_available_name", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007036 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007037 testApex(t, `
7038 override_apex {
7039 name: "myoverrideapex_sminus",
7040 base: "myapex_sminus",
7041 key: "myapex.key",
7042 apps: ["AppFooOverride"],
7043 }
7044 override_apex {
7045 name: "myoverrideapex",
7046 base: "myapex",
7047 key: "myapex.key",
7048 apps: ["AppFooOverride"],
7049 }
7050 apex {
7051 name: "myapex_sminus",
7052 key: "myapex.key",
7053 apps: ["AppFoo"],
7054 apex_available_name: "myapex",
7055 updatable: false,
7056 }
7057 apex {
7058 name: "myapex",
7059 key: "myapex.key",
7060 apps: ["AppFoo"],
7061 updatable: false,
7062 }
7063 apex_key {
7064 name: "myapex.key",
7065 public_key: "testkey.avbpubkey",
7066 private_key: "testkey.pem",
7067 }
7068 android_app {
7069 name: "AppFooOverride",
7070 srcs: ["foo/bar/MyClass.java"],
7071 sdk_version: "none",
7072 system_modules: "none",
7073 apex_available: [ "myapex" ],
7074 }
7075 android_app {
7076 name: "AppFoo",
7077 srcs: ["foo/bar/MyClass.java"],
7078 sdk_version: "none",
7079 system_modules: "none",
7080 apex_available: [ "myapex" ],
7081 }`,
7082 android.FixtureMergeMockFs(android.MockFS{
7083 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7084 }),
7085 )
7086 })
7087}
7088
7089func TestApexAvailable_ApexAvailableNameWithOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007090 t.Parallel()
Sam Delmericoca816532023-06-02 14:09:50 -04007091 context := android.GroupFixturePreparers(
7092 android.PrepareForIntegrationTestWithAndroid,
7093 PrepareForTestWithApexBuildComponents,
7094 java.PrepareForTestWithDexpreopt,
7095 android.FixtureMergeMockFs(android.MockFS{
7096 "system/sepolicy/apex/myapex-file_contexts": nil,
7097 "system/sepolicy/apex/myapex_sminus-file_contexts": nil,
7098 }),
7099 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7100 variables.BuildId = proptools.StringPtr("buildid")
7101 }),
7102 )
7103 context.RunTestWithBp(t, `
7104 override_apex {
7105 name: "myoverrideapex_sminus",
7106 base: "myapex_sminus",
7107 }
7108 override_apex {
7109 name: "myoverrideapex",
7110 base: "myapex",
7111 }
7112 apex {
7113 name: "myapex",
7114 key: "myapex.key",
7115 apps: ["AppFoo"],
7116 updatable: false,
7117 }
7118 apex {
7119 name: "myapex_sminus",
7120 apex_available_name: "myapex",
7121 key: "myapex.key",
7122 apps: ["AppFoo_sminus"],
7123 updatable: false,
7124 }
7125 apex_key {
7126 name: "myapex.key",
7127 public_key: "testkey.avbpubkey",
7128 private_key: "testkey.pem",
7129 }
7130 android_app {
7131 name: "AppFoo",
7132 srcs: ["foo/bar/MyClass.java"],
7133 sdk_version: "none",
7134 system_modules: "none",
7135 apex_available: [ "myapex" ],
7136 }
7137 android_app {
7138 name: "AppFoo_sminus",
7139 srcs: ["foo/bar/MyClass.java"],
7140 sdk_version: "none",
7141 min_sdk_version: "29",
7142 system_modules: "none",
7143 apex_available: [ "myapex" ],
7144 }`)
7145}
7146
Jiyong Park89e850a2020-04-07 16:37:39 +09007147func TestApexAvailable_CheckForPlatform(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007148 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007149 ctx := testApex(t, `
Jiyong Park127b40b2019-09-30 16:04:35 +09007150 apex {
7151 name: "myapex",
7152 key: "myapex.key",
Jiyong Park89e850a2020-04-07 16:37:39 +09007153 native_shared_libs: ["libbar", "libbaz"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007154 updatable: false,
Jiyong Park127b40b2019-09-30 16:04:35 +09007155 }
7156
7157 apex_key {
7158 name: "myapex.key",
7159 public_key: "testkey.avbpubkey",
7160 private_key: "testkey.pem",
7161 }
7162
7163 cc_library {
7164 name: "libfoo",
7165 stl: "none",
7166 system_shared_libs: [],
Jiyong Park89e850a2020-04-07 16:37:39 +09007167 shared_libs: ["libbar"],
Jiyong Park127b40b2019-09-30 16:04:35 +09007168 apex_available: ["//apex_available:platform"],
Jiyong Park89e850a2020-04-07 16:37:39 +09007169 }
7170
7171 cc_library {
7172 name: "libfoo2",
7173 stl: "none",
7174 system_shared_libs: [],
7175 shared_libs: ["libbaz"],
7176 apex_available: ["//apex_available:platform"],
7177 }
7178
7179 cc_library {
7180 name: "libbar",
7181 stl: "none",
7182 system_shared_libs: [],
7183 apex_available: ["myapex"],
7184 }
7185
7186 cc_library {
7187 name: "libbaz",
7188 stl: "none",
7189 system_shared_libs: [],
7190 apex_available: ["myapex"],
7191 stubs: {
7192 versions: ["1"],
7193 },
Jiyong Park127b40b2019-09-30 16:04:35 +09007194 }`)
7195
Jiyong Park89e850a2020-04-07 16:37:39 +09007196 // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
7197 // because it depends on libbar which isn't available to platform
7198 libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7199 if libfoo.NotAvailableForPlatform() != true {
7200 t.Errorf("%q shouldn't be available to platform", libfoo.String())
7201 }
7202
7203 // libfoo2 however can be available to platform because it depends on libbaz which provides
7204 // stubs
7205 libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7206 if libfoo2.NotAvailableForPlatform() == true {
7207 t.Errorf("%q should be available to platform", libfoo2.String())
7208 }
Paul Duffine52e66f2020-03-30 17:54:29 +01007209}
Jiyong Parka90ca002019-10-07 15:47:24 +09007210
Paul Duffine52e66f2020-03-30 17:54:29 +01007211func TestApexAvailable_CreatedForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007212 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007213 ctx := testApex(t, `
Jiyong Parka90ca002019-10-07 15:47:24 +09007214 apex {
7215 name: "myapex",
7216 key: "myapex.key",
7217 native_shared_libs: ["libfoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007218 updatable: false,
Jiyong Parka90ca002019-10-07 15:47:24 +09007219 }
7220
7221 apex_key {
7222 name: "myapex.key",
7223 public_key: "testkey.avbpubkey",
7224 private_key: "testkey.pem",
7225 }
7226
7227 cc_library {
7228 name: "libfoo",
7229 stl: "none",
7230 system_shared_libs: [],
7231 apex_available: ["myapex"],
7232 static: {
7233 apex_available: ["//apex_available:platform"],
7234 },
7235 }`)
7236
Jiyong Park89e850a2020-04-07 16:37:39 +09007237 libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
7238 if libfooShared.NotAvailableForPlatform() != true {
7239 t.Errorf("%q shouldn't be available to platform", libfooShared.String())
7240 }
7241 libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
7242 if libfooStatic.NotAvailableForPlatform() != false {
7243 t.Errorf("%q should be available to platform", libfooStatic.String())
7244 }
Jiyong Park127b40b2019-09-30 16:04:35 +09007245}
7246
Jooyung Han9a419e22024-08-16 17:14:21 +09007247func TestApexAvailable_PrefixMatch(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007248 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007249
7250 for _, tc := range []struct {
7251 name string
7252 apexAvailable string
7253 expectedError string
7254 }{
7255 {
7256 name: "prefix matches correctly",
7257 apexAvailable: "com.foo.*",
7258 },
7259 {
7260 name: "prefix doesn't match",
7261 apexAvailable: "com.bar.*",
7262 expectedError: `Consider .* "com.foo\.\*"`,
7263 },
7264 {
7265 name: "short prefix",
7266 apexAvailable: "com.*",
7267 expectedError: "requires two or more components",
7268 },
7269 {
7270 name: "wildcard not in the end",
7271 apexAvailable: "com.*.foo",
7272 expectedError: "should end with .*",
7273 },
7274 {
7275 name: "wildcard in the middle",
7276 apexAvailable: "com.foo*.*",
7277 expectedError: "not allowed in the middle",
7278 },
7279 {
7280 name: "hint with prefix pattern",
7281 apexAvailable: "//apex_available:platform",
7282 expectedError: "Consider adding \"com.foo.bar\" or \"com.foo.*\"",
7283 },
7284 } {
7285 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007286 t.Parallel()
Jooyung Han9a419e22024-08-16 17:14:21 +09007287 errorHandler := android.FixtureExpectsNoErrors
7288 if tc.expectedError != "" {
7289 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
7290 }
7291 context := android.GroupFixturePreparers(
7292 prepareForApexTest,
7293 android.FixtureMergeMockFs(android.MockFS{
7294 "system/sepolicy/apex/com.foo.bar-file_contexts": nil,
7295 }),
7296 ).ExtendWithErrorHandler(errorHandler)
7297
7298 context.RunTestWithBp(t, `
7299 apex {
7300 name: "com.foo.bar",
7301 key: "myapex.key",
7302 native_shared_libs: ["libfoo"],
7303 updatable: false,
7304 }
7305
7306 apex_key {
7307 name: "myapex.key",
7308 public_key: "testkey.avbpubkey",
7309 private_key: "testkey.pem",
7310 }
7311
7312 cc_library {
7313 name: "libfoo",
7314 stl: "none",
7315 system_shared_libs: [],
7316 apex_available: ["`+tc.apexAvailable+`"],
7317 }`)
7318 })
7319 }
7320 testApexError(t, `Consider adding "com.foo" to`, `
7321 apex {
7322 name: "com.foo", // too short for a partner apex
7323 key: "myapex.key",
7324 native_shared_libs: ["libfoo"],
7325 updatable: false,
7326 }
7327
7328 apex_key {
7329 name: "myapex.key",
7330 public_key: "testkey.avbpubkey",
7331 private_key: "testkey.pem",
7332 }
7333
7334 cc_library {
7335 name: "libfoo",
7336 stl: "none",
7337 system_shared_libs: [],
7338 }
7339 `)
7340}
7341
Jooyung Han5f7fa502025-01-14 16:52:14 +09007342func TestApexValidation_UsesProperPartitionTag(t *testing.T) {
7343 t.Parallel()
7344 ctx := testApex(t, `
7345 apex {
7346 name: "myapex",
7347 key: "myapex.key",
7348 updatable: false,
7349 vendor: true,
7350 }
7351 apex_key {
7352 name: "myapex.key",
7353 public_key: "testkey.avbpubkey",
7354 private_key: "testkey.pem",
7355 }
7356 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
7357 // vendor path should not affect "partition tag"
7358 variables.VendorPath = proptools.StringPtr("system/vendor")
7359 }))
7360
7361 module := ctx.ModuleForTests("myapex", "android_common_myapex")
7362 android.AssertStringEquals(t, "partition tag for host_apex_verifier",
7363 "vendor",
7364 module.Output("host_apex_verifier.timestamp").Args["partition_tag"])
7365 android.AssertStringEquals(t, "partition tag for apex_sepolicy_tests",
7366 "vendor",
7367 module.Output("apex_sepolicy_tests.timestamp").Args["partition_tag"])
7368}
7369
Jooyung Hanb9518072024-11-22 14:05:20 +09007370func TestApexValidation_TestApexCanSkipInitRcCheck(t *testing.T) {
7371 t.Parallel()
7372 ctx := testApex(t, `
7373 apex_test {
7374 name: "myapex",
7375 key: "myapex.key",
7376 skip_validations: {
7377 host_apex_verifier: true,
7378 },
7379 updatable: false,
7380 }
7381 apex_key {
7382 name: "myapex.key",
7383 public_key: "testkey.avbpubkey",
7384 private_key: "testkey.pem",
7385 }
7386 `)
7387
7388 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7389 if android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7390 t.Error("should not run host_apex_verifier")
7391 }
7392}
7393
7394func TestApexValidation_TestApexCheckInitRc(t *testing.T) {
7395 t.Parallel()
7396 ctx := testApex(t, `
7397 apex_test {
7398 name: "myapex",
7399 key: "myapex.key",
7400 updatable: false,
7401 }
7402 apex_key {
7403 name: "myapex.key",
7404 public_key: "testkey.avbpubkey",
7405 private_key: "testkey.pem",
7406 }
7407 `)
7408
7409 validations := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("signapk").Validations.Strings()
7410 if !android.SuffixInList(validations, "host_apex_verifier.timestamp") {
7411 t.Error("should run host_apex_verifier")
7412 }
7413}
7414
Jiyong Park5d790c32019-11-15 18:40:32 +09007415func TestOverrideApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007416 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007417 ctx := testApex(t, `
Jiyong Park5d790c32019-11-15 18:40:32 +09007418 apex {
7419 name: "myapex",
7420 key: "myapex.key",
7421 apps: ["app"],
markchien7c803b82021-08-26 22:10:06 +08007422 bpfs: ["bpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007423 prebuilts: ["myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007424 overrides: ["oldapex"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007425 updatable: false,
Jiyong Park5d790c32019-11-15 18:40:32 +09007426 }
7427
7428 override_apex {
7429 name: "override_myapex",
7430 base: "myapex",
7431 apps: ["override_app"],
Ken Chen5372a242022-07-07 17:48:06 +08007432 bpfs: ["overrideBpf"],
Daniel Norman5a3ce132021-08-26 15:44:43 -07007433 prebuilts: ["override_myetc"],
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007434 overrides: ["unknownapex"],
Jesse Melhuishec60e252024-03-29 19:08:20 +00007435 compile_multilib: "first",
7436 multilib: {
7437 lib32: {
7438 native_shared_libs: ["mylib32"],
7439 },
7440 lib64: {
7441 native_shared_libs: ["mylib64"],
7442 },
7443 },
Baligh Uddin004d7172020-02-19 21:29:28 -08007444 logging_parent: "com.foo.bar",
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007445 package_name: "test.overridden.package",
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007446 key: "mynewapex.key",
7447 certificate: ":myapex.certificate",
Jiyong Park5d790c32019-11-15 18:40:32 +09007448 }
7449
7450 apex_key {
7451 name: "myapex.key",
7452 public_key: "testkey.avbpubkey",
7453 private_key: "testkey.pem",
7454 }
7455
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007456 apex_key {
7457 name: "mynewapex.key",
7458 public_key: "testkey2.avbpubkey",
7459 private_key: "testkey2.pem",
7460 }
7461
7462 android_app_certificate {
7463 name: "myapex.certificate",
7464 certificate: "testkey",
7465 }
7466
Jiyong Park5d790c32019-11-15 18:40:32 +09007467 android_app {
7468 name: "app",
7469 srcs: ["foo/bar/MyClass.java"],
7470 package_name: "foo",
7471 sdk_version: "none",
7472 system_modules: "none",
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007473 apex_available: [ "myapex" ],
Jiyong Park5d790c32019-11-15 18:40:32 +09007474 }
7475
7476 override_android_app {
7477 name: "override_app",
7478 base: "app",
7479 package_name: "bar",
7480 }
markchien7c803b82021-08-26 22:10:06 +08007481
7482 bpf {
7483 name: "bpf",
7484 srcs: ["bpf.c"],
7485 }
7486
7487 bpf {
Ken Chen5372a242022-07-07 17:48:06 +08007488 name: "overrideBpf",
7489 srcs: ["overrideBpf.c"],
markchien7c803b82021-08-26 22:10:06 +08007490 }
Daniel Norman5a3ce132021-08-26 15:44:43 -07007491
7492 prebuilt_etc {
7493 name: "myetc",
7494 src: "myprebuilt",
7495 }
7496
7497 prebuilt_etc {
7498 name: "override_myetc",
7499 src: "override_myprebuilt",
7500 }
Jesse Melhuishec60e252024-03-29 19:08:20 +00007501
7502 cc_library {
7503 name: "mylib32",
7504 apex_available: [ "myapex" ],
7505 }
7506
7507 cc_library {
7508 name: "mylib64",
7509 apex_available: [ "myapex" ],
7510 }
Jiyong Park20bacab2020-03-03 11:45:41 +09007511 `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
Jiyong Park5d790c32019-11-15 18:40:32 +09007512
Jooyung Hana0503a52023-08-23 13:12:50 +09007513 originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(android.OverridableModule)
Spandan Das50801e22024-05-13 18:29:45 +00007514 overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Module().(android.OverridableModule)
Jiyong Park317645e2019-12-05 13:20:58 +09007515 if originalVariant.GetOverriddenBy() != "" {
7516 t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
7517 }
7518 if overriddenVariant.GetOverriddenBy() != "override_myapex" {
7519 t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
7520 }
7521
Spandan Das50801e22024-05-13 18:29:45 +00007522 module := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007523 apexRule := module.Rule("apexRule")
7524 copyCmds := apexRule.Args["copy_commands"]
7525
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00007526 ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
7527 ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007528
markchien7c803b82021-08-26 22:10:06 +08007529 ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
Ken Chen5372a242022-07-07 17:48:06 +08007530 ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
markchien7c803b82021-08-26 22:10:06 +08007531
Daniel Norman5a3ce132021-08-26 15:44:43 -07007532 ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
7533 ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
7534
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007535 apexBundle := module.Module().(*apexBundle)
7536 name := apexBundle.Name()
7537 if name != "override_myapex" {
7538 t.Errorf("name should be \"override_myapex\", but was %q", name)
7539 }
7540
Baligh Uddin004d7172020-02-19 21:29:28 -08007541 if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
7542 t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
7543 }
7544
Jiyong Park20bacab2020-03-03 11:45:41 +09007545 optFlags := apexRule.Args["opt_flags"]
Baligh Uddin5b57dba2020-03-15 13:01:05 -07007546 ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
Jaewoong Jung4cfdf7d2021-04-20 16:21:24 -07007547 ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
7548
7549 signApkRule := module.Rule("signapk")
7550 ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
Jiyong Park20bacab2020-03-03 11:45:41 +09007551
Colin Crossaa255532020-07-03 13:18:24 -07007552 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007553 var builder strings.Builder
7554 data.Custom(&builder, name, "TARGET_", "", data)
7555 androidMk := builder.String()
Diwas Sharmabb9202e2023-01-26 18:42:21 +00007556 ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
7557 ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007558 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
Jaewoong Jung7abcf8e2019-12-19 17:32:06 -08007559 ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007560 ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
markchien7c803b82021-08-26 22:10:06 +08007561 ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
Jiyong Parkf653b052019-11-18 15:39:01 +09007562 ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
Jaewoong Jung1670ca02019-11-22 14:50:42 -08007563 ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
Jiyong Park5d790c32019-11-15 18:40:32 +09007564}
7565
Albert Martineefabcf2022-03-21 20:11:16 +00007566func TestMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007567 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007568 // Override from 29 to 31
7569 minSdkOverride31 := "31"
7570 ctx := testApex(t, `
7571 apex {
7572 name: "myapex",
7573 key: "myapex.key",
7574 native_shared_libs: ["mylib"],
7575 updatable: true,
7576 min_sdk_version: "29"
7577 }
7578
7579 override_apex {
7580 name: "override_myapex",
7581 base: "myapex",
7582 logging_parent: "com.foo.bar",
7583 package_name: "test.overridden.package"
7584 }
7585
7586 apex_key {
7587 name: "myapex.key",
7588 public_key: "testkey.avbpubkey",
7589 private_key: "testkey.pem",
7590 }
7591
7592 cc_library {
7593 name: "mylib",
7594 srcs: ["mylib.cpp"],
7595 runtime_libs: ["libbar"],
7596 system_shared_libs: [],
7597 stl: "none",
7598 apex_available: [ "myapex" ],
7599 min_sdk_version: "apex_inherit"
7600 }
7601
7602 cc_library {
7603 name: "libbar",
7604 srcs: ["mylib.cpp"],
7605 system_shared_libs: [],
7606 stl: "none",
7607 apex_available: [ "myapex" ],
7608 min_sdk_version: "apex_inherit"
7609 }
7610
7611 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
7612
Jooyung Hana0503a52023-08-23 13:12:50 +09007613 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007614 copyCmds := apexRule.Args["copy_commands"]
7615
7616 // Ensure that direct non-stubs dep is always included
7617 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7618
7619 // Ensure that runtime_libs dep in included
7620 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7621
7622 // Ensure libraries target overridden min_sdk_version value
7623 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7624}
7625
7626func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007627 t.Parallel()
Albert Martineefabcf2022-03-21 20:11:16 +00007628 // Attempt to override from 31 to 29, should be a NOOP
7629 minSdkOverride29 := "29"
7630 ctx := testApex(t, `
7631 apex {
7632 name: "myapex",
7633 key: "myapex.key",
7634 native_shared_libs: ["mylib"],
7635 updatable: true,
7636 min_sdk_version: "31"
7637 }
7638
7639 override_apex {
7640 name: "override_myapex",
7641 base: "myapex",
7642 logging_parent: "com.foo.bar",
7643 package_name: "test.overridden.package"
7644 }
7645
7646 apex_key {
7647 name: "myapex.key",
7648 public_key: "testkey.avbpubkey",
7649 private_key: "testkey.pem",
7650 }
7651
7652 cc_library {
7653 name: "mylib",
7654 srcs: ["mylib.cpp"],
7655 runtime_libs: ["libbar"],
7656 system_shared_libs: [],
7657 stl: "none",
7658 apex_available: [ "myapex" ],
7659 min_sdk_version: "apex_inherit"
7660 }
7661
7662 cc_library {
7663 name: "libbar",
7664 srcs: ["mylib.cpp"],
7665 system_shared_libs: [],
7666 stl: "none",
7667 apex_available: [ "myapex" ],
7668 min_sdk_version: "apex_inherit"
7669 }
7670
7671 `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
7672
Jooyung Hana0503a52023-08-23 13:12:50 +09007673 apexRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule")
Albert Martineefabcf2022-03-21 20:11:16 +00007674 copyCmds := apexRule.Args["copy_commands"]
7675
7676 // Ensure that direct non-stubs dep is always included
7677 ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
7678
7679 // Ensure that runtime_libs dep in included
7680 ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
7681
7682 // Ensure libraries target the original min_sdk_version value rather than the overridden
7683 ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
7684}
7685
Jooyung Han214bf372019-11-12 13:03:50 +09007686func TestLegacyAndroid10Support(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007687 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007688 ctx := testApex(t, `
Jooyung Han214bf372019-11-12 13:03:50 +09007689 apex {
7690 name: "myapex",
7691 key: "myapex.key",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007692 native_shared_libs: ["mylib"],
Jooyung Han5417f772020-03-12 18:37:20 +09007693 min_sdk_version: "29",
Jooyung Han214bf372019-11-12 13:03:50 +09007694 }
7695
7696 apex_key {
7697 name: "myapex.key",
7698 public_key: "testkey.avbpubkey",
7699 private_key: "testkey.pem",
7700 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007701
7702 cc_library {
7703 name: "mylib",
7704 srcs: ["mylib.cpp"],
7705 stl: "libc++",
7706 system_shared_libs: [],
7707 apex_available: [ "myapex" ],
Jooyung Han749dc692020-04-15 11:03:39 +09007708 min_sdk_version: "29",
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007709 }
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007710 `, withUnbundledBuild)
Jooyung Han214bf372019-11-12 13:03:50 +09007711
Jooyung Hana0503a52023-08-23 13:12:50 +09007712 module := ctx.ModuleForTests("myapex", "android_common_myapex")
Jooyung Han214bf372019-11-12 13:03:50 +09007713 args := module.Rule("apexRule").Args
7714 ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007715
7716 // The copies of the libraries in the apex should have one more dependency than
7717 // the ones outside the apex, namely the unwinder. Ideally we should check
7718 // the dependency names directly here but for some reason the names are blank in
7719 // this test.
7720 for _, lib := range []string{"libc++", "mylib"} {
Colin Crossaede88c2020-08-11 12:17:01 -07007721 apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
Peter Collingbournedc4f9862020-02-12 17:13:25 -08007722 nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
7723 if len(apexImplicits) != len(nonApexImplicits)+1 {
7724 t.Errorf("%q missing unwinder dep", lib)
7725 }
7726 }
Jooyung Han214bf372019-11-12 13:03:50 +09007727}
7728
Paul Duffine05480a2021-03-08 15:07:14 +00007729var filesForSdkLibrary = android.MockFS{
Paul Duffin9b879592020-05-26 13:21:35 +01007730 "api/current.txt": nil,
7731 "api/removed.txt": nil,
7732 "api/system-current.txt": nil,
7733 "api/system-removed.txt": nil,
7734 "api/test-current.txt": nil,
7735 "api/test-removed.txt": nil,
Paul Duffineedc5d52020-06-12 17:46:39 +01007736
Anton Hanssondff2c782020-12-21 17:10:01 +00007737 "100/public/api/foo.txt": nil,
7738 "100/public/api/foo-removed.txt": nil,
7739 "100/system/api/foo.txt": nil,
7740 "100/system/api/foo-removed.txt": nil,
7741
Paul Duffineedc5d52020-06-12 17:46:39 +01007742 // For java_sdk_library_import
7743 "a.jar": nil,
Paul Duffin9b879592020-05-26 13:21:35 +01007744}
7745
Jooyung Han58f26ab2019-12-18 15:34:32 +09007746func TestJavaSDKLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007747 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007748 ctx := testApex(t, `
Jooyung Han58f26ab2019-12-18 15:34:32 +09007749 apex {
7750 name: "myapex",
7751 key: "myapex.key",
7752 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007753 updatable: false,
Jooyung Han58f26ab2019-12-18 15:34:32 +09007754 }
7755
7756 apex_key {
7757 name: "myapex.key",
7758 public_key: "testkey.avbpubkey",
7759 private_key: "testkey.pem",
7760 }
7761
7762 java_sdk_library {
7763 name: "foo",
7764 srcs: ["a.java"],
7765 api_packages: ["foo"],
Anton Hanssoneec79eb2020-01-10 15:12:39 +00007766 apex_available: [ "myapex" ],
Jooyung Han58f26ab2019-12-18 15:34:32 +09007767 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007768
7769 prebuilt_apis {
7770 name: "sdk",
7771 api_dirs: ["100"],
7772 }
Paul Duffin9b879592020-05-26 13:21:35 +01007773 `, withFiles(filesForSdkLibrary))
Jooyung Han58f26ab2019-12-18 15:34:32 +09007774
7775 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007776 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jooyung Han58f26ab2019-12-18 15:34:32 +09007777 "javalib/foo.jar",
7778 "etc/permissions/foo.xml",
7779 })
7780 // Permission XML should point to the activated path of impl jar of java_sdk_library
Paul Duffin1816cde2024-04-10 10:58:21 +01007781 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Output("foo.xml")
7782 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7783 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
Jooyung Han58f26ab2019-12-18 15:34:32 +09007784}
7785
Spandan Das3ee19692024-06-19 04:47:40 +00007786func TestJavaSDKLibraryOverrideApexes(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007787 t.Parallel()
Spandan Das3ee19692024-06-19 04:47:40 +00007788 ctx := testApex(t, `
7789 override_apex {
7790 name: "mycompanyapex",
7791 base: "myapex",
7792 }
7793 apex {
7794 name: "myapex",
7795 key: "myapex.key",
7796 java_libs: ["foo"],
7797 updatable: false,
7798 }
7799
7800 apex_key {
7801 name: "myapex.key",
7802 public_key: "testkey.avbpubkey",
7803 private_key: "testkey.pem",
7804 }
7805
7806 java_sdk_library {
7807 name: "foo",
7808 srcs: ["a.java"],
7809 api_packages: ["foo"],
7810 apex_available: [ "myapex" ],
7811 }
7812
7813 prebuilt_apis {
7814 name: "sdk",
7815 api_dirs: ["100"],
7816 }
7817 `, withFiles(filesForSdkLibrary))
7818
7819 // Permission XML should point to the activated path of impl jar of java_sdk_library.
7820 // Since override variants (com.mycompany.android.foo) are installed in the same package as the overridden variant
7821 // (com.android.foo), the filepath should not contain override apex name.
7822 sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_mycompanyapex").Output("foo.xml")
7823 contents := android.ContentFromFileRuleForTests(t, ctx, sdkLibrary)
7824 ensureMatches(t, contents, "<library\\n\\s+name=\\\"foo\\\"\\n\\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"")
7825}
7826
Paul Duffin9b879592020-05-26 13:21:35 +01007827func TestJavaSDKLibrary_WithinApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007828 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007829 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007830 apex {
7831 name: "myapex",
7832 key: "myapex.key",
7833 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007834 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007835 }
7836
7837 apex_key {
7838 name: "myapex.key",
7839 public_key: "testkey.avbpubkey",
7840 private_key: "testkey.pem",
7841 }
7842
7843 java_sdk_library {
7844 name: "foo",
7845 srcs: ["a.java"],
7846 api_packages: ["foo"],
7847 apex_available: ["myapex"],
7848 sdk_version: "none",
7849 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007850 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007851 }
7852
7853 java_library {
7854 name: "bar",
7855 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007856 libs: ["foo.impl"],
Paul Duffin9b879592020-05-26 13:21:35 +01007857 apex_available: ["myapex"],
7858 sdk_version: "none",
7859 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007860 compile_dex: true,
Paul Duffin9b879592020-05-26 13:21:35 +01007861 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007862
7863 prebuilt_apis {
7864 name: "sdk",
7865 api_dirs: ["100"],
7866 }
Paul Duffin9b879592020-05-26 13:21:35 +01007867 `, withFiles(filesForSdkLibrary))
7868
7869 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007870 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007871 "javalib/bar.jar",
7872 "javalib/foo.jar",
7873 "etc/permissions/foo.xml",
7874 })
7875
7876 // The bar library should depend on the implementation jar.
7877 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00007878 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007879 t.Errorf("expected %q, found %#q", expected, actual)
7880 }
7881}
7882
7883func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007884 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007885 ctx := testApex(t, `
Paul Duffin9b879592020-05-26 13:21:35 +01007886 apex {
7887 name: "myapex",
7888 key: "myapex.key",
7889 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007890 updatable: false,
Paul Duffin9b879592020-05-26 13:21:35 +01007891 }
7892
7893 apex_key {
7894 name: "myapex.key",
7895 public_key: "testkey.avbpubkey",
7896 private_key: "testkey.pem",
7897 }
7898
7899 java_sdk_library {
7900 name: "foo",
7901 srcs: ["a.java"],
7902 api_packages: ["foo"],
7903 apex_available: ["myapex"],
7904 sdk_version: "none",
7905 system_modules: "none",
7906 }
7907
7908 java_library {
7909 name: "bar",
7910 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007911 libs: ["foo.stubs"],
Paul Duffin9b879592020-05-26 13:21:35 +01007912 sdk_version: "none",
7913 system_modules: "none",
7914 }
Anton Hanssondff2c782020-12-21 17:10:01 +00007915
7916 prebuilt_apis {
7917 name: "sdk",
7918 api_dirs: ["100"],
7919 }
Paul Duffin9b879592020-05-26 13:21:35 +01007920 `, withFiles(filesForSdkLibrary))
7921
7922 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09007923 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffin9b879592020-05-26 13:21:35 +01007924 "javalib/foo.jar",
7925 "etc/permissions/foo.xml",
7926 })
7927
7928 // The bar library should depend on the stubs jar.
7929 barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
Paul Duffincf8d7db2021-03-29 00:29:53 +01007930 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffin9b879592020-05-26 13:21:35 +01007931 t.Errorf("expected %q, found %#q", expected, actual)
7932 }
7933}
7934
Paul Duffineedc5d52020-06-12 17:46:39 +01007935func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07007936 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08007937 ctx := testApex(t, `
Anton Hanssondff2c782020-12-21 17:10:01 +00007938 prebuilt_apis {
7939 name: "sdk",
7940 api_dirs: ["100"],
7941 }`,
Paul Duffineedc5d52020-06-12 17:46:39 +01007942 withFiles(map[string][]byte{
7943 "apex/a.java": nil,
7944 "apex/apex_manifest.json": nil,
7945 "apex/Android.bp": []byte(`
7946 package {
7947 default_visibility: ["//visibility:private"],
7948 }
7949
7950 apex {
7951 name: "myapex",
7952 key: "myapex.key",
7953 java_libs: ["foo", "bar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00007954 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01007955 }
7956
7957 apex_key {
7958 name: "myapex.key",
7959 public_key: "testkey.avbpubkey",
7960 private_key: "testkey.pem",
7961 }
7962
7963 java_library {
7964 name: "bar",
7965 srcs: ["a.java"],
Jihoon Kang28c96572024-09-11 23:44:44 +00007966 libs: ["foo.impl"],
Paul Duffineedc5d52020-06-12 17:46:39 +01007967 apex_available: ["myapex"],
7968 sdk_version: "none",
7969 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08007970 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007971 }
7972`),
7973 "source/a.java": nil,
7974 "source/api/current.txt": nil,
7975 "source/api/removed.txt": nil,
7976 "source/Android.bp": []byte(`
7977 package {
7978 default_visibility: ["//visibility:private"],
7979 }
7980
7981 java_sdk_library {
7982 name: "foo",
7983 visibility: ["//apex"],
7984 srcs: ["a.java"],
7985 api_packages: ["foo"],
7986 apex_available: ["myapex"],
7987 sdk_version: "none",
7988 system_modules: "none",
7989 public: {
7990 enabled: true,
7991 },
Colin Crosse4f34882024-11-14 12:26:00 -08007992 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01007993 }
7994`),
7995 "prebuilt/a.jar": nil,
7996 "prebuilt/Android.bp": []byte(`
7997 package {
7998 default_visibility: ["//visibility:private"],
7999 }
8000
8001 java_sdk_library_import {
8002 name: "foo",
8003 visibility: ["//apex", "//source"],
8004 apex_available: ["myapex"],
8005 prefer: true,
8006 public: {
8007 jars: ["a.jar"],
8008 },
Colin Crosse4f34882024-11-14 12:26:00 -08008009 compile_dex: true,
Paul Duffineedc5d52020-06-12 17:46:39 +01008010 }
8011`),
Anton Hanssondff2c782020-12-21 17:10:01 +00008012 }), withFiles(filesForSdkLibrary),
Paul Duffineedc5d52020-06-12 17:46:39 +01008013 )
8014
8015 // java_sdk_library installs both impl jar and permission XML
Jooyung Hana0503a52023-08-23 13:12:50 +09008016 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Paul Duffineedc5d52020-06-12 17:46:39 +01008017 "javalib/bar.jar",
8018 "javalib/foo.jar",
8019 "etc/permissions/foo.xml",
8020 })
8021
8022 // The bar library should depend on the implementation jar.
8023 barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
Jihoon Kanga3a05462024-04-05 00:36:44 +00008024 if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
Paul Duffineedc5d52020-06-12 17:46:39 +01008025 t.Errorf("expected %q, found %#q", expected, actual)
8026 }
8027}
8028
8029func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008030 t.Parallel()
Paul Duffineedc5d52020-06-12 17:46:39 +01008031 testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
8032 apex {
8033 name: "myapex",
8034 key: "myapex.key",
8035 java_libs: ["foo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008036 updatable: false,
Paul Duffineedc5d52020-06-12 17:46:39 +01008037 }
8038
8039 apex_key {
8040 name: "myapex.key",
8041 public_key: "testkey.avbpubkey",
8042 private_key: "testkey.pem",
8043 }
8044
8045 java_sdk_library_import {
8046 name: "foo",
8047 apex_available: ["myapex"],
8048 prefer: true,
8049 public: {
8050 jars: ["a.jar"],
8051 },
8052 }
8053
8054 `, withFiles(filesForSdkLibrary))
8055}
8056
atrost6e126252020-01-27 17:01:16 +00008057func TestCompatConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008058 t.Parallel()
Paul Duffin284165a2021-03-29 01:50:31 +01008059 result := android.GroupFixturePreparers(
8060 prepareForApexTest,
8061 java.PrepareForTestWithPlatformCompatConfig,
8062 ).RunTestWithBp(t, `
atrost6e126252020-01-27 17:01:16 +00008063 apex {
8064 name: "myapex",
8065 key: "myapex.key",
Paul Duffin3abc1742021-03-15 19:32:23 +00008066 compat_configs: ["myjar-platform-compat-config"],
atrost6e126252020-01-27 17:01:16 +00008067 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008068 updatable: false,
atrost6e126252020-01-27 17:01:16 +00008069 }
8070
8071 apex_key {
8072 name: "myapex.key",
8073 public_key: "testkey.avbpubkey",
8074 private_key: "testkey.pem",
8075 }
8076
8077 platform_compat_config {
8078 name: "myjar-platform-compat-config",
8079 src: ":myjar",
8080 }
8081
8082 java_library {
8083 name: "myjar",
8084 srcs: ["foo/bar/MyClass.java"],
8085 sdk_version: "none",
8086 system_modules: "none",
atrost6e126252020-01-27 17:01:16 +00008087 apex_available: [ "myapex" ],
Colin Crosse4f34882024-11-14 12:26:00 -08008088 compile_dex: true,
atrost6e126252020-01-27 17:01:16 +00008089 }
Paul Duffin1b29e002021-03-16 15:06:54 +00008090
8091 // Make sure that a preferred prebuilt does not affect the apex contents.
8092 prebuilt_platform_compat_config {
8093 name: "myjar-platform-compat-config",
8094 metadata: "compat-config/metadata.xml",
8095 prefer: true,
8096 }
atrost6e126252020-01-27 17:01:16 +00008097 `)
Paul Duffina369c7b2021-03-09 03:08:05 +00008098 ctx := result.TestContext
Jooyung Hana0503a52023-08-23 13:12:50 +09008099 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
atrost6e126252020-01-27 17:01:16 +00008100 "etc/compatconfig/myjar-platform-compat-config.xml",
8101 "javalib/myjar.jar",
8102 })
8103}
8104
Jooyung Han862c0d62022-12-21 10:15:37 +09008105func TestNoDupeApexFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008106 t.Parallel()
Jooyung Han862c0d62022-12-21 10:15:37 +09008107 android.GroupFixturePreparers(
8108 android.PrepareForTestWithAndroidBuildComponents,
8109 PrepareForTestWithApexBuildComponents,
8110 prepareForTestWithMyapex,
8111 prebuilt_etc.PrepareForTestWithPrebuiltEtc,
8112 ).
8113 ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
8114 RunTestWithBp(t, `
8115 apex {
8116 name: "myapex",
8117 key: "myapex.key",
8118 prebuilts: ["foo", "bar"],
8119 updatable: false,
8120 }
8121
8122 apex_key {
8123 name: "myapex.key",
8124 public_key: "testkey.avbpubkey",
8125 private_key: "testkey.pem",
8126 }
8127
8128 prebuilt_etc {
8129 name: "foo",
8130 src: "myprebuilt",
8131 filename_from_src: true,
8132 }
8133
8134 prebuilt_etc {
8135 name: "bar",
8136 src: "myprebuilt",
8137 filename_from_src: true,
8138 }
8139 `)
8140}
8141
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008142func TestApexUnwantedTransitiveDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008143 t.Parallel()
Jooyung Hana8bd72a2023-11-02 11:56:48 +09008144 bp := `
8145 apex {
8146 name: "myapex",
8147 key: "myapex.key",
8148 native_shared_libs: ["libfoo"],
8149 updatable: false,
8150 unwanted_transitive_deps: ["libbar"],
8151 }
8152
8153 apex_key {
8154 name: "myapex.key",
8155 public_key: "testkey.avbpubkey",
8156 private_key: "testkey.pem",
8157 }
8158
8159 cc_library {
8160 name: "libfoo",
8161 srcs: ["foo.cpp"],
8162 shared_libs: ["libbar"],
8163 apex_available: ["myapex"],
8164 }
8165
8166 cc_library {
8167 name: "libbar",
8168 srcs: ["bar.cpp"],
8169 apex_available: ["myapex"],
8170 }`
8171 ctx := testApex(t, bp)
8172 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
8173 "*/libc++.so",
8174 "*/libfoo.so",
8175 // not libbar.so
8176 })
8177}
8178
Jiyong Park479321d2019-12-16 11:47:12 +09008179func TestRejectNonInstallableJavaLibrary(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008180 t.Parallel()
Jiyong Park479321d2019-12-16 11:47:12 +09008181 testApexError(t, `"myjar" is not configured to be compiled into dex`, `
8182 apex {
8183 name: "myapex",
8184 key: "myapex.key",
8185 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008186 updatable: false,
Jiyong Park479321d2019-12-16 11:47:12 +09008187 }
8188
8189 apex_key {
8190 name: "myapex.key",
8191 public_key: "testkey.avbpubkey",
8192 private_key: "testkey.pem",
8193 }
8194
8195 java_library {
8196 name: "myjar",
8197 srcs: ["foo/bar/MyClass.java"],
8198 sdk_version: "none",
8199 system_modules: "none",
Jiyong Park6b21c7d2020-02-11 09:16:01 +09008200 compile_dex: false,
Jooyung Han5e9013b2020-03-10 06:23:13 +09008201 apex_available: ["myapex"],
Jiyong Park479321d2019-12-16 11:47:12 +09008202 }
8203 `)
8204}
8205
Jiyong Park7cd10e32020-01-14 09:22:18 +09008206func TestSymlinksFromApexToSystem(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008207 t.Parallel()
Jiyong Park7cd10e32020-01-14 09:22:18 +09008208 bp := `
8209 apex {
8210 name: "myapex",
8211 key: "myapex.key",
8212 native_shared_libs: ["mylib"],
8213 java_libs: ["myjar"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008214 updatable: false,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008215 }
8216
Jiyong Park9d677202020-02-19 16:29:35 +09008217 apex {
8218 name: "myapex.updatable",
8219 key: "myapex.key",
8220 native_shared_libs: ["mylib"],
8221 java_libs: ["myjar"],
8222 updatable: true,
Spandan Das1a92db52023-04-06 18:55:06 +00008223 min_sdk_version: "33",
Jiyong Park9d677202020-02-19 16:29:35 +09008224 }
8225
Jiyong Park7cd10e32020-01-14 09:22:18 +09008226 apex_key {
8227 name: "myapex.key",
8228 public_key: "testkey.avbpubkey",
8229 private_key: "testkey.pem",
8230 }
8231
8232 cc_library {
8233 name: "mylib",
8234 srcs: ["mylib.cpp"],
Jiyong Parkce243632023-02-17 18:22:25 +09008235 shared_libs: [
8236 "myotherlib",
8237 "myotherlib_ext",
8238 ],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008239 system_shared_libs: [],
8240 stl: "none",
8241 apex_available: [
8242 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008243 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008244 "//apex_available:platform",
8245 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008246 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008247 }
8248
8249 cc_library {
8250 name: "myotherlib",
8251 srcs: ["mylib.cpp"],
8252 system_shared_libs: [],
8253 stl: "none",
8254 apex_available: [
8255 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008256 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008257 "//apex_available:platform",
8258 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008259 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008260 }
8261
Jiyong Parkce243632023-02-17 18:22:25 +09008262 cc_library {
8263 name: "myotherlib_ext",
8264 srcs: ["mylib.cpp"],
8265 system_shared_libs: [],
8266 system_ext_specific: true,
8267 stl: "none",
8268 apex_available: [
8269 "myapex",
8270 "myapex.updatable",
8271 "//apex_available:platform",
8272 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008273 min_sdk_version: "33",
Jiyong Parkce243632023-02-17 18:22:25 +09008274 }
8275
Jiyong Park7cd10e32020-01-14 09:22:18 +09008276 java_library {
8277 name: "myjar",
8278 srcs: ["foo/bar/MyClass.java"],
8279 sdk_version: "none",
8280 system_modules: "none",
Jihoon Kang85bc1932024-07-01 17:04:46 +00008281 static_libs: ["myotherjar"],
Jiyong Park7cd10e32020-01-14 09:22:18 +09008282 apex_available: [
8283 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008284 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008285 "//apex_available:platform",
8286 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008287 min_sdk_version: "33",
Colin Crosse4f34882024-11-14 12:26:00 -08008288 compile_dex: true,
Jiyong Park7cd10e32020-01-14 09:22:18 +09008289 }
8290
8291 java_library {
8292 name: "myotherjar",
8293 srcs: ["foo/bar/MyClass.java"],
8294 sdk_version: "none",
8295 system_modules: "none",
8296 apex_available: [
8297 "myapex",
Jiyong Park9d677202020-02-19 16:29:35 +09008298 "myapex.updatable",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008299 "//apex_available:platform",
8300 ],
Spandan Das1a92db52023-04-06 18:55:06 +00008301 min_sdk_version: "33",
Jiyong Park7cd10e32020-01-14 09:22:18 +09008302 }
8303 `
8304
8305 ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
8306 for _, f := range files {
8307 if f.path == file {
8308 if f.isLink {
8309 t.Errorf("%q is not a real file", file)
8310 }
8311 return
8312 }
8313 }
8314 t.Errorf("%q is not found", file)
8315 }
8316
Jiyong Parkce243632023-02-17 18:22:25 +09008317 ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
Jiyong Park7cd10e32020-01-14 09:22:18 +09008318 for _, f := range files {
8319 if f.path == file {
8320 if !f.isLink {
8321 t.Errorf("%q is not a symlink", file)
8322 }
Jiyong Parkce243632023-02-17 18:22:25 +09008323 if f.src != target {
8324 t.Errorf("expected symlink target to be %q, got %q", target, f.src)
8325 }
Jiyong Park7cd10e32020-01-14 09:22:18 +09008326 return
8327 }
8328 }
8329 t.Errorf("%q is not found", file)
8330 }
8331
Jiyong Park9d677202020-02-19 16:29:35 +09008332 // For unbundled build, symlink shouldn't exist regardless of whether an APEX
8333 // is updatable or not
Colin Cross1c460562021-02-16 17:55:47 -08008334 ctx := testApex(t, bp, withUnbundledBuild)
Jooyung Hana0503a52023-08-23 13:12:50 +09008335 files := getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008336 ensureRealfileExists(t, files, "javalib/myjar.jar")
8337 ensureRealfileExists(t, files, "lib64/mylib.so")
8338 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008339 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008340
Jooyung Hana0503a52023-08-23 13:12:50 +09008341 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008342 ensureRealfileExists(t, files, "javalib/myjar.jar")
8343 ensureRealfileExists(t, files, "lib64/mylib.so")
8344 ensureRealfileExists(t, files, "lib64/myotherlib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008345 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
Jiyong Park9d677202020-02-19 16:29:35 +09008346
8347 // For bundled build, symlink to the system for the non-updatable APEXes only
Colin Cross1c460562021-02-16 17:55:47 -08008348 ctx = testApex(t, bp)
Jooyung Hana0503a52023-08-23 13:12:50 +09008349 files = getFiles(t, ctx, "myapex", "android_common_myapex")
Jiyong Park7cd10e32020-01-14 09:22:18 +09008350 ensureRealfileExists(t, files, "javalib/myjar.jar")
8351 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008352 ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
8353 ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
Jiyong Park9d677202020-02-19 16:29:35 +09008354
Jooyung Hana0503a52023-08-23 13:12:50 +09008355 files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable")
Jiyong Park9d677202020-02-19 16:29:35 +09008356 ensureRealfileExists(t, files, "javalib/myjar.jar")
8357 ensureRealfileExists(t, files, "lib64/mylib.so")
Jiyong Parkce243632023-02-17 18:22:25 +09008358 ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
8359 ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
Jiyong Park7cd10e32020-01-14 09:22:18 +09008360}
8361
Yo Chiange8128052020-07-23 20:09:18 +08008362func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008363 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008364 ctx := testApex(t, `
Yo Chiange8128052020-07-23 20:09:18 +08008365 apex {
8366 name: "myapex",
8367 key: "myapex.key",
8368 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008369 updatable: false,
Yo Chiange8128052020-07-23 20:09:18 +08008370 }
8371
8372 apex_key {
8373 name: "myapex.key",
8374 public_key: "testkey.avbpubkey",
8375 private_key: "testkey.pem",
8376 }
8377
8378 cc_library_shared {
8379 name: "mylib",
8380 srcs: ["mylib.cpp"],
8381 shared_libs: ["myotherlib"],
8382 system_shared_libs: [],
8383 stl: "none",
8384 apex_available: [
8385 "myapex",
8386 "//apex_available:platform",
8387 ],
8388 }
8389
8390 cc_prebuilt_library_shared {
8391 name: "myotherlib",
8392 srcs: ["prebuilt.so"],
8393 system_shared_libs: [],
8394 stl: "none",
8395 apex_available: [
8396 "myapex",
8397 "//apex_available:platform",
8398 ],
8399 }
8400 `)
8401
Jooyung Hana0503a52023-08-23 13:12:50 +09008402 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07008403 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
Yo Chiange8128052020-07-23 20:09:18 +08008404 var builder strings.Builder
8405 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
8406 androidMk := builder.String()
8407 // `myotherlib` is added to `myapex` as symlink
Diwas Sharmabb9202e2023-01-26 18:42:21 +00008408 ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
Yo Chiange8128052020-07-23 20:09:18 +08008409 ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
8410 ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
8411 // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
Jooyung Haneec1b3f2023-06-20 16:25:59 +09008412 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64\n")
Yo Chiange8128052020-07-23 20:09:18 +08008413}
8414
Jooyung Han643adc42020-02-27 13:50:06 +09008415func TestApexWithJniLibs(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008416 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008417 ctx := testApex(t, `
Jooyung Han643adc42020-02-27 13:50:06 +09008418 apex {
8419 name: "myapex",
8420 key: "myapex.key",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008421 binaries: ["mybin"],
8422 jni_libs: ["mylib", "mylib3", "libfoo.rust"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008423 updatable: false,
Jooyung Han643adc42020-02-27 13:50:06 +09008424 }
8425
8426 apex_key {
8427 name: "myapex.key",
8428 public_key: "testkey.avbpubkey",
8429 private_key: "testkey.pem",
8430 }
8431
8432 cc_library {
8433 name: "mylib",
8434 srcs: ["mylib.cpp"],
8435 shared_libs: ["mylib2"],
8436 system_shared_libs: [],
8437 stl: "none",
8438 apex_available: [ "myapex" ],
8439 }
8440
8441 cc_library {
8442 name: "mylib2",
8443 srcs: ["mylib.cpp"],
8444 system_shared_libs: [],
8445 stl: "none",
8446 apex_available: [ "myapex" ],
8447 }
Jiyong Park34d5c332022-02-24 18:02:44 +09008448
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008449 // Used as both a JNI library and a regular shared library.
8450 cc_library {
8451 name: "mylib3",
8452 srcs: ["mylib.cpp"],
8453 system_shared_libs: [],
8454 stl: "none",
8455 apex_available: [ "myapex" ],
8456 }
8457
8458 cc_binary {
8459 name: "mybin",
8460 srcs: ["mybin.cpp"],
8461 shared_libs: ["mylib3"],
8462 system_shared_libs: [],
8463 stl: "none",
8464 apex_available: [ "myapex" ],
8465 }
8466
Jiyong Park34d5c332022-02-24 18:02:44 +09008467 rust_ffi_shared {
8468 name: "libfoo.rust",
8469 crate_name: "foo",
8470 srcs: ["foo.rs"],
8471 shared_libs: ["libfoo.shared_from_rust"],
8472 prefer_rlib: true,
8473 apex_available: ["myapex"],
8474 }
8475
8476 cc_library_shared {
8477 name: "libfoo.shared_from_rust",
8478 srcs: ["mylib.cpp"],
8479 system_shared_libs: [],
8480 stl: "none",
8481 stubs: {
8482 versions: ["10", "11", "12"],
8483 },
8484 }
8485
Jooyung Han643adc42020-02-27 13:50:06 +09008486 `)
8487
Jooyung Hana0503a52023-08-23 13:12:50 +09008488 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexManifestRule")
Jooyung Han643adc42020-02-27 13:50:06 +09008489 // Notice mylib2.so (transitive dep) is not added as a jni_lib
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008490 ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so mylib3.so")
Jooyung Hana0503a52023-08-23 13:12:50 +09008491 ensureExactContents(t, ctx, "myapex", "android_common_myapex", []string{
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008492 "bin/mybin",
Jooyung Han643adc42020-02-27 13:50:06 +09008493 "lib64/mylib.so",
8494 "lib64/mylib2.so",
Jiakai Zhang9c60c172023-09-05 15:19:21 +01008495 "lib64/mylib3.so",
Jiyong Park34d5c332022-02-24 18:02:44 +09008496 "lib64/libfoo.rust.so",
Jooyung Han643adc42020-02-27 13:50:06 +09008497 })
Jiyong Park34d5c332022-02-24 18:02:44 +09008498
8499 // b/220397949
8500 ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
Jooyung Han643adc42020-02-27 13:50:06 +09008501}
8502
Jooyung Han49f67012020-04-17 13:43:10 +09008503func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008504 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008505 ctx := testApex(t, `
Jooyung Han49f67012020-04-17 13:43:10 +09008506 apex {
8507 name: "myapex",
8508 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008509 updatable: false,
Jooyung Han49f67012020-04-17 13:43:10 +09008510 }
8511 apex_key {
8512 name: "myapex.key",
8513 public_key: "testkey.avbpubkey",
8514 private_key: "testkey.pem",
8515 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00008516 `,
8517 android.FixtureModifyConfig(func(config android.Config) {
8518 delete(config.Targets, android.Android)
8519 config.AndroidCommonTarget = android.Target{}
8520 }),
8521 )
Jooyung Han49f67012020-04-17 13:43:10 +09008522
8523 if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
8524 t.Errorf("Expected variants: %v, but got: %v", expected, got)
8525 }
8526}
8527
Jiyong Parkbd159612020-02-28 15:22:21 +09008528func TestAppBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008529 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008530 ctx := testApex(t, `
Jiyong Parkbd159612020-02-28 15:22:21 +09008531 apex {
8532 name: "myapex",
8533 key: "myapex.key",
8534 apps: ["AppFoo"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008535 updatable: false,
Jiyong Parkbd159612020-02-28 15:22:21 +09008536 }
8537
8538 apex_key {
8539 name: "myapex.key",
8540 public_key: "testkey.avbpubkey",
8541 private_key: "testkey.pem",
8542 }
8543
8544 android_app {
8545 name: "AppFoo",
8546 srcs: ["foo/bar/MyClass.java"],
8547 sdk_version: "none",
8548 system_modules: "none",
8549 apex_available: [ "myapex" ],
8550 }
Jiyong Parkcfaa1642020-02-28 16:51:07 +09008551 `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
Jiyong Parkbd159612020-02-28 15:22:21 +09008552
Jooyung Hana0503a52023-08-23 13:12:50 +09008553 bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex").Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008554 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Jiyong Parkbd159612020-02-28 15:22:21 +09008555
8556 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008557 ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
Jiyong Parkbd159612020-02-28 15:22:21 +09008558}
8559
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008560func TestAppSetBundle(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008561 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08008562 ctx := testApex(t, `
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008563 apex {
8564 name: "myapex",
8565 key: "myapex.key",
8566 apps: ["AppSet"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008567 updatable: false,
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008568 }
8569
8570 apex_key {
8571 name: "myapex.key",
8572 public_key: "testkey.avbpubkey",
8573 private_key: "testkey.pem",
8574 }
8575
8576 android_app_set {
8577 name: "AppSet",
8578 set: "AppSet.apks",
8579 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +09008580 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crosscf371cc2020-11-13 11:48:42 -08008581 bundleConfigRule := mod.Output("bundle_config.json")
Colin Crossf61d03d2023-11-02 16:56:39 -07008582 content := android.ContentFromFileRuleForTests(t, ctx, bundleConfigRule)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008583 ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
8584 s := mod.Rule("apexRule").Args["copy_commands"]
8585 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Jiyong Park4169a252022-09-29 21:30:25 +09008586 if len(copyCmds) != 4 {
8587 t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008588 }
Oriol Prieto Gasco17e22902022-05-05 13:52:25 +00008589 ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
8590 ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
Jiyong Park4169a252022-09-29 21:30:25 +09008591 ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
8592 ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
Jiyong Parke1b69142022-09-26 14:48:56 +09008593
8594 // Ensure that canned_fs_config has an entry for the app set zip file
8595 generateFsRule := mod.Rule("generateFsConfig")
8596 cmd := generateFsRule.RuleParams.Command
8597 ensureContains(t, cmd, "AppSet.zip")
Sasha Smundak18d98bc2020-05-27 16:36:07 -07008598}
8599
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008600func TestAppSetBundlePrebuilt(t *testing.T) {
Paul Duffin24704672021-04-06 16:09:30 +01008601 bp := `
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008602 apex_set {
8603 name: "myapex",
8604 filename: "foo_v2.apex",
8605 sanitized: {
8606 none: { set: "myapex.apks", },
8607 hwaddress: { set: "myapex.hwasan.apks", },
8608 },
Paul Duffin24704672021-04-06 16:09:30 +01008609 }
8610 `
8611 ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008612
Paul Duffin24704672021-04-06 16:09:30 +01008613 // Check that the extractor produces the correct output file from the correct input file.
Spandan Das9d6e2092024-09-21 02:50:00 +00008614 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.hwasan.apks"
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008615
Spandan Das9d6e2092024-09-21 02:50:00 +00008616 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Paul Duffin24704672021-04-06 16:09:30 +01008617 extractedApex := m.Output(extractorOutput)
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008618
Paul Duffin24704672021-04-06 16:09:30 +01008619 android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
8620
8621 // Ditto for the apex.
Paul Duffin6717d882021-06-15 19:09:41 +01008622 m = ctx.ModuleForTests("myapex", "android_common_myapex")
8623 copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
Paul Duffin24704672021-04-06 16:09:30 +01008624
8625 android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
Evgenii Stepanov2080bfe2020-07-24 15:35:40 -07008626}
8627
Pranav Guptaeba03b02022-09-27 00:27:08 +00008628func TestApexSetApksModuleAssignment(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008629 t.Parallel()
Pranav Guptaeba03b02022-09-27 00:27:08 +00008630 ctx := testApex(t, `
8631 apex_set {
8632 name: "myapex",
8633 set: ":myapex_apks_file",
8634 }
8635
8636 filegroup {
8637 name: "myapex_apks_file",
8638 srcs: ["myapex.apks"],
8639 }
8640 `)
8641
Spandan Das9d6e2092024-09-21 02:50:00 +00008642 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Pranav Guptaeba03b02022-09-27 00:27:08 +00008643
8644 // Check that the extractor produces the correct apks file from the input module
Spandan Das9d6e2092024-09-21 02:50:00 +00008645 extractorOutput := "out/soong/.intermediates/myapex/android_common_myapex/extracted/myapex.apks"
Pranav Guptaeba03b02022-09-27 00:27:08 +00008646 extractedApex := m.Output(extractorOutput)
8647
8648 android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
8649}
8650
Paul Duffin89f570a2021-06-16 01:42:33 +01008651func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
Paul Duffinc3bbb962020-12-10 19:15:49 +00008652 t.Helper()
8653
Paul Duffin55607122021-03-30 23:32:51 +01008654 fs := android.MockFS{
8655 "a.java": nil,
8656 "a.jar": nil,
8657 "apex_manifest.json": nil,
8658 "AndroidManifest.xml": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008659 "system/sepolicy/apex/myapex-file_contexts": nil,
Paul Duffind376f792021-01-26 11:59:35 +00008660 "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
8661 "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
8662 "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
Martin Stjernholm1dc0d6d2021-01-17 21:05:12 +00008663 "framework/aidl/a.aidl": nil,
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008664 }
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008665
Paul Duffin55607122021-03-30 23:32:51 +01008666 errorHandler := android.FixtureExpectsNoErrors
8667 if errmsg != "" {
8668 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008669 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008670
Paul Duffin55607122021-03-30 23:32:51 +01008671 result := android.GroupFixturePreparers(
8672 cc.PrepareForTestWithCcDefaultModules,
8673 java.PrepareForTestWithHiddenApiBuildComponents,
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008674 java.PrepareForTestWithDexpreopt,
Paul Duffin55607122021-03-30 23:32:51 +01008675 java.PrepareForTestWithJavaSdkLibraryFiles,
8676 PrepareForTestWithApexBuildComponents,
Paul Duffin60264a02021-04-12 20:02:36 +01008677 preparer,
Paul Duffin55607122021-03-30 23:32:51 +01008678 fs.AddToFixture(),
Paul Duffin89f570a2021-06-16 01:42:33 +01008679 android.FixtureModifyMockFS(func(fs android.MockFS) {
8680 if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
8681 insert := ""
8682 for _, fragment := range fragments {
8683 insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
8684 }
8685 fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
8686 platform_bootclasspath {
8687 name: "platform-bootclasspath",
8688 fragments: [
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008689 {apex: "com.android.art", module: "art-bootclasspath-fragment"},
Paul Duffin89f570a2021-06-16 01:42:33 +01008690 %s
8691 ],
8692 }
8693 `, insert))
Paul Duffin8f146b92021-04-12 17:24:18 +01008694 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008695 }),
Jiakai Zhangb69e8952023-07-11 14:31:22 +01008696 // Dexpreopt for boot jars requires the ART boot image profile.
8697 java.PrepareApexBootJarModule("com.android.art", "core-oj"),
8698 dexpreopt.FixtureSetArtBootJars("com.android.art:core-oj"),
Jiakai Zhang49b1eb62021-11-26 18:09:27 +00008699 dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
Paul Duffin55607122021-03-30 23:32:51 +01008700 ).
8701 ExtendWithErrorHandler(errorHandler).
8702 RunTestWithBp(t, bp)
8703
8704 return result.TestContext
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008705}
8706
Jooyung Han548640b2020-04-27 12:10:30 +09008707func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008708 t.Parallel()
Jooyung Han548640b2020-04-27 12:10:30 +09008709 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8710 apex {
8711 name: "myapex",
8712 key: "myapex.key",
8713 updatable: true,
8714 }
8715
8716 apex_key {
8717 name: "myapex.key",
8718 public_key: "testkey.avbpubkey",
8719 private_key: "testkey.pem",
8720 }
8721 `)
8722}
8723
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008724func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008725 t.Parallel()
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008726 testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
8727 apex {
8728 name: "myapex",
8729 key: "myapex.key",
8730 }
8731
8732 apex_key {
8733 name: "myapex.key",
8734 public_key: "testkey.avbpubkey",
8735 private_key: "testkey.pem",
8736 }
8737 `)
8738}
8739
satayevb98371c2021-06-15 16:49:50 +01008740func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008741 t.Parallel()
satayevb98371c2021-06-15 16:49:50 +01008742 testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
8743 apex {
8744 name: "myapex",
8745 key: "myapex.key",
8746 systemserverclasspath_fragments: [
8747 "mysystemserverclasspathfragment",
8748 ],
8749 min_sdk_version: "29",
8750 updatable: true,
8751 }
8752
8753 apex_key {
8754 name: "myapex.key",
8755 public_key: "testkey.avbpubkey",
8756 private_key: "testkey.pem",
8757 }
8758
8759 java_library {
8760 name: "foo",
8761 srcs: ["b.java"],
8762 min_sdk_version: "29",
8763 installable: true,
8764 apex_available: [
8765 "myapex",
8766 ],
Jihoon Kang85bc1932024-07-01 17:04:46 +00008767 sdk_version: "current",
satayevb98371c2021-06-15 16:49:50 +01008768 }
8769
8770 systemserverclasspath_fragment {
8771 name: "mysystemserverclasspathfragment",
8772 generate_classpaths_proto: false,
8773 contents: [
8774 "foo",
8775 ],
8776 apex_available: [
8777 "myapex",
8778 ],
8779 }
satayevabcd5972021-08-06 17:49:46 +01008780 `,
8781 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
8782 )
satayevb98371c2021-06-15 16:49:50 +01008783}
8784
Paul Duffin064b70c2020-11-02 17:32:38 +00008785func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008786 t.Parallel()
satayevabcd5972021-08-06 17:49:46 +01008787 preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
Paul Duffin064b70c2020-11-02 17:32:38 +00008788 t.Run("prebuilt no source", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008789 t.Parallel()
Paul Duffin89f570a2021-06-16 01:42:33 +01008790 fragment := java.ApexVariantReference{
8791 Apex: proptools.StringPtr("myapex"),
8792 Module: proptools.StringPtr("my-bootclasspath-fragment"),
8793 }
8794
Paul Duffin064b70c2020-11-02 17:32:38 +00008795 testDexpreoptWithApexes(t, `
8796 prebuilt_apex {
8797 name: "myapex" ,
8798 arch: {
8799 arm64: {
8800 src: "myapex-arm64.apex",
8801 },
8802 arm: {
8803 src: "myapex-arm.apex",
8804 },
8805 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008806 exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
8807 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008808
Paul Duffin89f570a2021-06-16 01:42:33 +01008809 prebuilt_bootclasspath_fragment {
8810 name: "my-bootclasspath-fragment",
8811 contents: ["libfoo"],
8812 apex_available: ["myapex"],
Paul Duffin54e41972021-07-19 13:23:40 +01008813 hidden_api: {
8814 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
8815 metadata: "my-bootclasspath-fragment/metadata.csv",
8816 index: "my-bootclasspath-fragment/index.csv",
Paul Duffin191be3a2021-08-10 16:14:16 +01008817 signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
8818 filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
8819 filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
Paul Duffin54e41972021-07-19 13:23:40 +01008820 },
Paul Duffin89f570a2021-06-16 01:42:33 +01008821 }
Paul Duffin064b70c2020-11-02 17:32:38 +00008822
Spandan Das52c01a12024-09-20 01:09:48 +00008823 java_sdk_library_import {
8824 name: "libfoo",
8825 prefer: true,
8826 public: {
Paul Duffin89f570a2021-06-16 01:42:33 +01008827 jars: ["libfoo.jar"],
Spandan Das52c01a12024-09-20 01:09:48 +00008828 },
8829 apex_available: ["myapex"],
8830 shared_library: false,
8831 permitted_packages: ["libfoo"],
8832 }
Paul Duffin89f570a2021-06-16 01:42:33 +01008833 `, "", preparer, fragment)
Paul Duffin064b70c2020-11-02 17:32:38 +00008834 })
Ulya Trafimovichb28cc372020-01-13 15:18:16 +00008835}
8836
Spandan Dasf14e2542021-11-12 00:01:37 +00008837func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
Andrei Onea115e7e72020-06-05 21:14:03 +01008838 t.Helper()
Andrei Onea115e7e72020-06-05 21:14:03 +01008839 bp += `
8840 apex_key {
8841 name: "myapex.key",
8842 public_key: "testkey.avbpubkey",
8843 private_key: "testkey.pem",
8844 }`
Paul Duffin45338f02021-03-30 23:07:52 +01008845 fs := android.MockFS{
Andrei Onea115e7e72020-06-05 21:14:03 +01008846 "lib1/src/A.java": nil,
8847 "lib2/src/B.java": nil,
8848 "system/sepolicy/apex/myapex-file_contexts": nil,
8849 }
8850
Paul Duffin45338f02021-03-30 23:07:52 +01008851 errorHandler := android.FixtureExpectsNoErrors
8852 if errmsg != "" {
8853 errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
Colin Crossae8600b2020-10-29 17:09:13 -07008854 }
Colin Crossae8600b2020-10-29 17:09:13 -07008855
Paul Duffin45338f02021-03-30 23:07:52 +01008856 android.GroupFixturePreparers(
8857 android.PrepareForTestWithAndroidBuildComponents,
8858 java.PrepareForTestWithJavaBuildComponents,
8859 PrepareForTestWithApexBuildComponents,
8860 android.PrepareForTestWithNeverallowRules(rules),
8861 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
satayevd604b212021-07-21 14:23:52 +01008862 apexBootJars := make([]string, 0, len(bootJars))
8863 for _, apexBootJar := range bootJars {
8864 apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
Paul Duffin45338f02021-03-30 23:07:52 +01008865 }
satayevd604b212021-07-21 14:23:52 +01008866 variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
Paul Duffin45338f02021-03-30 23:07:52 +01008867 }),
8868 fs.AddToFixture(),
8869 ).
8870 ExtendWithErrorHandler(errorHandler).
8871 RunTestWithBp(t, bp)
Andrei Onea115e7e72020-06-05 21:14:03 +01008872}
8873
8874func TestApexPermittedPackagesRules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07008875 t.Parallel()
Andrei Onea115e7e72020-06-05 21:14:03 +01008876 testcases := []struct {
Spandan Dasf14e2542021-11-12 00:01:37 +00008877 name string
8878 expectedError string
8879 bp string
8880 bootJars []string
8881 bcpPermittedPackages map[string][]string
Andrei Onea115e7e72020-06-05 21:14:03 +01008882 }{
8883
8884 {
8885 name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
8886 expectedError: "",
8887 bp: `
8888 java_library {
8889 name: "bcp_lib1",
8890 srcs: ["lib1/src/*.java"],
8891 permitted_packages: ["foo.bar"],
8892 apex_available: ["myapex"],
8893 sdk_version: "none",
8894 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008895 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008896 }
8897 java_library {
8898 name: "nonbcp_lib2",
8899 srcs: ["lib2/src/*.java"],
8900 apex_available: ["myapex"],
8901 permitted_packages: ["a.b"],
8902 sdk_version: "none",
8903 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008904 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008905 }
8906 apex {
8907 name: "myapex",
8908 key: "myapex.key",
8909 java_libs: ["bcp_lib1", "nonbcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008910 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008911 }`,
8912 bootJars: []string{"bcp_lib1"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008913 bcpPermittedPackages: map[string][]string{
8914 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008915 "foo.bar",
8916 },
8917 },
8918 },
8919 {
Anton Hanssone1b18362021-12-23 15:05:38 +00008920 name: "Bootclasspath apex jar not satisfying allowed module packages.",
Spandan Dasf14e2542021-11-12 00:01:37 +00008921 expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
Andrei Onea115e7e72020-06-05 21:14:03 +01008922 bp: `
8923 java_library {
8924 name: "bcp_lib1",
8925 srcs: ["lib1/src/*.java"],
8926 apex_available: ["myapex"],
8927 permitted_packages: ["foo.bar"],
8928 sdk_version: "none",
8929 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008930 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008931 }
8932 java_library {
8933 name: "bcp_lib2",
8934 srcs: ["lib2/src/*.java"],
8935 apex_available: ["myapex"],
8936 permitted_packages: ["foo.bar", "bar.baz"],
8937 sdk_version: "none",
8938 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008939 compile_dex: true,
Andrei Onea115e7e72020-06-05 21:14:03 +01008940 }
8941 apex {
8942 name: "myapex",
8943 key: "myapex.key",
8944 java_libs: ["bcp_lib1", "bcp_lib2"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00008945 updatable: false,
Andrei Onea115e7e72020-06-05 21:14:03 +01008946 }
8947 `,
8948 bootJars: []string{"bcp_lib1", "bcp_lib2"},
Spandan Dasf14e2542021-11-12 00:01:37 +00008949 bcpPermittedPackages: map[string][]string{
8950 "bcp_lib1": []string{
Andrei Onea115e7e72020-06-05 21:14:03 +01008951 "foo.bar",
8952 },
Spandan Dasf14e2542021-11-12 00:01:37 +00008953 "bcp_lib2": []string{
8954 "foo.bar",
8955 },
8956 },
8957 },
8958 {
8959 name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
8960 expectedError: "",
8961 bp: `
8962 java_library {
8963 name: "bcp_lib_restricted",
8964 srcs: ["lib1/src/*.java"],
8965 apex_available: ["myapex"],
8966 permitted_packages: ["foo.bar"],
8967 sdk_version: "none",
8968 min_sdk_version: "29",
8969 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008970 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008971 }
8972 java_library {
8973 name: "bcp_lib_unrestricted",
8974 srcs: ["lib2/src/*.java"],
8975 apex_available: ["myapex"],
8976 permitted_packages: ["foo.bar", "bar.baz"],
8977 sdk_version: "none",
8978 min_sdk_version: "29",
8979 system_modules: "none",
Colin Crosse4f34882024-11-14 12:26:00 -08008980 compile_dex: true,
Spandan Dasf14e2542021-11-12 00:01:37 +00008981 }
8982 apex {
8983 name: "myapex",
8984 key: "myapex.key",
8985 java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
8986 updatable: true,
8987 min_sdk_version: "29",
8988 }
8989 `,
8990 bootJars: []string{"bcp_lib1", "bcp_lib2"},
8991 bcpPermittedPackages: map[string][]string{
8992 "bcp_lib1_non_updateable": []string{
8993 "foo.bar",
8994 },
8995 // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
Andrei Onea115e7e72020-06-05 21:14:03 +01008996 },
8997 },
8998 }
8999 for _, tc := range testcases {
9000 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009001 t.Parallel()
Spandan Dasf14e2542021-11-12 00:01:37 +00009002 rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
9003 testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
Andrei Onea115e7e72020-06-05 21:14:03 +01009004 })
9005 }
9006}
9007
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009008// TODO(jungjw): Move this to proptools
9009func intPtr(i int) *int {
9010 return &i
9011}
9012
9013func TestApexSet(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009014 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009015 ctx := testApex(t, `
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009016 apex_set {
9017 name: "myapex",
9018 set: "myapex.apks",
9019 filename: "foo_v2.apex",
9020 overrides: ["foo"],
9021 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009022 `,
9023 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9024 variables.Platform_sdk_version = intPtr(30)
9025 }),
9026 android.FixtureModifyConfig(func(config android.Config) {
9027 config.Targets[android.Android] = []android.Target{
9028 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
9029 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
9030 }
9031 }),
9032 )
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009033
Spandan Das9d6e2092024-09-21 02:50:00 +00009034 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009035
9036 // Check extract_apks tool parameters.
Paul Duffin24704672021-04-06 16:09:30 +01009037 extractedApex := m.Output("extracted/myapex.apks")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009038 actual := extractedApex.Args["abis"]
9039 expected := "ARMEABI_V7A,ARM64_V8A"
9040 if actual != expected {
9041 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9042 }
9043 actual = extractedApex.Args["sdk-version"]
9044 expected = "30"
9045 if actual != expected {
9046 t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
9047 }
9048
Paul Duffin6717d882021-06-15 19:09:41 +01009049 m = ctx.ModuleForTests("myapex", "android_common_myapex")
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009050 a := m.Module().(*ApexSet)
9051 expectedOverrides := []string{"foo"}
Colin Crossaa255532020-07-03 13:18:24 -07009052 actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
Jaewoong Jungfa00c062020-05-14 14:15:24 -07009053 if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
9054 t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
9055 }
9056}
9057
Anton Hansson805e0a52022-11-25 14:06:46 +00009058func TestApexSet_NativeBridge(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009059 t.Parallel()
Anton Hansson805e0a52022-11-25 14:06:46 +00009060 ctx := testApex(t, `
9061 apex_set {
9062 name: "myapex",
9063 set: "myapex.apks",
9064 filename: "foo_v2.apex",
9065 overrides: ["foo"],
9066 }
9067 `,
9068 android.FixtureModifyConfig(func(config android.Config) {
9069 config.Targets[android.Android] = []android.Target{
9070 {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
9071 {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
9072 }
9073 }),
9074 )
9075
Spandan Das9d6e2092024-09-21 02:50:00 +00009076 m := ctx.ModuleForTests("myapex", "android_common_myapex")
Anton Hansson805e0a52022-11-25 14:06:46 +00009077
9078 // Check extract_apks tool parameters. No native bridge arch expected
9079 extractedApex := m.Output("extracted/myapex.apks")
9080 android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
9081}
9082
Jiyong Park7d95a512020-05-10 15:16:24 +09009083func TestNoStaticLinkingToStubsLib(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009084 t.Parallel()
Jiyong Park7d95a512020-05-10 15:16:24 +09009085 testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
9086 apex {
9087 name: "myapex",
9088 key: "myapex.key",
9089 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009090 updatable: false,
Jiyong Park7d95a512020-05-10 15:16:24 +09009091 }
9092
9093 apex_key {
9094 name: "myapex.key",
9095 public_key: "testkey.avbpubkey",
9096 private_key: "testkey.pem",
9097 }
9098
9099 cc_library {
9100 name: "mylib",
9101 srcs: ["mylib.cpp"],
9102 static_libs: ["otherlib"],
9103 system_shared_libs: [],
9104 stl: "none",
9105 apex_available: [ "myapex" ],
9106 }
9107
9108 cc_library {
9109 name: "otherlib",
9110 srcs: ["mylib.cpp"],
9111 system_shared_libs: [],
9112 stl: "none",
9113 stubs: {
9114 versions: ["1", "2", "3"],
9115 },
9116 apex_available: [ "myapex" ],
9117 }
9118 `)
9119}
9120
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009121func TestApexKeysTxt(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009122 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009123 ctx := testApex(t, `
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009124 apex {
9125 name: "myapex",
9126 key: "myapex.key",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009127 updatable: false,
Jooyung Han09c11ad2021-10-27 03:45:31 +09009128 custom_sign_tool: "sign_myapex",
9129 }
9130
9131 apex_key {
9132 name: "myapex.key",
9133 public_key: "testkey.avbpubkey",
9134 private_key: "testkey.pem",
9135 }
9136 `)
9137
Jooyung Han286957d2023-10-30 16:17:56 +09009138 myapex := ctx.ModuleForTests("myapex", "android_common_myapex")
Colin Crossf61d03d2023-11-02 16:56:39 -07009139 content := android.ContentFromFileRuleForTests(t, ctx, myapex.Output("apexkeys.txt"))
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009140 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Jooyung Han09c11ad2021-10-27 03:45:31 +09009141}
9142
9143func TestApexKeysTxtOverrides(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009144 t.Parallel()
Jooyung Han09c11ad2021-10-27 03:45:31 +09009145 ctx := testApex(t, `
9146 apex {
9147 name: "myapex",
9148 key: "myapex.key",
9149 updatable: false,
9150 custom_sign_tool: "sign_myapex",
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009151 }
9152
9153 apex_key {
9154 name: "myapex.key",
9155 public_key: "testkey.avbpubkey",
9156 private_key: "testkey.pem",
9157 }
9158
9159 prebuilt_apex {
9160 name: "myapex",
9161 prefer: true,
9162 arch: {
9163 arm64: {
9164 src: "myapex-arm64.apex",
9165 },
9166 arm: {
9167 src: "myapex-arm.apex",
9168 },
9169 },
9170 }
9171
9172 apex_set {
9173 name: "myapex_set",
9174 set: "myapex.apks",
9175 filename: "myapex_set.apex",
9176 overrides: ["myapex"],
9177 }
9178 `)
9179
Colin Crossf61d03d2023-11-02 16:56:39 -07009180 content := android.ContentFromFileRuleForTests(t, ctx,
9181 ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt"))
Jooyung Han286957d2023-10-30 16:17:56 +09009182 ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`)
Colin Crossf61d03d2023-11-02 16:56:39 -07009183 content = android.ContentFromFileRuleForTests(t, ctx,
9184 ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt"))
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009185 ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
Jiyong Park8d6c51e2020-06-12 17:26:31 +09009186}
9187
Jooyung Han938b5932020-06-20 12:47:47 +09009188func TestAllowedFiles(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009189 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009190 ctx := testApex(t, `
Jooyung Han938b5932020-06-20 12:47:47 +09009191 apex {
9192 name: "myapex",
9193 key: "myapex.key",
9194 apps: ["app"],
9195 allowed_files: "allowed.txt",
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009196 updatable: false,
Jooyung Han938b5932020-06-20 12:47:47 +09009197 }
9198
9199 apex_key {
9200 name: "myapex.key",
9201 public_key: "testkey.avbpubkey",
9202 private_key: "testkey.pem",
9203 }
9204
9205 android_app {
9206 name: "app",
9207 srcs: ["foo/bar/MyClass.java"],
9208 package_name: "foo",
9209 sdk_version: "none",
9210 system_modules: "none",
9211 apex_available: [ "myapex" ],
9212 }
9213 `, withFiles(map[string][]byte{
9214 "sub/Android.bp": []byte(`
9215 override_apex {
9216 name: "override_myapex",
9217 base: "myapex",
9218 apps: ["override_app"],
9219 allowed_files: ":allowed",
9220 }
9221 // Overridable "path" property should be referenced indirectly
9222 filegroup {
9223 name: "allowed",
9224 srcs: ["allowed.txt"],
9225 }
9226 override_android_app {
9227 name: "override_app",
9228 base: "app",
9229 package_name: "bar",
9230 }
9231 `),
9232 }))
9233
Jooyung Hana0503a52023-08-23 13:12:50 +09009234 rule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009235 if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
9236 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9237 }
9238
Spandan Das50801e22024-05-13 18:29:45 +00009239 rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_override_myapex").Rule("diffApexContentRule")
Jooyung Han938b5932020-06-20 12:47:47 +09009240 if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
9241 t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
9242 }
9243}
9244
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009245func TestNonPreferredPrebuiltDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009246 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009247 testApex(t, `
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009248 apex {
9249 name: "myapex",
9250 key: "myapex.key",
9251 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009252 updatable: false,
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009253 }
9254
9255 apex_key {
9256 name: "myapex.key",
9257 public_key: "testkey.avbpubkey",
9258 private_key: "testkey.pem",
9259 }
9260
9261 cc_library {
9262 name: "mylib",
9263 srcs: ["mylib.cpp"],
9264 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009265 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009266 },
9267 apex_available: ["myapex"],
9268 }
9269
9270 cc_prebuilt_library_shared {
9271 name: "mylib",
9272 prefer: false,
9273 srcs: ["prebuilt.so"],
9274 stubs: {
Dan Albertc8060532020-07-22 22:32:17 -07009275 versions: ["current"],
Martin Stjernholm58c33f02020-07-06 22:56:01 +01009276 },
9277 apex_available: ["myapex"],
9278 }
9279 `)
9280}
9281
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009282func TestCompressedApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009283 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009284 ctx := testApex(t, `
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009285 apex {
9286 name: "myapex",
9287 key: "myapex.key",
9288 compressible: true,
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009289 updatable: false,
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009290 }
9291 apex_key {
9292 name: "myapex.key",
9293 public_key: "testkey.avbpubkey",
9294 private_key: "testkey.pem",
9295 }
Paul Duffin0a49fdc2021-03-08 11:28:25 +00009296 `,
9297 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9298 variables.CompressedApex = proptools.BoolPtr(true)
9299 }),
9300 )
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009301
Jooyung Hana0503a52023-08-23 13:12:50 +09009302 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("compressRule")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009303 ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
9304
Jooyung Hana0503a52023-08-23 13:12:50 +09009305 signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex").Description("sign compressedApex")
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009306 ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
9307
9308 // Make sure output of bundle is .capex
Jooyung Hana0503a52023-08-23 13:12:50 +09009309 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009310 ensureContains(t, ab.outputFile.String(), "myapex.capex")
9311
9312 // Verify android.mk rules
Colin Crossaa255532020-07-03 13:18:24 -07009313 data := android.AndroidMkDataForTest(t, ctx, ab)
Mohammad Samiul Islam3cd005d2020-11-26 13:32:26 +00009314 var builder strings.Builder
9315 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9316 androidMk := builder.String()
9317 ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
9318}
9319
Jooyung Hana8fb73b2024-11-25 16:51:25 +09009320func TestCompressedApexIsDisabledWhenUsingErofs(t *testing.T) {
9321 t.Parallel()
9322 ctx := testApex(t, `
9323 apex {
9324 name: "myapex",
9325 key: "myapex.key",
9326 compressible: true,
9327 updatable: false,
9328 payload_fs_type: "erofs",
9329 }
9330 apex_key {
9331 name: "myapex.key",
9332 public_key: "testkey.avbpubkey",
9333 private_key: "testkey.pem",
9334 }
9335 `,
9336 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9337 variables.CompressedApex = proptools.BoolPtr(true)
9338 }),
9339 )
9340
9341 compressRule := ctx.ModuleForTests("myapex", "android_common_myapex").MaybeRule("compressRule")
9342 if compressRule.Rule != nil {
9343 t.Error("erofs apex should not be compressed")
9344 }
9345}
9346
Jooyung Han26ec8482024-07-31 15:04:05 +09009347func TestApexSet_ShouldRespectCompressedApexFlag(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009348 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009349 for _, compressionEnabled := range []bool{true, false} {
9350 t.Run(fmt.Sprintf("compressionEnabled=%v", compressionEnabled), func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009351 t.Parallel()
Jooyung Han26ec8482024-07-31 15:04:05 +09009352 ctx := testApex(t, `
9353 apex_set {
9354 name: "com.company.android.myapex",
9355 apex_name: "com.android.myapex",
9356 set: "company-myapex.apks",
9357 }
9358 `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9359 variables.CompressedApex = proptools.BoolPtr(compressionEnabled)
9360 }),
9361 )
9362
9363 build := ctx.ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex").Output("com.company.android.myapex.apex")
9364 if compressionEnabled {
9365 ensureEquals(t, build.Rule.String(), "android/soong/android.Cp")
9366 } else {
9367 ensureEquals(t, build.Rule.String(), "android/apex.decompressApex")
9368 }
9369 })
9370 }
9371}
9372
Martin Stjernholm2856c662020-12-02 15:03:42 +00009373func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009374 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009375 ctx := testApex(t, `
Martin Stjernholm2856c662020-12-02 15:03:42 +00009376 apex {
9377 name: "myapex",
9378 key: "myapex.key",
9379 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009380 updatable: false,
Martin Stjernholm2856c662020-12-02 15:03:42 +00009381 }
9382
9383 apex_key {
9384 name: "myapex.key",
9385 public_key: "testkey.avbpubkey",
9386 private_key: "testkey.pem",
9387 }
9388
9389 cc_library {
9390 name: "mylib",
9391 srcs: ["mylib.cpp"],
9392 apex_available: ["myapex"],
9393 shared_libs: ["otherlib"],
9394 system_shared_libs: [],
9395 }
9396
9397 cc_library {
9398 name: "otherlib",
9399 srcs: ["mylib.cpp"],
9400 stubs: {
9401 versions: ["current"],
9402 },
9403 }
9404
9405 cc_prebuilt_library_shared {
9406 name: "otherlib",
9407 prefer: true,
9408 srcs: ["prebuilt.so"],
9409 stubs: {
9410 versions: ["current"],
9411 },
9412 }
9413 `)
9414
Jooyung Hana0503a52023-08-23 13:12:50 +09009415 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Colin Crossaa255532020-07-03 13:18:24 -07009416 data := android.AndroidMkDataForTest(t, ctx, ab)
Martin Stjernholm2856c662020-12-02 15:03:42 +00009417 var builder strings.Builder
9418 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
9419 androidMk := builder.String()
9420
9421 // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
9422 // a thing there.
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009423 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 otherlib\n")
Martin Stjernholm2856c662020-12-02 15:03:42 +00009424}
9425
Jiyong Parke3867542020-12-03 17:28:25 +09009426func TestExcludeDependency(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009427 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009428 ctx := testApex(t, `
Jiyong Parke3867542020-12-03 17:28:25 +09009429 apex {
9430 name: "myapex",
9431 key: "myapex.key",
9432 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009433 updatable: false,
Jiyong Parke3867542020-12-03 17:28:25 +09009434 }
9435
9436 apex_key {
9437 name: "myapex.key",
9438 public_key: "testkey.avbpubkey",
9439 private_key: "testkey.pem",
9440 }
9441
9442 cc_library {
9443 name: "mylib",
9444 srcs: ["mylib.cpp"],
9445 system_shared_libs: [],
9446 stl: "none",
9447 apex_available: ["myapex"],
9448 shared_libs: ["mylib2"],
9449 target: {
9450 apex: {
9451 exclude_shared_libs: ["mylib2"],
9452 },
9453 },
9454 }
9455
9456 cc_library {
9457 name: "mylib2",
9458 srcs: ["mylib.cpp"],
9459 system_shared_libs: [],
9460 stl: "none",
9461 }
9462 `)
9463
9464 // Check if mylib is linked to mylib2 for the non-apex target
9465 ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
9466 ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
9467
9468 // Make sure that the link doesn't occur for the apex target
9469 ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
9470 ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
9471
9472 // It shouldn't appear in the copy cmd as well.
Jooyung Hana0503a52023-08-23 13:12:50 +09009473 copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex").Rule("apexRule").Args["copy_commands"]
Jiyong Parke3867542020-12-03 17:28:25 +09009474 ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
9475}
9476
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009477func TestPrebuiltStubLibDep(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009478 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009479 bpBase := `
9480 apex {
9481 name: "myapex",
9482 key: "myapex.key",
9483 native_shared_libs: ["mylib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009484 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009485 }
9486 apex_key {
9487 name: "myapex.key",
9488 public_key: "testkey.avbpubkey",
9489 private_key: "testkey.pem",
9490 }
9491 cc_library {
9492 name: "mylib",
9493 srcs: ["mylib.cpp"],
9494 apex_available: ["myapex"],
9495 shared_libs: ["stublib"],
9496 system_shared_libs: [],
9497 }
9498 apex {
9499 name: "otherapex",
9500 enabled: %s,
9501 key: "myapex.key",
9502 native_shared_libs: ["stublib"],
Mathew Inwoodf8dcf5e2021-02-16 11:40:16 +00009503 updatable: false,
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009504 }
9505 `
9506
9507 stublibSourceBp := `
9508 cc_library {
9509 name: "stublib",
9510 srcs: ["mylib.cpp"],
9511 apex_available: ["otherapex"],
9512 system_shared_libs: [],
9513 stl: "none",
9514 stubs: {
9515 versions: ["1"],
9516 },
9517 }
9518 `
9519
9520 stublibPrebuiltBp := `
9521 cc_prebuilt_library_shared {
9522 name: "stublib",
9523 srcs: ["prebuilt.so"],
9524 apex_available: ["otherapex"],
9525 stubs: {
9526 versions: ["1"],
9527 },
9528 %s
9529 }
9530 `
9531
9532 tests := []struct {
9533 name string
9534 stublibBp string
9535 usePrebuilt bool
9536 modNames []string // Modules to collect AndroidMkEntries for
9537 otherApexEnabled []string
9538 }{
9539 {
9540 name: "only_source",
9541 stublibBp: stublibSourceBp,
9542 usePrebuilt: false,
9543 modNames: []string{"stublib"},
9544 otherApexEnabled: []string{"true", "false"},
9545 },
9546 {
9547 name: "source_preferred",
9548 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
9549 usePrebuilt: false,
9550 modNames: []string{"stublib", "prebuilt_stublib"},
9551 otherApexEnabled: []string{"true", "false"},
9552 },
9553 {
9554 name: "prebuilt_preferred",
9555 stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
9556 usePrebuilt: true,
9557 modNames: []string{"stublib", "prebuilt_stublib"},
9558 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9559 },
9560 {
9561 name: "only_prebuilt",
9562 stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
9563 usePrebuilt: true,
9564 modNames: []string{"stublib"},
9565 otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
9566 },
9567 }
9568
9569 for _, test := range tests {
9570 t.Run(test.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009571 t.Parallel()
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009572 for _, otherApexEnabled := range test.otherApexEnabled {
9573 t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009574 t.Parallel()
Colin Cross1c460562021-02-16 17:55:47 -08009575 ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009576
9577 type modAndMkEntries struct {
9578 mod *cc.Module
Yu Liue70976d2024-10-15 20:45:35 +00009579 mkEntries android.AndroidMkInfo
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009580 }
9581 entries := []*modAndMkEntries{}
9582
9583 // Gather shared lib modules that are installable
9584 for _, modName := range test.modNames {
9585 for _, variant := range ctx.ModuleVariantsForTests(modName) {
9586 if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
9587 continue
9588 }
9589 mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
Cole Fausta963b942024-04-11 17:43:00 -07009590 if !mod.Enabled(android.PanickingConfigAndErrorContext(ctx)) || mod.IsHideFromMake() {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009591 continue
9592 }
Yu Liue70976d2024-10-15 20:45:35 +00009593 info := android.AndroidMkInfoForTest(t, ctx, mod)
9594 ents := []android.AndroidMkInfo{info.PrimaryInfo}
9595 ents = append(ents, info.ExtraInfo...)
9596 for _, ent := range ents {
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009597 if ent.Disabled {
9598 continue
9599 }
9600 entries = append(entries, &modAndMkEntries{
9601 mod: mod,
9602 mkEntries: ent,
9603 })
9604 }
9605 }
9606 }
9607
9608 var entry *modAndMkEntries = nil
9609 for _, ent := range entries {
9610 if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
9611 if entry != nil {
9612 t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
9613 } else {
9614 entry = ent
9615 }
9616 }
9617 }
9618
9619 if entry == nil {
9620 t.Errorf("AndroidMk entry for \"stublib\" missing")
9621 } else {
9622 isPrebuilt := entry.mod.Prebuilt() != nil
9623 if isPrebuilt != test.usePrebuilt {
9624 t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
9625 }
9626 if !entry.mod.IsStubs() {
9627 t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
9628 }
9629 if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
9630 t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
9631 }
Jiyong Park892a98f2020-12-14 09:20:00 +09009632 cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
Jiyong Parkd4a3a132021-03-17 20:21:35 +09009633 expected := "-D__STUBLIB_API__=10000"
Jiyong Park892a98f2020-12-14 09:20:00 +09009634 if !android.InList(expected, cflags) {
9635 t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
9636 }
Jiyong Parkf7c3bbe2020-12-09 21:18:56 +09009637 }
9638 })
9639 }
9640 })
9641 }
9642}
9643
Colin Crossc33e5212021-05-25 18:16:02 -07009644func TestApexJavaCoverage(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009645 t.Parallel()
Colin Crossc33e5212021-05-25 18:16:02 -07009646 bp := `
9647 apex {
9648 name: "myapex",
9649 key: "myapex.key",
9650 java_libs: ["mylib"],
9651 bootclasspath_fragments: ["mybootclasspathfragment"],
9652 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
9653 updatable: false,
9654 }
9655
9656 apex_key {
9657 name: "myapex.key",
9658 public_key: "testkey.avbpubkey",
9659 private_key: "testkey.pem",
9660 }
9661
9662 java_library {
9663 name: "mylib",
9664 srcs: ["mylib.java"],
9665 apex_available: ["myapex"],
9666 compile_dex: true,
9667 }
9668
9669 bootclasspath_fragment {
9670 name: "mybootclasspathfragment",
9671 contents: ["mybootclasspathlib"],
9672 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009673 hidden_api: {
9674 split_packages: ["*"],
9675 },
Colin Crossc33e5212021-05-25 18:16:02 -07009676 }
9677
9678 java_library {
9679 name: "mybootclasspathlib",
9680 srcs: ["mybootclasspathlib.java"],
9681 apex_available: ["myapex"],
9682 compile_dex: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +00009683 sdk_version: "current",
Colin Crossc33e5212021-05-25 18:16:02 -07009684 }
9685
9686 systemserverclasspath_fragment {
9687 name: "mysystemserverclasspathfragment",
9688 contents: ["mysystemserverclasspathlib"],
9689 apex_available: ["myapex"],
9690 }
9691
9692 java_library {
9693 name: "mysystemserverclasspathlib",
9694 srcs: ["mysystemserverclasspathlib.java"],
9695 apex_available: ["myapex"],
9696 compile_dex: true,
9697 }
9698 `
9699
9700 result := android.GroupFixturePreparers(
9701 PrepareForTestWithApexBuildComponents,
9702 prepareForTestWithMyapex,
9703 java.PrepareForTestWithJavaDefaultModules,
9704 android.PrepareForTestWithAndroidBuildComponents,
9705 android.FixtureWithRootAndroidBp(bp),
satayevabcd5972021-08-06 17:49:46 +01009706 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9707 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
Sam Delmerico1e3f78f2022-09-07 12:07:07 -04009708 java.PrepareForTestWithJacocoInstrumentation,
Colin Crossc33e5212021-05-25 18:16:02 -07009709 ).RunTest(t)
9710
9711 // Make sure jacoco ran on both mylib and mybootclasspathlib
9712 if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9713 t.Errorf("Failed to find jacoco rule for mylib")
9714 }
9715 if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9716 t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
9717 }
9718 if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
9719 t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
9720 }
9721}
9722
Jiyong Park192600a2021-08-03 07:52:17 +00009723func TestProhibitStaticExecutable(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009724 t.Parallel()
Jiyong Park192600a2021-08-03 07:52:17 +00009725 testApexError(t, `executable mybin is static`, `
9726 apex {
9727 name: "myapex",
9728 key: "myapex.key",
9729 binaries: ["mybin"],
9730 min_sdk_version: "29",
9731 }
9732
9733 apex_key {
9734 name: "myapex.key",
9735 public_key: "testkey.avbpubkey",
9736 private_key: "testkey.pem",
9737 }
9738
9739 cc_binary {
9740 name: "mybin",
9741 srcs: ["mylib.cpp"],
9742 relative_install_path: "foo/bar",
9743 static_executable: true,
9744 system_shared_libs: [],
9745 stl: "none",
9746 apex_available: [ "myapex" ],
Jiyong Parkd12979d2021-08-03 13:36:09 +09009747 min_sdk_version: "29",
9748 }
9749 `)
9750
9751 testApexError(t, `executable mybin.rust is static`, `
9752 apex {
9753 name: "myapex",
9754 key: "myapex.key",
9755 binaries: ["mybin.rust"],
9756 min_sdk_version: "29",
9757 }
9758
9759 apex_key {
9760 name: "myapex.key",
9761 public_key: "testkey.avbpubkey",
9762 private_key: "testkey.pem",
9763 }
9764
9765 rust_binary {
9766 name: "mybin.rust",
9767 srcs: ["foo.rs"],
9768 static_executable: true,
9769 apex_available: ["myapex"],
9770 min_sdk_version: "29",
Jiyong Park192600a2021-08-03 07:52:17 +00009771 }
9772 `)
9773}
9774
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009775func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009776 t.Parallel()
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009777 ctx := testApex(t, `
9778 apex {
9779 name: "myapex",
9780 key: "myapex.key",
9781 updatable: false,
9782 java_libs: ["foo"],
9783 }
9784
9785 apex_key {
9786 name: "myapex.key",
9787 public_key: "testkey.avbpubkey",
9788 private_key: "testkey.pem",
9789 }
9790
9791 java_library {
9792 name: "foo",
9793 srcs: ["foo.java"],
9794 apex_available: ["myapex"],
9795 installable: true,
9796 }
9797 `,
9798 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
9799 )
9800
Jooyung Hana0503a52023-08-23 13:12:50 +09009801 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009802 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9803 var builder strings.Builder
9804 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9805 androidMk := builder.String()
Colin Cross388c6612025-01-28 14:00:12 -08009806 out := ctx.Config().OutDir()
9807 ensureContains(t, androidMk, "LOCAL_SOONG_INSTALL_PAIRS += "+
9808 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.odex")+
9809 ":"+
9810 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.odex")+
9811 " "+
9812 filepath.Join(out, "soong/.intermediates/foo/android_common_apex10000/dexpreopt/foo/oat/arm64/javalib.vdex")+
9813 ":"+
9814 filepath.Join(out, "target/product/test_device/system/framework/oat/arm64/apex@myapex@javalib@foo.jar@classes.vdex")+
9815 "\n")
Jiakai Zhang470b7e22021-09-30 09:34:26 +00009816}
9817
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009818func TestAndroidMk_RequiredModules(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009819 t.Parallel()
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009820 ctx := testApex(t, `
9821 apex {
9822 name: "myapex",
9823 key: "myapex.key",
9824 updatable: false,
9825 java_libs: ["foo"],
9826 required: ["otherapex"],
9827 }
9828
9829 apex {
9830 name: "otherapex",
9831 key: "myapex.key",
9832 updatable: false,
9833 java_libs: ["foo"],
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009834 }
9835
9836 apex_key {
9837 name: "myapex.key",
9838 public_key: "testkey.avbpubkey",
9839 private_key: "testkey.pem",
9840 }
9841
9842 java_library {
9843 name: "foo",
9844 srcs: ["foo.java"],
9845 apex_available: ["myapex", "otherapex"],
9846 installable: true,
9847 }
9848 `)
9849
Jooyung Hana0503a52023-08-23 13:12:50 +09009850 apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009851 data := android.AndroidMkDataForTest(t, ctx, apexBundle)
9852 var builder strings.Builder
9853 data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
9854 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009855 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex otherapex")
Jiyong Parkcacc4f32021-10-28 14:26:03 +09009856}
9857
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009858func TestAndroidMk_RequiredDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009859 t.Parallel()
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009860 ctx := testApex(t, `
9861 apex {
9862 name: "myapex",
9863 key: "myapex.key",
9864 updatable: false,
9865 }
9866
9867 apex_key {
9868 name: "myapex.key",
9869 public_key: "testkey.avbpubkey",
9870 private_key: "testkey.pem",
9871 }
9872 `)
9873
Jooyung Hana0503a52023-08-23 13:12:50 +09009874 bundle := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
Jingwen Chen29743c82023-01-25 17:49:46 +00009875 bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009876 data := android.AndroidMkDataForTest(t, ctx, bundle)
9877 var builder strings.Builder
9878 data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
9879 androidMk := builder.String()
Jooyung Haneec1b3f2023-06-20 16:25:59 +09009880 ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo\n")
Jiakai Zhangd70dff72022-02-24 15:06:05 +00009881}
9882
Jooyung Hana6d36672022-02-24 13:58:07 +09009883func TestApexOutputFileProducer(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009884 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009885 for _, tc := range []struct {
9886 name string
9887 ref string
9888 expected_data []string
9889 }{
9890 {
9891 name: "test_using_output",
9892 ref: ":myapex",
Jooyung Hana0503a52023-08-23 13:12:50 +09009893 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.capex:myapex.capex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009894 },
9895 {
9896 name: "test_using_apex",
9897 ref: ":myapex{.apex}",
Jooyung Hana0503a52023-08-23 13:12:50 +09009898 expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex/myapex.apex:myapex.apex"},
Jooyung Hana6d36672022-02-24 13:58:07 +09009899 },
9900 } {
9901 t.Run(tc.name, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009902 t.Parallel()
Jooyung Hana6d36672022-02-24 13:58:07 +09009903 ctx := testApex(t, `
9904 apex {
9905 name: "myapex",
9906 key: "myapex.key",
9907 compressible: true,
9908 updatable: false,
9909 }
9910
9911 apex_key {
9912 name: "myapex.key",
9913 public_key: "testkey.avbpubkey",
9914 private_key: "testkey.pem",
9915 }
9916
9917 java_test {
9918 name: "`+tc.name+`",
9919 srcs: ["a.java"],
9920 data: ["`+tc.ref+`"],
9921 }
9922 `,
9923 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
9924 variables.CompressedApex = proptools.BoolPtr(true)
9925 }))
9926 javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
9927 data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
9928 android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
9929 })
9930 }
9931}
9932
satayev758968a2021-12-06 11:42:40 +00009933func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009934 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009935 preparer := android.GroupFixturePreparers(
9936 PrepareForTestWithApexBuildComponents,
9937 prepareForTestWithMyapex,
9938 java.PrepareForTestWithJavaSdkLibraryFiles,
9939 java.PrepareForTestWithJavaDefaultModules,
9940 android.PrepareForTestWithAndroidBuildComponents,
9941 dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
9942 dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
9943 )
9944
9945 // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
9946 t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -07009947 t.Parallel()
satayev758968a2021-12-06 11:42:40 +00009948 preparer.RunTestWithBp(t, `
9949 apex {
9950 name: "myapex",
9951 key: "myapex.key",
9952 bootclasspath_fragments: ["mybootclasspathfragment"],
9953 min_sdk_version: "30",
9954 updatable: false,
9955 }
9956
9957 apex_key {
9958 name: "myapex.key",
9959 public_key: "testkey.avbpubkey",
9960 private_key: "testkey.pem",
9961 }
9962
9963 bootclasspath_fragment {
9964 name: "mybootclasspathfragment",
9965 contents: ["mybootclasspathlib"],
9966 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +01009967 hidden_api: {
9968 split_packages: ["*"],
9969 },
satayev758968a2021-12-06 11:42:40 +00009970 }
9971
9972 java_sdk_library {
9973 name: "mybootclasspathlib",
9974 srcs: ["mybootclasspathlib.java"],
9975 apex_available: ["myapex"],
9976 compile_dex: true,
9977 unsafe_ignore_missing_latest_api: true,
9978 min_sdk_version: "31",
9979 static_libs: ["util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009980 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009981 }
9982
9983 java_library {
9984 name: "util",
9985 srcs: ["a.java"],
9986 apex_available: ["myapex"],
9987 min_sdk_version: "31",
9988 static_libs: ["another_util"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009989 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009990 }
9991
9992 java_library {
9993 name: "another_util",
9994 srcs: ["a.java"],
9995 min_sdk_version: "31",
9996 apex_available: ["myapex"],
Jihoon Kang85bc1932024-07-01 17:04:46 +00009997 sdk_version: "core_current",
satayev758968a2021-12-06 11:42:40 +00009998 }
9999 `)
10000 })
10001
10002 // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
10003 t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010004 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010005 preparer.RunTestWithBp(t, `
10006 apex {
10007 name: "myapex",
10008 key: "myapex.key",
10009 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10010 min_sdk_version: "30",
10011 updatable: false,
10012 }
10013
10014 apex_key {
10015 name: "myapex.key",
10016 public_key: "testkey.avbpubkey",
10017 private_key: "testkey.pem",
10018 }
10019
10020 systemserverclasspath_fragment {
10021 name: "mysystemserverclasspathfragment",
10022 contents: ["mysystemserverclasspathlib"],
10023 apex_available: ["myapex"],
10024 }
10025
10026 java_sdk_library {
10027 name: "mysystemserverclasspathlib",
10028 srcs: ["mysystemserverclasspathlib.java"],
10029 apex_available: ["myapex"],
10030 compile_dex: true,
10031 min_sdk_version: "32",
10032 unsafe_ignore_missing_latest_api: true,
10033 static_libs: ["util"],
10034 }
10035
10036 java_library {
10037 name: "util",
10038 srcs: ["a.java"],
10039 apex_available: ["myapex"],
10040 min_sdk_version: "31",
10041 static_libs: ["another_util"],
10042 }
10043
10044 java_library {
10045 name: "another_util",
10046 srcs: ["a.java"],
10047 min_sdk_version: "31",
10048 apex_available: ["myapex"],
10049 }
10050 `)
10051 })
10052
10053 t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010054 t.Parallel()
Jihoon Kang85bc1932024-07-01 17:04:46 +000010055 preparer.
satayev758968a2021-12-06 11:42:40 +000010056 RunTestWithBp(t, `
10057 apex {
10058 name: "myapex",
10059 key: "myapex.key",
10060 bootclasspath_fragments: ["mybootclasspathfragment"],
10061 min_sdk_version: "30",
10062 updatable: false,
10063 }
10064
10065 apex_key {
10066 name: "myapex.key",
10067 public_key: "testkey.avbpubkey",
10068 private_key: "testkey.pem",
10069 }
10070
10071 bootclasspath_fragment {
10072 name: "mybootclasspathfragment",
10073 contents: ["mybootclasspathlib"],
10074 apex_available: ["myapex"],
Paul Duffin9fd56472022-03-31 15:42:30 +010010075 hidden_api: {
10076 split_packages: ["*"],
10077 },
satayev758968a2021-12-06 11:42:40 +000010078 }
10079
10080 java_sdk_library {
10081 name: "mybootclasspathlib",
10082 srcs: ["mybootclasspathlib.java"],
10083 apex_available: ["myapex"],
10084 compile_dex: true,
10085 unsafe_ignore_missing_latest_api: true,
Jihoon Kang85bc1932024-07-01 17:04:46 +000010086 sdk_version: "current",
10087 min_sdk_version: "30",
satayev758968a2021-12-06 11:42:40 +000010088 }
10089 `)
10090 })
10091
10092 t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010093 t.Parallel()
satayev758968a2021-12-06 11:42:40 +000010094 preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
10095 RunTestWithBp(t, `
10096 apex {
10097 name: "myapex",
10098 key: "myapex.key",
10099 systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
10100 min_sdk_version: "30",
10101 updatable: false,
10102 }
10103
10104 apex_key {
10105 name: "myapex.key",
10106 public_key: "testkey.avbpubkey",
10107 private_key: "testkey.pem",
10108 }
10109
10110 systemserverclasspath_fragment {
10111 name: "mysystemserverclasspathfragment",
10112 contents: ["mysystemserverclasspathlib"],
10113 apex_available: ["myapex"],
10114 }
10115
10116 java_sdk_library {
10117 name: "mysystemserverclasspathlib",
10118 srcs: ["mysystemserverclasspathlib.java"],
10119 apex_available: ["myapex"],
10120 compile_dex: true,
10121 unsafe_ignore_missing_latest_api: true,
10122 }
10123 `)
10124 })
10125}
10126
Jiakai Zhang6decef92022-01-12 17:56:19 +000010127// Verifies that the APEX depends on all the Make modules in the list.
10128func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10129 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10130 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010131 android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010132 }
10133}
10134
10135// Verifies that the APEX does not depend on any of the Make modules in the list.
10136func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
10137 a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
10138 for _, dep := range deps {
Jingwen Chen29743c82023-01-25 17:49:46 +000010139 android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
Jiakai Zhang6decef92022-01-12 17:56:19 +000010140 }
10141}
10142
Cole Faust24e25c02024-01-19 14:12:17 -080010143func TestApexStrictUpdtabilityLint(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010144 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010145 bpTemplate := `
10146 apex {
10147 name: "myapex",
10148 key: "myapex.key",
10149 java_libs: ["myjavalib"],
10150 updatable: %v,
10151 min_sdk_version: "29",
10152 }
10153 apex_key {
10154 name: "myapex.key",
10155 }
10156 java_library {
10157 name: "myjavalib",
10158 srcs: ["MyClass.java"],
10159 apex_available: [ "myapex" ],
10160 lint: {
10161 strict_updatability_linting: %v,
10162 %s
10163 },
10164 sdk_version: "current",
10165 min_sdk_version: "29",
Colin Crosse4f34882024-11-14 12:26:00 -080010166 compile_dex: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010167 }
10168 `
10169 fs := android.MockFS{
10170 "lint-baseline.xml": nil,
10171 }
10172
10173 testCases := []struct {
Colin Cross87427352024-09-25 15:41:19 -070010174 testCaseName string
10175 apexUpdatable bool
10176 javaStrictUpdtabilityLint bool
10177 lintFileExists bool
10178 disallowedFlagExpectedOnApex bool
10179 disallowedFlagExpectedOnJavalib bool
Cole Faust24e25c02024-01-19 14:12:17 -080010180 }{
10181 {
Colin Cross87427352024-09-25 15:41:19 -070010182 testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
10183 apexUpdatable: true,
10184 javaStrictUpdtabilityLint: true,
10185 lintFileExists: false,
10186 disallowedFlagExpectedOnApex: false,
10187 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010188 },
10189 {
Colin Cross87427352024-09-25 15:41:19 -070010190 testCaseName: "non-updatable apex respects strict_updatability of javalib",
10191 apexUpdatable: false,
10192 javaStrictUpdtabilityLint: false,
10193 lintFileExists: true,
10194 disallowedFlagExpectedOnApex: false,
10195 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010196 },
10197 {
Colin Cross87427352024-09-25 15:41:19 -070010198 testCaseName: "non-updatable apex respects strict updatability of javalib",
10199 apexUpdatable: false,
10200 javaStrictUpdtabilityLint: true,
10201 lintFileExists: true,
10202 disallowedFlagExpectedOnApex: false,
10203 disallowedFlagExpectedOnJavalib: true,
Cole Faust24e25c02024-01-19 14:12:17 -080010204 },
10205 {
Colin Cross87427352024-09-25 15:41:19 -070010206 testCaseName: "updatable apex checks strict updatability of javalib",
10207 apexUpdatable: true,
10208 javaStrictUpdtabilityLint: false,
10209 lintFileExists: true,
10210 disallowedFlagExpectedOnApex: true,
10211 disallowedFlagExpectedOnJavalib: false,
Cole Faust24e25c02024-01-19 14:12:17 -080010212 },
10213 }
10214
10215 for _, testCase := range testCases {
Colin Cross87427352024-09-25 15:41:19 -070010216 t.Run(testCase.testCaseName, func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010217 t.Parallel()
Colin Cross87427352024-09-25 15:41:19 -070010218 fixtures := []android.FixturePreparer{}
10219 baselineProperty := ""
10220 if testCase.lintFileExists {
10221 fixtures = append(fixtures, fs.AddToFixture())
10222 baselineProperty = "baseline_filename: \"lint-baseline.xml\""
10223 }
10224 bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint, baselineProperty)
Cole Faust24e25c02024-01-19 14:12:17 -080010225
Colin Cross87427352024-09-25 15:41:19 -070010226 result := testApex(t, bp, fixtures...)
Cole Faust24e25c02024-01-19 14:12:17 -080010227
Colin Cross87427352024-09-25 15:41:19 -070010228 checkModule := func(m android.TestingBuildParams, name string, expectStrictUpdatability bool) {
10229 if expectStrictUpdatability {
10230 if m.Rule == nil {
10231 t.Errorf("expected strict updatability check rule on %s", name)
10232 } else {
10233 android.AssertStringDoesContain(t, fmt.Sprintf("strict updatability check rule for %s", name),
10234 m.RuleParams.Command, "--disallowed_issues NewApi")
10235 android.AssertStringListContains(t, fmt.Sprintf("strict updatability check baselines for %s", name),
10236 m.Inputs.Strings(), "lint-baseline.xml")
10237 }
10238 } else {
10239 if m.Rule != nil {
10240 t.Errorf("expected no strict updatability check rule on %s", name)
10241 }
10242 }
10243 }
10244
10245 myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
10246 apex := result.ModuleForTests("myapex", "android_common_myapex")
10247 apexStrictUpdatabilityCheck := apex.MaybeOutput("lint_strict_updatability_check.stamp")
10248 javalibStrictUpdatabilityCheck := myjavalib.MaybeOutput("lint_strict_updatability_check.stamp")
10249
10250 checkModule(apexStrictUpdatabilityCheck, "myapex", testCase.disallowedFlagExpectedOnApex)
10251 checkModule(javalibStrictUpdatabilityCheck, "myjavalib", testCase.disallowedFlagExpectedOnJavalib)
10252 })
Cole Faust24e25c02024-01-19 14:12:17 -080010253 }
10254}
10255
Cole Faust24e25c02024-01-19 14:12:17 -080010256// checks transtive deps of an apex coming from bootclasspath_fragment
10257func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010258 t.Parallel()
Cole Faust24e25c02024-01-19 14:12:17 -080010259 bp := `
10260 apex {
10261 name: "myapex",
10262 key: "myapex.key",
10263 bootclasspath_fragments: ["mybootclasspathfragment"],
10264 updatable: true,
10265 min_sdk_version: "29",
10266 }
10267 apex_key {
10268 name: "myapex.key",
10269 }
10270 bootclasspath_fragment {
10271 name: "mybootclasspathfragment",
10272 contents: ["myjavalib"],
10273 apex_available: ["myapex"],
10274 hidden_api: {
10275 split_packages: ["*"],
10276 },
10277 }
10278 java_library {
10279 name: "myjavalib",
10280 srcs: ["MyClass.java"],
10281 apex_available: [ "myapex" ],
10282 sdk_version: "current",
10283 min_sdk_version: "29",
10284 compile_dex: true,
10285 lint: {
10286 baseline_filename: "lint-baseline.xml",
10287 }
10288 }
10289 `
10290 fs := android.MockFS{
10291 "lint-baseline.xml": nil,
10292 }
10293
10294 result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
Colin Cross87427352024-09-25 15:41:19 -070010295 apex := result.ModuleForTests("myapex", "android_common_myapex")
10296 apexStrictUpdatabilityCheck := apex.Output("lint_strict_updatability_check.stamp")
10297 android.AssertStringDoesContain(t, "strict updatability check rule for myapex",
10298 apexStrictUpdatabilityCheck.RuleParams.Command, "--disallowed_issues NewApi")
10299 android.AssertStringListContains(t, "strict updatability check baselines for myapex",
10300 apexStrictUpdatabilityCheck.Inputs.Strings(), "lint-baseline.xml")
Cole Faust24e25c02024-01-19 14:12:17 -080010301}
Spandan Das66773252022-01-15 00:23:18 +000010302
Jihoon Kang784c0052024-06-25 22:15:39 +000010303func TestApexLintBcpFragmentSdkLibDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010304 t.Parallel()
Jihoon Kang784c0052024-06-25 22:15:39 +000010305 bp := `
10306 apex {
10307 name: "myapex",
10308 key: "myapex.key",
10309 bootclasspath_fragments: ["mybootclasspathfragment"],
10310 min_sdk_version: "29",
Jihoon Kang85bc1932024-07-01 17:04:46 +000010311 java_libs: [
10312 "jacocoagent",
10313 ],
Jihoon Kang784c0052024-06-25 22:15:39 +000010314 }
10315 apex_key {
10316 name: "myapex.key",
10317 }
10318 bootclasspath_fragment {
10319 name: "mybootclasspathfragment",
10320 contents: ["foo"],
10321 apex_available: ["myapex"],
10322 hidden_api: {
10323 split_packages: ["*"],
10324 },
10325 }
10326 java_sdk_library {
10327 name: "foo",
10328 srcs: ["MyClass.java"],
10329 apex_available: [ "myapex" ],
10330 sdk_version: "current",
10331 min_sdk_version: "29",
10332 compile_dex: true,
10333 }
10334 `
10335 fs := android.MockFS{
10336 "lint-baseline.xml": nil,
10337 }
10338
10339 result := android.GroupFixturePreparers(
10340 prepareForApexTest,
10341 java.PrepareForTestWithJavaSdkLibraryFiles,
10342 java.PrepareForTestWithJacocoInstrumentation,
10343 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang784c0052024-06-25 22:15:39 +000010344 android.FixtureMergeMockFs(fs),
10345 ).RunTestWithBp(t, bp)
10346
10347 myapex := result.ModuleForTests("myapex", "android_common_myapex")
10348 lintReportInputs := strings.Join(myapex.Output("lint-report-xml.zip").Inputs.Strings(), " ")
10349 android.AssertStringDoesContain(t,
10350 "myapex lint report expected to contain that of the sdk library impl lib as an input",
10351 lintReportInputs, "foo.impl")
10352}
10353
Spandan Das42e89502022-05-06 22:12:55 +000010354// updatable apexes should propagate updatable=true to its apps
10355func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010356 t.Parallel()
Spandan Das42e89502022-05-06 22:12:55 +000010357 bp := `
10358 apex {
10359 name: "myapex",
10360 key: "myapex.key",
Colin Cross99939e92024-10-01 16:02:46 -070010361 updatable: true,
Spandan Das42e89502022-05-06 22:12:55 +000010362 apps: [
10363 "myapp",
10364 ],
10365 min_sdk_version: "30",
10366 }
10367 apex_key {
10368 name: "myapex.key",
10369 }
10370 android_app {
10371 name: "myapp",
Spandan Das42e89502022-05-06 22:12:55 +000010372 apex_available: [
10373 "myapex",
10374 ],
10375 sdk_version: "current",
10376 min_sdk_version: "30",
10377 }
10378 `
Colin Cross99939e92024-10-01 16:02:46 -070010379 _ = android.GroupFixturePreparers(
10380 prepareForApexTest,
10381 ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern("app dependency myapp must have updatable: true")).
10382 RunTestWithBp(t, bp)
Spandan Das42e89502022-05-06 22:12:55 +000010383}
10384
Jingwen Chendea7a642023-03-28 11:30:50 +000010385func TestCannedFsConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010386 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010387 ctx := testApex(t, `
10388 apex {
10389 name: "myapex",
10390 key: "myapex.key",
10391 updatable: false,
10392 }
10393
10394 apex_key {
10395 name: "myapex.key",
10396 public_key: "testkey.avbpubkey",
10397 private_key: "testkey.pem",
10398 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010399 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010400 generateFsRule := mod.Rule("generateFsConfig")
10401 cmd := generateFsRule.RuleParams.Command
10402
10403 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
10404}
10405
10406func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010407 t.Parallel()
Jingwen Chendea7a642023-03-28 11:30:50 +000010408 ctx := testApex(t, `
10409 apex {
10410 name: "myapex",
10411 key: "myapex.key",
10412 canned_fs_config: "my_config",
10413 updatable: false,
10414 }
10415
10416 apex_key {
10417 name: "myapex.key",
10418 public_key: "testkey.avbpubkey",
10419 private_key: "testkey.pem",
10420 }`)
Jooyung Hana0503a52023-08-23 13:12:50 +090010421 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
Jingwen Chendea7a642023-03-28 11:30:50 +000010422 generateFsRule := mod.Rule("generateFsConfig")
10423 cmd := generateFsRule.RuleParams.Command
10424
10425 // Ensure that canned_fs_config has "cat my_config" at the end
10426 ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
10427}
Spandan Das20fce2d2023-04-12 17:21:39 +000010428
10429func TestStubLibrariesMultipleApexViolation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010430 t.Parallel()
Spandan Das20fce2d2023-04-12 17:21:39 +000010431 testCases := []struct {
10432 desc string
10433 hasStubs bool
10434 apexAvailable string
10435 expectedError string
10436 }{
10437 {
10438 desc: "non-stub library can have multiple apex_available",
10439 hasStubs: false,
10440 apexAvailable: `["myapex", "otherapex"]`,
10441 },
10442 {
10443 desc: "stub library should not be available to anyapex",
10444 hasStubs: true,
10445 apexAvailable: `["//apex_available:anyapex"]`,
10446 expectedError: "Stub libraries should have a single apex_available.*anyapex",
10447 },
10448 {
10449 desc: "stub library should not be available to multiple apexes",
10450 hasStubs: true,
10451 apexAvailable: `["myapex", "otherapex"]`,
10452 expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
10453 },
10454 {
Colin Crossaf4c8562024-11-20 15:07:58 -080010455 desc: "stub library can be available to a core apex and a test apex using apex_available_name",
Spandan Das20fce2d2023-04-12 17:21:39 +000010456 hasStubs: true,
Colin Crossaf4c8562024-11-20 15:07:58 -080010457 apexAvailable: `["myapex"]`,
Spandan Das20fce2d2023-04-12 17:21:39 +000010458 },
10459 }
10460 bpTemplate := `
10461 cc_library {
10462 name: "libfoo",
10463 %v
10464 apex_available: %v,
10465 }
10466 apex {
10467 name: "myapex",
10468 key: "apex.key",
10469 updatable: false,
10470 native_shared_libs: ["libfoo"],
10471 }
10472 apex {
10473 name: "otherapex",
10474 key: "apex.key",
10475 updatable: false,
10476 }
10477 apex_test {
10478 name: "test_myapex",
10479 key: "apex.key",
10480 updatable: false,
10481 native_shared_libs: ["libfoo"],
Colin Crossaf4c8562024-11-20 15:07:58 -080010482 apex_available_name: "myapex",
Spandan Das20fce2d2023-04-12 17:21:39 +000010483 }
10484 apex_key {
10485 name: "apex.key",
10486 }
10487 `
10488 for _, tc := range testCases {
Colin Crossaf4c8562024-11-20 15:07:58 -080010489 t.Run(tc.desc, func(t *testing.T) {
10490 stubs := ""
10491 if tc.hasStubs {
10492 stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
10493 }
10494 bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
10495 mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
10496 fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
10497 })
10498 if tc.expectedError == "" {
10499 testApex(t, bp, mockFsFixturePreparer)
10500 } else {
10501 testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
10502 }
Spandan Das20fce2d2023-04-12 17:21:39 +000010503 })
Spandan Das20fce2d2023-04-12 17:21:39 +000010504 }
10505}
Colin Crossbd3a16b2023-04-25 11:30:51 -070010506
10507func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010508 t.Parallel()
Colin Crossbd3a16b2023-04-25 11:30:51 -070010509 context := android.GroupFixturePreparers(
10510 android.PrepareForIntegrationTestWithAndroid,
10511 cc.PrepareForIntegrationTestWithCc,
10512 PrepareForTestWithApexBuildComponents,
10513 prepareForTestWithMyapex,
10514 filesystem.PrepareForTestWithFilesystemBuildComponents,
10515 )
10516 result := context.RunTestWithBp(t, `
10517 android_system_image {
10518 name: "myfilesystem",
10519 deps: [
10520 "libfoo",
10521 ],
Spandan Das2047a4c2024-11-11 21:24:58 +000010522 linker_config: {
Kiyoung Kim67118212024-11-07 13:23:44 +090010523 gen_linker_config: true,
10524 linker_config_srcs: ["linker.config.json"],
10525 },
Colin Crossbd3a16b2023-04-25 11:30:51 -070010526 }
10527
10528 cc_library {
10529 name: "libfoo",
10530 shared_libs: [
10531 "libbar",
10532 ],
10533 stl: "none",
10534 }
10535
10536 cc_library {
10537 name: "libbar",
10538 stl: "none",
10539 apex_available: ["myapex"],
10540 }
10541
10542 apex {
10543 name: "myapex",
10544 native_shared_libs: ["libbar"],
10545 key: "myapex.key",
10546 updatable: false,
10547 }
10548
10549 apex_key {
10550 name: "myapex.key",
10551 public_key: "testkey.avbpubkey",
10552 private_key: "testkey.pem",
10553 }
10554 `)
10555
Cole Faust3b806d32024-03-11 15:15:03 -070010556 inputs := result.ModuleForTests("myfilesystem", "android_common").Output("myfilesystem.img").Implicits
Colin Crossbd3a16b2023-04-25 11:30:51 -070010557 android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
10558 inputs.Strings(),
10559 "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
10560}
Yu Liueae7b362023-11-16 17:05:47 -080010561
10562var apex_default_bp = `
10563 apex_key {
10564 name: "myapex.key",
10565 public_key: "testkey.avbpubkey",
10566 private_key: "testkey.pem",
10567 }
10568
10569 filegroup {
10570 name: "myapex.manifest",
10571 srcs: ["apex_manifest.json"],
10572 }
10573
10574 filegroup {
10575 name: "myapex.androidmanifest",
10576 srcs: ["AndroidManifest.xml"],
10577 }
10578`
10579
10580func TestAconfigFilesJavaDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010581 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010582 ctx := testApex(t, apex_default_bp+`
10583 apex {
10584 name: "myapex",
10585 manifest: ":myapex.manifest",
10586 androidManifest: ":myapex.androidmanifest",
10587 key: "myapex.key",
10588 java_libs: [
10589 "my_java_library_foo",
10590 "my_java_library_bar",
10591 ],
10592 updatable: false,
10593 }
10594
10595 java_library {
10596 name: "my_java_library_foo",
10597 srcs: ["foo/bar/MyClass.java"],
10598 sdk_version: "none",
10599 system_modules: "none",
10600 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010601 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010602 "myapex",
10603 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010604 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010605 }
10606
10607 java_library {
10608 name: "my_java_library_bar",
10609 srcs: ["foo/bar/MyClass.java"],
10610 sdk_version: "none",
10611 system_modules: "none",
10612 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080010613 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010614 "myapex",
10615 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010616 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010617 }
10618
10619 aconfig_declarations {
10620 name: "my_aconfig_declarations_foo",
10621 package: "com.example.package",
10622 container: "myapex",
10623 srcs: ["foo.aconfig"],
10624 }
10625
10626 java_aconfig_library {
10627 name: "my_java_aconfig_library_foo",
10628 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010629 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010630 "myapex",
10631 ],
10632 }
10633
10634 aconfig_declarations {
10635 name: "my_aconfig_declarations_bar",
10636 package: "com.example.package",
10637 container: "myapex",
10638 srcs: ["bar.aconfig"],
10639 }
10640
10641 java_aconfig_library {
10642 name: "my_java_aconfig_library_bar",
10643 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010644 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010645 "myapex",
10646 ],
10647 }
10648 `)
10649
10650 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10651 s := mod.Rule("apexRule").Args["copy_commands"]
10652 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010653 if len(copyCmds) != 14 {
10654 t.Fatalf("Expected 14 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010655 }
10656
Jooyung Hana3fddf42024-09-03 13:22:21 +090010657 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10658 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10659 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10660 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010661 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info.*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010662
Yu Liubba555e2024-02-17 00:36:42 +000010663 inputs := []string{
10664 "my_aconfig_declarations_foo/intermediate.pb",
10665 "my_aconfig_declarations_bar/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010666 }
Yu Liubba555e2024-02-17 00:36:42 +000010667 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10668 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10669 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10670 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010671 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010672}
10673
10674func TestAconfigFilesJavaAndCcDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010675 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080010676 ctx := testApex(t, apex_default_bp+`
10677 apex {
10678 name: "myapex",
10679 manifest: ":myapex.manifest",
10680 androidManifest: ":myapex.androidmanifest",
10681 key: "myapex.key",
10682 java_libs: [
10683 "my_java_library_foo",
10684 ],
10685 native_shared_libs: [
10686 "my_cc_library_bar",
10687 ],
10688 binaries: [
10689 "my_cc_binary_baz",
10690 ],
10691 updatable: false,
10692 }
10693
10694 java_library {
10695 name: "my_java_library_foo",
10696 srcs: ["foo/bar/MyClass.java"],
10697 sdk_version: "none",
10698 system_modules: "none",
10699 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080010700 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010701 "myapex",
10702 ],
Colin Crosse4f34882024-11-14 12:26:00 -080010703 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080010704 }
10705
10706 cc_library {
10707 name: "my_cc_library_bar",
10708 srcs: ["foo/bar/MyClass.cc"],
Yu Liucec0e412023-11-30 16:45:50 -080010709 static_libs: [
10710 "my_cc_aconfig_library_bar",
10711 "my_cc_aconfig_library_baz",
10712 ],
Yu Liueae7b362023-11-16 17:05:47 -080010713 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010714 "myapex",
10715 ],
10716 }
10717
10718 cc_binary {
10719 name: "my_cc_binary_baz",
10720 srcs: ["foo/bar/MyClass.cc"],
10721 static_libs: ["my_cc_aconfig_library_baz"],
Yu Liueae7b362023-11-16 17:05:47 -080010722 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010723 "myapex",
10724 ],
10725 }
10726
10727 aconfig_declarations {
10728 name: "my_aconfig_declarations_foo",
10729 package: "com.example.package",
10730 container: "myapex",
10731 srcs: ["foo.aconfig"],
10732 }
10733
10734 java_aconfig_library {
10735 name: "my_java_aconfig_library_foo",
10736 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080010737 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010738 "myapex",
10739 ],
10740 }
10741
10742 aconfig_declarations {
10743 name: "my_aconfig_declarations_bar",
10744 package: "com.example.package",
10745 container: "myapex",
10746 srcs: ["bar.aconfig"],
10747 }
10748
10749 cc_aconfig_library {
10750 name: "my_cc_aconfig_library_bar",
10751 aconfig_declarations: "my_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080010752 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010753 "myapex",
10754 ],
10755 }
10756
10757 aconfig_declarations {
10758 name: "my_aconfig_declarations_baz",
10759 package: "com.example.package",
10760 container: "myapex",
10761 srcs: ["baz.aconfig"],
10762 }
10763
10764 cc_aconfig_library {
10765 name: "my_cc_aconfig_library_baz",
10766 aconfig_declarations: "my_aconfig_declarations_baz",
Yu Liueae7b362023-11-16 17:05:47 -080010767 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080010768 "myapex",
10769 ],
10770 }
10771
10772 cc_library {
10773 name: "server_configurable_flags",
10774 srcs: ["server_configurable_flags.cc"],
10775 }
Ted Bauerf0f18592024-04-23 18:25:26 +000010776 cc_library {
10777 name: "libbase",
10778 srcs: ["libbase.cc"],
Ted Bauer1e96f8c2024-04-25 19:50:01 +000010779 apex_available: [
10780 "myapex",
10781 ],
Ted Bauerf0f18592024-04-23 18:25:26 +000010782 }
10783 cc_library {
10784 name: "libaconfig_storage_read_api_cc",
10785 srcs: ["libaconfig_storage_read_api_cc.cc"],
10786 }
Yu Liueae7b362023-11-16 17:05:47 -080010787 `)
10788
10789 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10790 s := mod.Rule("apexRule").Args["copy_commands"]
10791 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Dennis Shen343d09e2024-09-23 17:19:15 +000010792 if len(copyCmds) != 18 {
10793 t.Fatalf("Expected 18 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liueae7b362023-11-16 17:05:47 -080010794 }
10795
Jooyung Hana3fddf42024-09-03 13:22:21 +090010796 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10797 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10798 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10799 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010800 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liueae7b362023-11-16 17:05:47 -080010801
Yu Liubba555e2024-02-17 00:36:42 +000010802 inputs := []string{
10803 "my_aconfig_declarations_foo/intermediate.pb",
10804 "my_cc_library_bar/android_arm64_armv8-a_shared_apex10000/myapex/aconfig_merged.pb",
10805 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liueae7b362023-11-16 17:05:47 -080010806 }
Yu Liubba555e2024-02-17 00:36:42 +000010807 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10808 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10809 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10810 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010811 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liueae7b362023-11-16 17:05:47 -080010812}
10813
Yu Liucec0e412023-11-30 16:45:50 -080010814func TestAconfigFilesRustDeps(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070010815 t.Parallel()
Yu Liucec0e412023-11-30 16:45:50 -080010816 ctx := testApex(t, apex_default_bp+`
10817 apex {
10818 name: "myapex",
10819 manifest: ":myapex.manifest",
10820 androidManifest: ":myapex.androidmanifest",
10821 key: "myapex.key",
10822 native_shared_libs: [
10823 "libmy_rust_library",
10824 ],
10825 binaries: [
10826 "my_rust_binary",
10827 ],
10828 rust_dyn_libs: [
10829 "libmy_rust_dylib",
10830 ],
10831 updatable: false,
10832 }
10833
10834 rust_library {
10835 name: "libflags_rust", // test mock
10836 crate_name: "flags_rust",
10837 srcs: ["lib.rs"],
10838 apex_available: [
10839 "myapex",
10840 ],
10841 }
10842
10843 rust_library {
10844 name: "liblazy_static", // test mock
10845 crate_name: "lazy_static",
10846 srcs: ["src/lib.rs"],
10847 apex_available: [
10848 "myapex",
10849 ],
10850 }
10851
Ted Bauer02d475c2024-03-27 20:56:26 +000010852 rust_library {
10853 name: "libaconfig_storage_read_api", // test mock
10854 crate_name: "aconfig_storage_read_api",
10855 srcs: ["src/lib.rs"],
10856 apex_available: [
10857 "myapex",
10858 ],
10859 }
10860
Ted Bauer6ef40db2024-03-29 14:04:10 +000010861 rust_library {
10862 name: "liblogger", // test mock
10863 crate_name: "logger",
10864 srcs: ["src/lib.rs"],
10865 apex_available: [
10866 "myapex",
10867 ],
10868 }
10869
10870 rust_library {
10871 name: "liblog_rust", // test mock
10872 crate_name: "log_rust",
10873 srcs: ["src/lib.rs"],
10874 apex_available: [
10875 "myapex",
10876 ],
10877 }
10878
Yu Liucec0e412023-11-30 16:45:50 -080010879 rust_ffi_shared {
10880 name: "libmy_rust_library",
10881 srcs: ["src/lib.rs"],
10882 rustlibs: ["libmy_rust_aconfig_library_foo"],
10883 crate_name: "my_rust_library",
10884 apex_available: [
10885 "myapex",
10886 ],
10887 }
10888
10889 rust_library_dylib {
10890 name: "libmy_rust_dylib",
10891 srcs: ["foo/bar/MyClass.rs"],
10892 rustlibs: ["libmy_rust_aconfig_library_bar"],
10893 crate_name: "my_rust_dylib",
10894 apex_available: [
10895 "myapex",
10896 ],
10897 }
10898
10899 rust_binary {
10900 name: "my_rust_binary",
10901 srcs: ["foo/bar/MyClass.rs"],
10902 rustlibs: [
10903 "libmy_rust_aconfig_library_baz",
10904 "libmy_rust_dylib",
10905 ],
10906 apex_available: [
10907 "myapex",
10908 ],
10909 }
10910
10911 aconfig_declarations {
10912 name: "my_aconfig_declarations_foo",
10913 package: "com.example.package",
10914 container: "myapex",
10915 srcs: ["foo.aconfig"],
10916 }
10917
10918 aconfig_declarations {
10919 name: "my_aconfig_declarations_bar",
10920 package: "com.example.package",
10921 container: "myapex",
10922 srcs: ["bar.aconfig"],
10923 }
10924
10925 aconfig_declarations {
10926 name: "my_aconfig_declarations_baz",
10927 package: "com.example.package",
10928 container: "myapex",
10929 srcs: ["baz.aconfig"],
10930 }
10931
10932 rust_aconfig_library {
10933 name: "libmy_rust_aconfig_library_foo",
10934 aconfig_declarations: "my_aconfig_declarations_foo",
10935 crate_name: "my_rust_aconfig_library_foo",
10936 apex_available: [
10937 "myapex",
10938 ],
10939 }
10940
10941 rust_aconfig_library {
10942 name: "libmy_rust_aconfig_library_bar",
10943 aconfig_declarations: "my_aconfig_declarations_bar",
10944 crate_name: "my_rust_aconfig_library_bar",
10945 apex_available: [
10946 "myapex",
10947 ],
10948 }
10949
10950 rust_aconfig_library {
10951 name: "libmy_rust_aconfig_library_baz",
10952 aconfig_declarations: "my_aconfig_declarations_baz",
10953 crate_name: "my_rust_aconfig_library_baz",
10954 apex_available: [
10955 "myapex",
10956 ],
10957 }
10958 `)
10959
10960 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
10961 s := mod.Rule("apexRule").Args["copy_commands"]
10962 copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
Ivan Lozanoa8a1fa12024-10-30 18:15:59 +000010963 if len(copyCmds) != 34 {
10964 t.Fatalf("Expected 34 commands, got %d in:\n%s", len(copyCmds), s)
Yu Liucec0e412023-11-30 16:45:50 -080010965 }
10966
Jooyung Hana3fddf42024-09-03 13:22:21 +090010967 ensureListContainsMatch(t, copyCmds, "^cp -f .*/aconfig_flags.pb .*/image.apex/etc/aconfig_flags.pb")
10968 ensureListContainsMatch(t, copyCmds, "^cp -f .*/package.map .*/image.apex/etc/package.map")
10969 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.map .*/image.apex/etc/flag.map")
10970 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.val .*/image.apex/etc/flag.val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010971 ensureListContainsMatch(t, copyCmds, "^cp -f .*/flag.info .*/image.apex/etc/flag.info")
Yu Liucec0e412023-11-30 16:45:50 -080010972
Yu Liubba555e2024-02-17 00:36:42 +000010973 inputs := []string{
10974 "my_aconfig_declarations_foo/intermediate.pb",
Yu Liuab31c822024-02-28 22:21:31 +000010975 "my_aconfig_declarations_bar/intermediate.pb",
10976 "my_aconfig_declarations_baz/intermediate.pb",
Yu Liubba555e2024-02-17 00:36:42 +000010977 "my_rust_binary/android_arm64_armv8-a_apex10000/myapex/aconfig_merged.pb",
10978 }
10979 VerifyAconfigRule(t, &mod, "combine_aconfig_declarations", inputs, "android_common_myapex/aconfig_flags.pb", "", "")
10980 VerifyAconfigRule(t, &mod, "create_aconfig_package_map_file", inputs, "android_common_myapex/package.map", "myapex", "package_map")
10981 VerifyAconfigRule(t, &mod, "create_aconfig_flag_map_file", inputs, "android_common_myapex/flag.map", "myapex", "flag_map")
10982 VerifyAconfigRule(t, &mod, "create_aconfig_flag_val_file", inputs, "android_common_myapex/flag.val", "myapex", "flag_val")
Dennis Shen343d09e2024-09-23 17:19:15 +000010983 VerifyAconfigRule(t, &mod, "create_aconfig_flag_info_file", inputs, "android_common_myapex/flag.info", "myapex", "flag_info")
Yu Liubba555e2024-02-17 00:36:42 +000010984}
10985
10986func VerifyAconfigRule(t *testing.T, mod *android.TestingModule, desc string, inputs []string, output string, container string, file_type string) {
10987 aconfigRule := mod.Description(desc)
10988 s := " " + aconfigRule.Args["cache_files"]
Yu Liucec0e412023-11-30 16:45:50 -080010989 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
Yu Liubba555e2024-02-17 00:36:42 +000010990 if len(aconfigArgs) != len(inputs) {
10991 t.Fatalf("Expected %d commands, got %d in:\n%s", len(inputs), len(aconfigArgs), s)
Yu Liucec0e412023-11-30 16:45:50 -080010992 }
Yu Liucec0e412023-11-30 16:45:50 -080010993
Yu Liubba555e2024-02-17 00:36:42 +000010994 ensureEquals(t, container, aconfigRule.Args["container"])
10995 ensureEquals(t, file_type, aconfigRule.Args["file_type"])
10996
10997 buildParams := aconfigRule.BuildParams
10998 for _, input := range inputs {
10999 android.EnsureListContainsSuffix(t, aconfigArgs, input)
11000 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), input)
Yu Liucec0e412023-11-30 16:45:50 -080011001 }
Yu Liubba555e2024-02-17 00:36:42 +000011002
11003 ensureContains(t, buildParams.Output.String(), output)
Yu Liucec0e412023-11-30 16:45:50 -080011004}
11005
Yu Liueae7b362023-11-16 17:05:47 -080011006func TestAconfigFilesOnlyMatchCurrentApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011007 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011008 ctx := testApex(t, apex_default_bp+`
11009 apex {
11010 name: "myapex",
11011 manifest: ":myapex.manifest",
11012 androidManifest: ":myapex.androidmanifest",
11013 key: "myapex.key",
11014 java_libs: [
11015 "my_java_library_foo",
11016 "other_java_library_bar",
11017 ],
11018 updatable: false,
11019 }
11020
11021 java_library {
11022 name: "my_java_library_foo",
11023 srcs: ["foo/bar/MyClass.java"],
11024 sdk_version: "none",
11025 system_modules: "none",
11026 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011027 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011028 "myapex",
11029 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011030 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011031 }
11032
11033 java_library {
11034 name: "other_java_library_bar",
11035 srcs: ["foo/bar/MyClass.java"],
11036 sdk_version: "none",
11037 system_modules: "none",
11038 static_libs: ["other_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011039 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011040 "myapex",
11041 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011042 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011043 }
11044
11045 aconfig_declarations {
11046 name: "my_aconfig_declarations_foo",
11047 package: "com.example.package",
11048 container: "myapex",
11049 srcs: ["foo.aconfig"],
11050 }
11051
11052 java_aconfig_library {
11053 name: "my_java_aconfig_library_foo",
11054 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011055 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011056 "myapex",
11057 ],
11058 }
11059
11060 aconfig_declarations {
11061 name: "other_aconfig_declarations_bar",
11062 package: "com.example.package",
11063 container: "otherapex",
11064 srcs: ["bar.aconfig"],
11065 }
11066
11067 java_aconfig_library {
11068 name: "other_java_aconfig_library_bar",
11069 aconfig_declarations: "other_aconfig_declarations_bar",
Yu Liueae7b362023-11-16 17:05:47 -080011070 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011071 "myapex",
11072 ],
11073 }
11074 `)
11075
11076 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11077 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11078 s := " " + combineAconfigRule.Args["cache_files"]
11079 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11080 if len(aconfigArgs) != 1 {
11081 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11082 }
11083 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11084
11085 buildParams := combineAconfigRule.BuildParams
11086 if len(buildParams.Inputs) != 1 {
11087 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11088 }
11089 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11090 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11091}
11092
11093func TestAconfigFilesRemoveDuplicates(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011094 t.Parallel()
Yu Liueae7b362023-11-16 17:05:47 -080011095 ctx := testApex(t, apex_default_bp+`
11096 apex {
11097 name: "myapex",
11098 manifest: ":myapex.manifest",
11099 androidManifest: ":myapex.androidmanifest",
11100 key: "myapex.key",
11101 java_libs: [
11102 "my_java_library_foo",
11103 "my_java_library_bar",
11104 ],
11105 updatable: false,
11106 }
11107
11108 java_library {
11109 name: "my_java_library_foo",
11110 srcs: ["foo/bar/MyClass.java"],
11111 sdk_version: "none",
11112 system_modules: "none",
11113 static_libs: ["my_java_aconfig_library_foo"],
Yu Liueae7b362023-11-16 17:05:47 -080011114 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011115 "myapex",
11116 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011117 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011118 }
11119
11120 java_library {
11121 name: "my_java_library_bar",
11122 srcs: ["foo/bar/MyClass.java"],
11123 sdk_version: "none",
11124 system_modules: "none",
11125 static_libs: ["my_java_aconfig_library_bar"],
Yu Liueae7b362023-11-16 17:05:47 -080011126 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011127 "myapex",
11128 ],
Colin Crosse4f34882024-11-14 12:26:00 -080011129 compile_dex: true,
Yu Liueae7b362023-11-16 17:05:47 -080011130 }
11131
11132 aconfig_declarations {
11133 name: "my_aconfig_declarations_foo",
11134 package: "com.example.package",
11135 container: "myapex",
11136 srcs: ["foo.aconfig"],
11137 }
11138
11139 java_aconfig_library {
11140 name: "my_java_aconfig_library_foo",
11141 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011142 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011143 "myapex",
11144 ],
11145 }
11146
11147 java_aconfig_library {
11148 name: "my_java_aconfig_library_bar",
11149 aconfig_declarations: "my_aconfig_declarations_foo",
Yu Liueae7b362023-11-16 17:05:47 -080011150 apex_available: [
Yu Liueae7b362023-11-16 17:05:47 -080011151 "myapex",
11152 ],
11153 }
11154 `)
11155
11156 mod := ctx.ModuleForTests("myapex", "android_common_myapex")
11157 combineAconfigRule := mod.Rule("All_aconfig_declarations_dump")
11158 s := " " + combineAconfigRule.Args["cache_files"]
11159 aconfigArgs := regexp.MustCompile(" --cache ").Split(s, -1)[1:]
11160 if len(aconfigArgs) != 1 {
11161 t.Fatalf("Expected 1 commands, got %d in:\n%s", len(aconfigArgs), s)
11162 }
11163 android.EnsureListContainsSuffix(t, aconfigArgs, "my_aconfig_declarations_foo/intermediate.pb")
11164
11165 buildParams := combineAconfigRule.BuildParams
11166 if len(buildParams.Inputs) != 1 {
11167 t.Fatalf("Expected 1 input, got %d", len(buildParams.Inputs))
11168 }
11169 android.EnsureListContainsSuffix(t, buildParams.Inputs.Strings(), "my_aconfig_declarations_foo/intermediate.pb")
11170 ensureContains(t, buildParams.Output.String(), "android_common_myapex/aconfig_flags.pb")
11171}
Spandan Das5be63332023-12-13 00:06:32 +000011172
11173// Test that the boot jars come from the _selected_ apex prebuilt
11174// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11175func TestBootDexJarsMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011176 t.Parallel()
Spandan Das5be63332023-12-13 00:06:32 +000011177 checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
11178 t.Helper()
11179 s := ctx.ModuleForTests("dex_bootjars", "android_common")
11180 foundLibfooJar := false
11181 base := stem + ".jar"
11182 for _, output := range s.AllOutputs() {
11183 if filepath.Base(output) == base {
11184 foundLibfooJar = true
11185 buildRule := s.Output(output)
11186 android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
11187 }
11188 }
11189 if !foundLibfooJar {
11190 t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
11191 }
11192 }
11193
Spandan Das64c9e0c2023-12-20 20:13:34 +000011194 // Check that the boot jars of the selected apex are run through boot_jars_package_check
11195 // This validates that the jars on the bootclasspath do not contain packages outside an allowlist
11196 checkBootJarsPackageCheck := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11197 platformBcp := ctx.ModuleForTests("platform-bootclasspath", "android_common")
11198 bootJarsCheckRule := platformBcp.Rule("boot_jars_package_check")
11199 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)
11200 }
11201
11202 // Check that the boot jars used to generate the monolithic hiddenapi flags come from the selected apex
11203 checkBootJarsForMonolithicHiddenapi := func(t *testing.T, ctx *android.TestContext, expectedBootJar string) {
11204 monolithicHiddenapiFlagsCmd := ctx.ModuleForTests("platform-bootclasspath", "android_common").Output("out/soong/hiddenapi/hiddenapi-stub-flags.txt").RuleParams.Command
11205 android.AssertStringMatches(t, "Could not find the correct boot dex jar in monolithic hiddenapi flags generation command", monolithicHiddenapiFlagsCmd, "--boot-dex="+expectedBootJar)
11206 }
11207
Spandan Das5be63332023-12-13 00:06:32 +000011208 bp := `
11209 // Source APEX.
11210
11211 java_library {
11212 name: "framework-foo",
11213 srcs: ["foo.java"],
11214 installable: true,
11215 apex_available: [
11216 "com.android.foo",
11217 ],
11218 }
11219
11220 bootclasspath_fragment {
11221 name: "foo-bootclasspath-fragment",
11222 contents: ["framework-foo"],
11223 apex_available: [
11224 "com.android.foo",
11225 ],
11226 hidden_api: {
11227 split_packages: ["*"],
11228 },
11229 }
11230
11231 apex_key {
11232 name: "com.android.foo.key",
11233 public_key: "com.android.foo.avbpubkey",
11234 private_key: "com.android.foo.pem",
11235 }
11236
11237 apex {
11238 name: "com.android.foo",
11239 key: "com.android.foo.key",
11240 bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11241 updatable: false,
11242 }
11243
11244 // Prebuilt APEX.
11245
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011246 java_sdk_library_import {
Spandan Das5be63332023-12-13 00:06:32 +000011247 name: "framework-foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011248 public: {
11249 jars: ["foo.jar"],
11250 },
Spandan Das5be63332023-12-13 00:06:32 +000011251 apex_available: ["com.android.foo"],
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011252 shared_library: false,
Spandan Das5be63332023-12-13 00:06:32 +000011253 }
11254
11255 prebuilt_bootclasspath_fragment {
11256 name: "foo-bootclasspath-fragment",
11257 contents: ["framework-foo"],
11258 hidden_api: {
11259 annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
11260 metadata: "my-bootclasspath-fragment/metadata.csv",
11261 index: "my-bootclasspath-fragment/index.csv",
11262 stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
11263 all_flags: "my-bootclasspath-fragment/all-flags.csv",
11264 },
11265 apex_available: [
11266 "com.android.foo",
11267 ],
11268 }
11269
11270 prebuilt_apex {
11271 name: "com.android.foo",
11272 apex_name: "com.android.foo",
11273 src: "com.android.foo-arm.apex",
11274 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11275 }
11276
11277 // Another Prebuilt ART APEX
11278 prebuilt_apex {
11279 name: "com.android.foo.v2",
11280 apex_name: "com.android.foo", // Used to determine the API domain
11281 src: "com.android.foo-arm.apex",
11282 exported_bootclasspath_fragments: ["foo-bootclasspath-fragment"],
11283 }
11284
11285 // APEX contribution modules
11286
11287 apex_contributions {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011288 name: "foo.source.contributions",
Spandan Das5be63332023-12-13 00:06:32 +000011289 api_domain: "com.android.foo",
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011290 contents: ["com.android.foo"],
11291 }
11292
11293 apex_contributions {
11294 name: "foo.prebuilt.contributions",
11295 api_domain: "com.android.foo",
11296 contents: ["prebuilt_com.android.foo"],
11297 }
11298
11299 apex_contributions {
11300 name: "foo.prebuilt.v2.contributions",
11301 api_domain: "com.android.foo",
11302 contents: ["com.android.foo.v2"], // prebuilt_ prefix is missing because of prebuilt_rename mutator
Spandan Das5be63332023-12-13 00:06:32 +000011303 }
11304 `
11305
11306 testCases := []struct {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011307 desc string
11308 selectedApexContributions string
11309 expectedBootJar string
Spandan Das5be63332023-12-13 00:06:32 +000011310 }{
11311 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011312 desc: "Source apex com.android.foo is selected, bootjar should come from source java library",
11313 selectedApexContributions: "foo.source.contributions",
Colin Crosse5c7d7c2024-12-18 17:08:07 -080011314 expectedBootJar: "out/soong/.intermediates/foo-bootclasspath-fragment/android_common_com.android.foo/hiddenapi-modular/encoded/framework-foo.jar",
Spandan Das5be63332023-12-13 00:06:32 +000011315 },
11316 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011317 desc: "Prebuilt apex prebuilt_com.android.foo is selected, profile should come from .prof deapexed from the prebuilt",
11318 selectedApexContributions: "foo.prebuilt.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011319 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 +000011320 },
11321 {
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011322 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected, profile should come from .prof deapexed from the prebuilt",
11323 selectedApexContributions: "foo.prebuilt.v2.contributions",
Spandan Das52c01a12024-09-20 01:09:48 +000011324 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 +000011325 },
11326 }
11327
11328 fragment := java.ApexVariantReference{
11329 Apex: proptools.StringPtr("com.android.foo"),
11330 Module: proptools.StringPtr("foo-bootclasspath-fragment"),
11331 }
11332
11333 for _, tc := range testCases {
11334 preparer := android.GroupFixturePreparers(
11335 java.FixtureConfigureApexBootJars("com.android.foo:framework-foo"),
11336 android.FixtureMergeMockFs(map[string][]byte{
11337 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11338 }),
Spandan Das81fe4d12024-05-15 18:43:47 +000011339 // Make sure that we have atleast one platform library so that we can check the monolithic hiddenapi
11340 // file creation.
11341 java.FixtureConfigureBootJars("platform:foo"),
11342 android.FixtureModifyMockFS(func(fs android.MockFS) {
11343 fs["platform/Android.bp"] = []byte(`
11344 java_library {
11345 name: "foo",
11346 srcs: ["Test.java"],
11347 compile_dex: true,
11348 }
11349 `)
11350 fs["platform/Test.java"] = nil
11351 }),
11352
Colin Crossa66b4632024-08-08 15:50:47 -070011353 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das5be63332023-12-13 00:06:32 +000011354 )
Spandan Dasb2fd4ff2024-01-25 04:25:38 +000011355 ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
Spandan Das5be63332023-12-13 00:06:32 +000011356 checkBootDexJarPath(t, ctx, "framework-foo", tc.expectedBootJar)
Spandan Das64c9e0c2023-12-20 20:13:34 +000011357 checkBootJarsPackageCheck(t, ctx, tc.expectedBootJar)
11358 checkBootJarsForMonolithicHiddenapi(t, ctx, tc.expectedBootJar)
Spandan Das5be63332023-12-13 00:06:32 +000011359 }
11360}
Spandan Das3576e762024-01-03 18:57:03 +000011361
11362// Test that product packaging installs the selected mainline module (either source or a specific prebuilt)
11363// RELEASE_APEX_CONTIRBUTIONS_* build flags will be used to select the correct prebuilt for a specific release config
11364func TestInstallationRulesForMultipleApexPrebuilts(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011365 t.Parallel()
Spandan Das3576e762024-01-03 18:57:03 +000011366 // for a mainline module family, check that only the flagged soong module is visible to make
11367 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleName string, hiddenModuleNames []string) {
11368 variation := func(moduleName string) string {
11369 ret := "android_common_com.android.foo"
11370 if moduleName == "com.google.android.foo" {
Colin Cross697f25d2024-12-17 15:27:16 -080011371 ret = "android_common_com.google.android.foo"
Spandan Das3576e762024-01-03 18:57:03 +000011372 }
11373 return ret
11374 }
11375
11376 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11377 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11378
11379 for _, hiddenModuleName := range hiddenModuleNames {
11380 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11381 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11382
11383 }
11384 }
11385
11386 bp := `
11387 apex_key {
11388 name: "com.android.foo.key",
11389 public_key: "com.android.foo.avbpubkey",
11390 private_key: "com.android.foo.pem",
11391 }
11392
11393 // AOSP source apex
11394 apex {
11395 name: "com.android.foo",
11396 key: "com.android.foo.key",
11397 updatable: false,
11398 }
11399
11400 // Google source apex
11401 override_apex {
11402 name: "com.google.android.foo",
11403 base: "com.android.foo",
11404 key: "com.android.foo.key",
11405 }
11406
11407 // Prebuilt Google APEX.
11408
11409 prebuilt_apex {
11410 name: "com.google.android.foo",
11411 apex_name: "com.android.foo",
11412 src: "com.android.foo-arm.apex",
11413 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11414 }
11415
11416 // Another Prebuilt Google APEX
11417 prebuilt_apex {
11418 name: "com.google.android.foo.v2",
11419 apex_name: "com.android.foo",
Spandan Dasa8e2d612024-07-26 19:24:27 +000011420 source_apex_name: "com.google.android.foo",
Spandan Das3576e762024-01-03 18:57:03 +000011421 src: "com.android.foo-arm.apex",
11422 prefer: true, // prefer is set to true on both the prebuilts to induce an error if flagging is not present
11423 }
11424
11425 // APEX contribution modules
11426
11427 apex_contributions {
11428 name: "foo.source.contributions",
11429 api_domain: "com.android.foo",
11430 contents: ["com.google.android.foo"],
11431 }
11432
11433 apex_contributions {
11434 name: "foo.prebuilt.contributions",
11435 api_domain: "com.android.foo",
11436 contents: ["prebuilt_com.google.android.foo"],
11437 }
11438
11439 apex_contributions {
11440 name: "foo.prebuilt.v2.contributions",
11441 api_domain: "com.android.foo",
11442 contents: ["prebuilt_com.google.android.foo.v2"],
11443 }
11444
11445 // This is an incompatible module because it selects multiple versions of the same mainline module
11446 apex_contributions {
11447 name: "foo.prebuilt.duplicate.contributions",
11448 api_domain: "com.android.foo",
11449 contents: [
11450 "prebuilt_com.google.android.foo",
11451 "prebuilt_com.google.android.foo.v2",
11452 ],
11453 }
11454 `
11455
11456 testCases := []struct {
11457 desc string
11458 selectedApexContributions string
11459 expectedVisibleModuleName string
11460 expectedHiddenModuleNames []string
11461 expectedError string
11462 }{
11463 {
11464 desc: "Source apex is selected, prebuilts should be hidden from make",
11465 selectedApexContributions: "foo.source.contributions",
11466 expectedVisibleModuleName: "com.google.android.foo",
11467 expectedHiddenModuleNames: []string{"prebuilt_com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11468 },
11469 {
11470 desc: "Prebuilt apex prebuilt_com.android.foo is selected, source and the other prebuilt should be hidden from make",
11471 selectedApexContributions: "foo.prebuilt.contributions",
11472 expectedVisibleModuleName: "prebuilt_com.google.android.foo",
11473 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo.v2"},
11474 },
11475 {
11476 desc: "Prebuilt apex prebuilt_com.android.fooi.v2 is selected, source and the other prebuilt should be hidden from make",
11477 selectedApexContributions: "foo.prebuilt.v2.contributions",
11478 expectedVisibleModuleName: "prebuilt_com.google.android.foo.v2",
11479 expectedHiddenModuleNames: []string{"com.google.android.foo", "prebuilt_com.google.android.foo"},
11480 },
11481 {
11482 desc: "Multiple versions of a prebuilt apex is selected in the same release config",
11483 selectedApexContributions: "foo.prebuilt.duplicate.contributions",
11484 expectedError: "Found duplicate variations of the same module in apex_contributions: prebuilt_com.google.android.foo and prebuilt_com.google.android.foo.v2",
11485 },
11486 }
11487
11488 for _, tc := range testCases {
11489 preparer := android.GroupFixturePreparers(
11490 android.FixtureMergeMockFs(map[string][]byte{
11491 "system/sepolicy/apex/com.android.foo-file_contexts": nil,
11492 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011493 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das3576e762024-01-03 18:57:03 +000011494 )
11495 if tc.expectedError != "" {
11496 preparer = preparer.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(tc.expectedError))
11497 testApex(t, bp, preparer)
11498 return
11499 }
11500 ctx := testApex(t, bp, preparer)
11501
Spandan Das3576e762024-01-03 18:57:03 +000011502 // Check that
11503 // 1. The contents of the selected apex_contributions are visible to make
11504 // 2. The rest of the apexes in the mainline module family (source or other prebuilt) is hidden from make
11505 checkHideFromMake(t, ctx, tc.expectedVisibleModuleName, tc.expectedHiddenModuleNames)
11506 }
11507}
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011508
Spandan Das85bd4622024-08-01 00:51:20 +000011509// Test that product packaging installs the selected mainline module in workspaces withtout source mainline module
11510func TestInstallationRulesForMultipleApexPrebuiltsWithoutSource(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011511 t.Parallel()
Spandan Das85bd4622024-08-01 00:51:20 +000011512 // for a mainline module family, check that only the flagged soong module is visible to make
11513 checkHideFromMake := func(t *testing.T, ctx *android.TestContext, visibleModuleNames []string, hiddenModuleNames []string) {
11514 variation := func(moduleName string) string {
11515 ret := "android_common_com.android.adservices"
11516 if moduleName == "com.google.android.foo" {
11517 ret = "android_common_com.google.android.foo_com.google.android.foo"
11518 }
11519 return ret
11520 }
11521
11522 for _, visibleModuleName := range visibleModuleNames {
11523 visibleModule := ctx.ModuleForTests(visibleModuleName, variation(visibleModuleName)).Module()
11524 android.AssertBoolEquals(t, "Apex "+visibleModuleName+" selected using apex_contributions should be visible to make", false, visibleModule.IsHideFromMake())
11525 }
11526
11527 for _, hiddenModuleName := range hiddenModuleNames {
11528 hiddenModule := ctx.ModuleForTests(hiddenModuleName, variation(hiddenModuleName)).Module()
11529 android.AssertBoolEquals(t, "Apex "+hiddenModuleName+" not selected using apex_contributions should be hidden from make", true, hiddenModule.IsHideFromMake())
11530
11531 }
11532 }
11533
11534 bp := `
11535 apex_key {
11536 name: "com.android.adservices.key",
11537 public_key: "com.android.adservices.avbpubkey",
11538 private_key: "com.android.adservices.pem",
11539 }
11540
11541 // AOSP source apex
11542 apex {
11543 name: "com.android.adservices",
11544 key: "com.android.adservices.key",
11545 updatable: false,
11546 }
11547
11548 // Prebuilt Google APEX.
11549
11550 prebuilt_apex {
11551 name: "com.google.android.adservices",
11552 apex_name: "com.android.adservices",
11553 src: "com.android.foo-arm.apex",
11554 }
11555
11556 // Another Prebuilt Google APEX
11557 prebuilt_apex {
11558 name: "com.google.android.adservices.v2",
11559 apex_name: "com.android.adservices",
11560 src: "com.android.foo-arm.apex",
11561 }
11562
11563 // APEX contribution modules
11564
11565
11566 apex_contributions {
11567 name: "adservices.prebuilt.contributions",
11568 api_domain: "com.android.adservices",
11569 contents: ["prebuilt_com.google.android.adservices"],
11570 }
11571
11572 apex_contributions {
11573 name: "adservices.prebuilt.v2.contributions",
11574 api_domain: "com.android.adservices",
11575 contents: ["prebuilt_com.google.android.adservices.v2"],
11576 }
11577 `
11578
11579 testCases := []struct {
11580 desc string
11581 selectedApexContributions string
11582 expectedVisibleModuleNames []string
11583 expectedHiddenModuleNames []string
11584 }{
11585 {
11586 desc: "No apex contributions selected, source aosp apex should be visible, and mainline prebuilts should be hidden",
11587 selectedApexContributions: "",
11588 expectedVisibleModuleNames: []string{"com.android.adservices"},
11589 expectedHiddenModuleNames: []string{"com.google.android.adservices", "com.google.android.adservices.v2"},
11590 },
11591 {
11592 desc: "Prebuilt apex prebuilt_com.android.foo is selected",
11593 selectedApexContributions: "adservices.prebuilt.contributions",
11594 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices"},
11595 expectedHiddenModuleNames: []string{"com.google.android.adservices.v2"},
11596 },
11597 {
11598 desc: "Prebuilt apex prebuilt_com.android.foo.v2 is selected",
11599 selectedApexContributions: "adservices.prebuilt.v2.contributions",
11600 expectedVisibleModuleNames: []string{"com.android.adservices", "com.google.android.adservices.v2"},
11601 expectedHiddenModuleNames: []string{"com.google.android.adservices"},
11602 },
11603 }
11604
11605 for _, tc := range testCases {
11606 preparer := android.GroupFixturePreparers(
11607 android.FixtureMergeMockFs(map[string][]byte{
11608 "system/sepolicy/apex/com.android.adservices-file_contexts": nil,
11609 }),
Colin Crossa66b4632024-08-08 15:50:47 -070011610 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", tc.selectedApexContributions),
Spandan Das85bd4622024-08-01 00:51:20 +000011611 )
11612 ctx := testApex(t, bp, preparer)
11613
11614 checkHideFromMake(t, ctx, tc.expectedVisibleModuleNames, tc.expectedHiddenModuleNames)
11615 }
11616}
11617
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011618func TestAconfifDeclarationsValidation(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011619 t.Parallel()
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011620 aconfigDeclarationLibraryString := func(moduleNames []string) (ret string) {
11621 for _, moduleName := range moduleNames {
11622 ret += fmt.Sprintf(`
11623 aconfig_declarations {
11624 name: "%[1]s",
11625 package: "com.example.package",
Yu Liu315a53c2024-04-24 16:41:57 +000011626 container: "system",
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011627 srcs: [
11628 "%[1]s.aconfig",
11629 ],
11630 }
11631 java_aconfig_library {
11632 name: "%[1]s-lib",
11633 aconfig_declarations: "%[1]s",
11634 }
11635 `, moduleName)
11636 }
11637 return ret
11638 }
11639
11640 result := android.GroupFixturePreparers(
11641 prepareForApexTest,
11642 java.PrepareForTestWithJavaSdkLibraryFiles,
11643 java.FixtureWithLastReleaseApis("foo"),
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011644 ).RunTestWithBp(t, `
11645 java_library {
11646 name: "baz-java-lib",
11647 static_libs: [
11648 "baz-lib",
11649 ],
11650 }
11651 filegroup {
11652 name: "qux-filegroup",
Cole Faust65cb40a2024-10-21 15:41:42 -070011653 device_common_srcs: [
Jihoon Kang3921f0b2024-03-12 23:51:37 +000011654 ":qux-lib{.generated_srcjars}",
11655 ],
11656 }
11657 filegroup {
11658 name: "qux-another-filegroup",
11659 srcs: [
11660 ":qux-filegroup",
11661 ],
11662 }
11663 java_library {
11664 name: "quux-java-lib",
11665 srcs: [
11666 "a.java",
11667 ],
11668 libs: [
11669 "quux-lib",
11670 ],
11671 }
11672 java_sdk_library {
11673 name: "foo",
11674 srcs: [
11675 ":qux-another-filegroup",
11676 ],
11677 api_packages: ["foo"],
11678 system: {
11679 enabled: true,
11680 },
11681 module_lib: {
11682 enabled: true,
11683 },
11684 test: {
11685 enabled: true,
11686 },
11687 static_libs: [
11688 "bar-lib",
11689 ],
11690 libs: [
11691 "baz-java-lib",
11692 "quux-java-lib",
11693 ],
11694 aconfig_declarations: [
11695 "bar",
11696 ],
11697 }
11698 `+aconfigDeclarationLibraryString([]string{"bar", "baz", "qux", "quux"}))
11699
11700 m := result.ModuleForTests("foo.stubs.source", "android_common")
11701 outDir := "out/soong/.intermediates"
11702
11703 // Arguments passed to aconfig to retrieve the state of the flags defined in the
11704 // textproto files
11705 aconfigFlagArgs := m.Output("released-flagged-apis-exportable.txt").Args["flags_path"]
11706
11707 // "bar-lib" is a static_lib of "foo" and is passed to metalava as classpath. Thus the
11708 // cache file provided by the associated aconfig_declarations module "bar" should be passed
11709 // to aconfig.
11710 android.AssertStringDoesContain(t, "cache file of a java_aconfig_library static_lib "+
11711 "passed as an input",
11712 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "bar"))
11713
11714 // "baz-java-lib", which statically depends on "baz-lib", is a lib of "foo" and is passed
11715 // to metalava as classpath. Thus the cache file provided by the associated
11716 // aconfig_declarations module "baz" should be passed to aconfig.
11717 android.AssertStringDoesContain(t, "cache file of a lib that statically depends on "+
11718 "java_aconfig_library passed as an input",
11719 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "baz"))
11720
11721 // "qux-lib" is passed to metalava as src via the filegroup, thus the cache file provided by
11722 // the associated aconfig_declarations module "qux" should be passed to aconfig.
11723 android.AssertStringDoesContain(t, "cache file of srcs java_aconfig_library passed as an "+
11724 "input",
11725 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "qux"))
11726
11727 // "quux-java-lib" is a lib of "foo" and is passed to metalava as classpath, but does not
11728 // statically depend on "quux-lib". Therefore, the cache file provided by the associated
11729 // aconfig_declarations module "quux" should not be passed to aconfig.
11730 android.AssertStringDoesNotContain(t, "cache file of a lib that does not statically "+
11731 "depend on java_aconfig_library not passed as an input",
11732 aconfigFlagArgs, fmt.Sprintf("%s/%s/intermediate.pb", outDir, "quux"))
11733}
Cole Faust7c991b42024-05-15 11:17:55 -070011734
11735func TestMultiplePrebuiltsWithSameBase(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011736 t.Parallel()
Cole Faust7c991b42024-05-15 11:17:55 -070011737 ctx := testApex(t, `
11738 apex {
11739 name: "myapex",
11740 key: "myapex.key",
11741 prebuilts: ["myetc", "myetc2"],
11742 min_sdk_version: "29",
11743 }
11744 apex_key {
11745 name: "myapex.key",
11746 public_key: "testkey.avbpubkey",
11747 private_key: "testkey.pem",
11748 }
11749
11750 prebuilt_etc {
11751 name: "myetc",
11752 src: "myprebuilt",
11753 filename: "myfilename",
11754 }
11755 prebuilt_etc {
11756 name: "myetc2",
11757 sub_dir: "mysubdir",
11758 src: "myprebuilt",
11759 filename: "myfilename",
11760 }
11761 `, withFiles(android.MockFS{
11762 "packages/modules/common/build/allowed_deps.txt": nil,
11763 }))
11764
11765 ab := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*apexBundle)
11766 data := android.AndroidMkDataForTest(t, ctx, ab)
11767 var builder strings.Builder
11768 data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
11769 androidMk := builder.String()
11770
11771 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_myfilename.myapex")
11772 android.AssertStringDoesContain(t, "not found", androidMk, "LOCAL_MODULE := etc_mysubdir_myfilename.myapex")
11773}
Spandan Das50801e22024-05-13 18:29:45 +000011774
11775func TestApexMinSdkVersionOverride(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011776 t.Parallel()
Spandan Das50801e22024-05-13 18:29:45 +000011777 checkMinSdkVersion := func(t *testing.T, module android.TestingModule, expectedMinSdkVersion string) {
11778 args := module.Rule("apexRule").Args
11779 optFlags := args["opt_flags"]
11780 if !strings.Contains(optFlags, "--min_sdk_version "+expectedMinSdkVersion) {
11781 t.Errorf("%s: Expected min_sdk_version=%s, got: %s", module.Module(), expectedMinSdkVersion, optFlags)
11782 }
11783 }
11784
11785 checkHasDep := func(t *testing.T, ctx *android.TestContext, m android.Module, wantDep android.Module) {
11786 t.Helper()
11787 found := false
11788 ctx.VisitDirectDeps(m, func(dep blueprint.Module) {
11789 if dep == wantDep {
11790 found = true
11791 }
11792 })
11793 if !found {
11794 t.Errorf("Could not find a dependency from %v to %v\n", m, wantDep)
11795 }
11796 }
11797
11798 ctx := testApex(t, `
11799 apex {
11800 name: "com.android.apex30",
11801 min_sdk_version: "30",
11802 key: "apex30.key",
11803 java_libs: ["javalib"],
11804 }
11805
11806 java_library {
11807 name: "javalib",
11808 srcs: ["A.java"],
11809 apex_available: ["com.android.apex30"],
11810 min_sdk_version: "30",
11811 sdk_version: "current",
Colin Crosse4f34882024-11-14 12:26:00 -080011812 compile_dex: true,
Spandan Das50801e22024-05-13 18:29:45 +000011813 }
11814
11815 override_apex {
11816 name: "com.mycompany.android.apex30",
11817 base: "com.android.apex30",
11818 }
11819
11820 override_apex {
11821 name: "com.mycompany.android.apex31",
11822 base: "com.android.apex30",
11823 min_sdk_version: "31",
11824 }
11825
11826 apex_key {
11827 name: "apex30.key",
11828 public_key: "testkey.avbpubkey",
11829 private_key: "testkey.pem",
11830 }
11831
11832 `, android.FixtureMergeMockFs(android.MockFS{
11833 "system/sepolicy/apex/com.android.apex30-file_contexts": nil,
11834 }),
11835 )
11836
11837 baseModule := ctx.ModuleForTests("com.android.apex30", "android_common_com.android.apex30")
11838 checkMinSdkVersion(t, baseModule, "30")
11839
11840 // Override module, but uses same min_sdk_version
11841 overridingModuleSameMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex30_com.mycompany.android.apex30")
11842 javalibApex30Variant := ctx.ModuleForTests("javalib", "android_common_apex30")
11843 checkMinSdkVersion(t, overridingModuleSameMinSdkVersion, "30")
11844 checkHasDep(t, ctx, overridingModuleSameMinSdkVersion.Module(), javalibApex30Variant.Module())
11845
11846 // Override module, uses different min_sdk_version
11847 overridingModuleDifferentMinSdkVersion := ctx.ModuleForTests("com.android.apex30", "android_common_com.mycompany.android.apex31_com.mycompany.android.apex31")
11848 javalibApex31Variant := ctx.ModuleForTests("javalib", "android_common_apex31")
11849 checkMinSdkVersion(t, overridingModuleDifferentMinSdkVersion, "31")
11850 checkHasDep(t, ctx, overridingModuleDifferentMinSdkVersion.Module(), javalibApex31Variant.Module())
11851}
Spandan Das0b28fa02024-05-28 23:40:17 +000011852
11853func TestOverrideApexWithPrebuiltApexPreferred(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011854 t.Parallel()
Spandan Das0b28fa02024-05-28 23:40:17 +000011855 context := android.GroupFixturePreparers(
11856 android.PrepareForIntegrationTestWithAndroid,
11857 PrepareForTestWithApexBuildComponents,
11858 android.FixtureMergeMockFs(android.MockFS{
11859 "system/sepolicy/apex/foo-file_contexts": nil,
11860 }),
11861 )
11862 res := context.RunTestWithBp(t, `
11863 apex {
11864 name: "foo",
11865 key: "myapex.key",
11866 apex_available_name: "com.android.foo",
11867 variant_version: "0",
11868 updatable: false,
11869 }
11870 apex_key {
11871 name: "myapex.key",
11872 public_key: "testkey.avbpubkey",
11873 private_key: "testkey.pem",
11874 }
11875 prebuilt_apex {
11876 name: "foo",
11877 src: "foo.apex",
11878 prefer: true,
11879 }
11880 override_apex {
11881 name: "myoverrideapex",
11882 base: "foo",
11883 }
11884 `)
11885
Colin Cross697f25d2024-12-17 15:27:16 -080011886 java.CheckModuleHasDependency(t, res.TestContext, "myoverrideapex", "android_common_myoverrideapex", "foo")
Spandan Das0b28fa02024-05-28 23:40:17 +000011887}
Spandan Dasca1d63e2024-07-01 22:53:49 +000011888
11889func TestUpdatableApexMinSdkVersionCurrent(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011890 t.Parallel()
Spandan Dasca1d63e2024-07-01 22:53:49 +000011891 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`, `
11892 apex {
11893 name: "myapex",
11894 key: "myapex.key",
11895 updatable: true,
11896 min_sdk_version: "current",
11897 }
11898
11899 apex_key {
11900 name: "myapex.key",
11901 public_key: "testkey.avbpubkey",
11902 private_key: "testkey.pem",
11903 }
11904 `)
11905}
Spandan Das2f68f192024-07-22 19:25:50 +000011906
11907func TestPrebuiltStubNoinstall(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011908 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011909 testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) {
11910 result := android.GroupFixturePreparers(
11911 prepareForApexTest,
11912 android.PrepareForTestWithAndroidMk,
11913 android.PrepareForTestWithMakevars,
11914 android.FixtureMergeMockFs(fs),
11915 ).RunTest(t)
11916
11917 ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld")
Spandan Das357ffcc2024-07-24 18:07:48 +000011918 android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared_current/libfoo.so")
Spandan Das2f68f192024-07-22 19:25:50 +000011919
11920 installRules := result.InstallMakeRulesForTesting(t)
11921
11922 var installedlibRule *android.InstallMakeRule
11923 for i, rule := range installRules {
11924 if rule.Target == "out/target/product/test_device/system/lib/installedlib.so" {
11925 if installedlibRule != nil {
11926 t.Errorf("Duplicate install rules for %s", rule.Target)
11927 }
11928 installedlibRule = &installRules[i]
11929 }
11930 }
11931 if installedlibRule == nil {
11932 t.Errorf("No install rule found for installedlib")
11933 return
11934 }
11935
11936 if expectLibfooOnSystemLib {
11937 android.AssertStringListContains(t,
11938 "installedlib doesn't have install dependency on libfoo impl",
11939 installedlibRule.OrderOnlyDeps,
11940 "out/target/product/test_device/system/lib/libfoo.so")
11941 } else {
11942 android.AssertStringListDoesNotContain(t,
11943 "installedlib has install dependency on libfoo stub",
11944 installedlibRule.Deps,
11945 "out/target/product/test_device/system/lib/libfoo.so")
11946 android.AssertStringListDoesNotContain(t,
11947 "installedlib has order-only install dependency on libfoo stub",
11948 installedlibRule.OrderOnlyDeps,
11949 "out/target/product/test_device/system/lib/libfoo.so")
11950 }
11951 }
11952
11953 prebuiltLibfooBp := []byte(`
11954 cc_prebuilt_library {
11955 name: "libfoo",
11956 prefer: true,
11957 srcs: ["libfoo.so"],
11958 stubs: {
11959 versions: ["1"],
11960 },
11961 apex_available: ["apexfoo"],
11962 }
11963 `)
11964
11965 apexfooBp := []byte(`
11966 apex {
11967 name: "apexfoo",
11968 key: "apexfoo.key",
11969 native_shared_libs: ["libfoo"],
11970 updatable: false,
11971 compile_multilib: "both",
11972 }
11973 apex_key {
11974 name: "apexfoo.key",
11975 public_key: "testkey.avbpubkey",
11976 private_key: "testkey.pem",
11977 }
11978 `)
11979
11980 installedlibBp := []byte(`
11981 cc_library {
11982 name: "installedlib",
11983 shared_libs: ["libfoo"],
11984 }
11985 `)
11986
11987 t.Run("prebuilt stub (without source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070011988 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000011989 testFunc(
11990 t,
11991 /*expectLibfooOnSystemLib=*/ false,
11992 android.MockFS{
11993 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
11994 "apexfoo/Android.bp": apexfooBp,
11995 "system/sepolicy/apex/apexfoo-file_contexts": nil,
11996 "Android.bp": installedlibBp,
11997 },
11998 )
11999 })
12000
12001 disabledSourceLibfooBp := []byte(`
12002 cc_library {
12003 name: "libfoo",
12004 enabled: false,
12005 stubs: {
12006 versions: ["1"],
12007 },
12008 apex_available: ["apexfoo"],
12009 }
12010 `)
12011
12012 t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012013 t.Parallel()
Spandan Das2f68f192024-07-22 19:25:50 +000012014 testFunc(
12015 t,
12016 /*expectLibfooOnSystemLib=*/ false,
12017 android.MockFS{
12018 "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp,
12019 "impl/Android.bp": disabledSourceLibfooBp,
12020 "apexfoo/Android.bp": apexfooBp,
12021 "system/sepolicy/apex/apexfoo-file_contexts": nil,
12022 "Android.bp": installedlibBp,
12023 },
12024 )
12025 })
12026}
Jihoon Kange246bb72024-09-18 22:26:22 +000012027
12028func TestSdkLibraryTransitiveClassLoaderContext(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012029 t.Parallel()
Jihoon Kange246bb72024-09-18 22:26:22 +000012030 // This test case tests that listing the impl lib instead of the top level java_sdk_library
12031 // in libs of android_app and java_library does not lead to class loader context device/host
12032 // path mismatch errors.
12033 android.GroupFixturePreparers(
12034 prepareForApexTest,
12035 android.PrepareForIntegrationTestWithAndroid,
12036 PrepareForTestWithApexBuildComponents,
12037 android.FixtureModifyEnv(func(env map[string]string) {
12038 env["DISABLE_CONTAINER_CHECK"] = "true"
12039 }),
12040 withFiles(filesForSdkLibrary),
12041 android.FixtureMergeMockFs(android.MockFS{
12042 "system/sepolicy/apex/com.android.foo30-file_contexts": nil,
12043 }),
12044 ).RunTestWithBp(t, `
12045 apex {
12046 name: "com.android.foo30",
12047 key: "myapex.key",
12048 updatable: true,
12049 bootclasspath_fragments: [
12050 "foo-bootclasspath-fragment",
12051 ],
12052 java_libs: [
12053 "bar",
12054 ],
12055 apps: [
12056 "bar-app",
12057 ],
12058 min_sdk_version: "30",
12059 }
12060 apex_key {
12061 name: "myapex.key",
12062 public_key: "testkey.avbpubkey",
12063 private_key: "testkey.pem",
12064 }
12065 bootclasspath_fragment {
12066 name: "foo-bootclasspath-fragment",
12067 contents: [
12068 "framework-foo",
12069 ],
12070 apex_available: [
12071 "com.android.foo30",
12072 ],
12073 hidden_api: {
12074 split_packages: ["*"]
12075 },
12076 }
12077
12078 java_sdk_library {
12079 name: "framework-foo",
12080 srcs: [
12081 "A.java"
12082 ],
12083 unsafe_ignore_missing_latest_api: true,
12084 apex_available: [
12085 "com.android.foo30",
12086 ],
12087 compile_dex: true,
12088 sdk_version: "core_current",
12089 shared_library: false,
12090 }
12091
12092 java_library {
12093 name: "bar",
12094 srcs: [
12095 "A.java"
12096 ],
12097 libs: [
12098 "framework-foo.impl",
12099 ],
12100 apex_available: [
12101 "com.android.foo30",
12102 ],
12103 sdk_version: "core_current",
Colin Crosse4f34882024-11-14 12:26:00 -080012104 compile_dex: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012105 }
12106
12107 java_library {
12108 name: "baz",
12109 srcs: [
12110 "A.java"
12111 ],
12112 libs: [
12113 "bar",
12114 ],
12115 sdk_version: "core_current",
12116 }
12117
12118 android_app {
12119 name: "bar-app",
12120 srcs: [
12121 "A.java"
12122 ],
12123 libs: [
12124 "baz",
12125 "framework-foo.impl",
12126 ],
12127 apex_available: [
12128 "com.android.foo30",
12129 ],
12130 sdk_version: "core_current",
12131 min_sdk_version: "30",
12132 manifest: "AndroidManifest.xml",
Colin Cross99939e92024-10-01 16:02:46 -070012133 updatable: true,
Jihoon Kange246bb72024-09-18 22:26:22 +000012134 }
12135 `)
12136}
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012137
12138// If an apex sets system_ext_specific: true, its systemserverclasspath libraries must set this property as well.
12139func TestApexSSCPJarMustBeInSamePartitionAsApex(t *testing.T) {
Colin Crossa2fdb612024-10-11 12:52:56 -070012140 t.Parallel()
Spandan Dasfbcd5fe2024-09-30 22:30:39 +000012141 testApexError(t, `foo is an apex systemserver jar, but its partition does not match the partition of its containing apex`, `
12142 apex {
12143 name: "myapex",
12144 key: "myapex.key",
12145 systemserverclasspath_fragments: [
12146 "mysystemserverclasspathfragment",
12147 ],
12148 min_sdk_version: "29",
12149 updatable: true,
12150 system_ext_specific: true,
12151 }
12152
12153 apex_key {
12154 name: "myapex.key",
12155 public_key: "testkey.avbpubkey",
12156 private_key: "testkey.pem",
12157 }
12158
12159 java_library {
12160 name: "foo",
12161 srcs: ["b.java"],
12162 min_sdk_version: "29",
12163 installable: true,
12164 apex_available: [
12165 "myapex",
12166 ],
12167 sdk_version: "current",
12168 }
12169
12170 systemserverclasspath_fragment {
12171 name: "mysystemserverclasspathfragment",
12172 contents: [
12173 "foo",
12174 ],
12175 apex_available: [
12176 "myapex",
12177 ],
12178 }
12179 `,
12180 dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
12181 )
12182}
Spandan Das72d86c62024-10-15 19:27:41 +000012183
12184// partitions should not package the artifacts that are included inside the apex.
12185func TestFilesystemWithApexDeps(t *testing.T) {
12186 t.Parallel()
12187 result := testApex(t, `
12188 android_filesystem {
12189 name: "myfilesystem",
12190 deps: ["myapex"],
12191 }
12192 apex {
12193 name: "myapex",
12194 key: "myapex.key",
12195 binaries: ["binfoo"],
12196 native_shared_libs: ["libfoo"],
12197 apps: ["appfoo"],
12198 updatable: false,
12199 }
12200 apex_key {
12201 name: "myapex.key",
12202 }
12203 cc_binary {
12204 name: "binfoo",
12205 apex_available: ["myapex"],
12206 }
12207 cc_library {
12208 name: "libfoo",
12209 apex_available: ["myapex"],
12210 }
12211 android_app {
12212 name: "appfoo",
12213 sdk_version: "current",
12214 apex_available: ["myapex"],
12215 }
12216 `, filesystem.PrepareForTestWithFilesystemBuildComponents)
12217
12218 partition := result.ModuleForTests("myfilesystem", "android_common")
12219 fileList := android.ContentFromFileRuleForTests(t, result, partition.Output("fileList"))
12220 android.AssertDeepEquals(t, "filesystem with apex", "apex/myapex.apex\n", fileList)
12221}
Colin Crossb614cd42024-10-11 12:52:21 -070012222
12223func TestApexVerifyNativeImplementationLibs(t *testing.T) {
12224 t.Parallel()
12225
12226 extractDepenencyPathFromErrors := func(errs []error) []string {
12227 i := slices.IndexFunc(errs, func(err error) bool {
12228 return strings.Contains(err.Error(), "dependency path:")
12229 })
12230 if i < 0 {
12231 return nil
12232 }
12233 var dependencyPath []string
12234 for _, err := range errs[i+1:] {
12235 s := err.Error()
12236 lastSpace := strings.LastIndexByte(s, ' ')
12237 if lastSpace >= 0 {
12238 dependencyPath = append(dependencyPath, s[lastSpace+1:])
12239 }
12240 }
12241 return dependencyPath
12242 }
12243
12244 checkErrors := func(wantDependencyPath []string) func(t *testing.T, result *android.TestResult) {
12245 return func(t *testing.T, result *android.TestResult) {
12246 t.Helper()
12247 if len(result.Errs) == 0 {
12248 t.Fatalf("expected errors")
12249 }
12250 t.Log("found errors:")
12251 for _, err := range result.Errs {
12252 t.Log(err)
12253 }
12254 if g, w := result.Errs[0].Error(), "library in apex transitively linked against implementation library"; !strings.Contains(g, w) {
12255 t.Fatalf("expected error %q, got %q", w, g)
12256 }
12257 dependencyPath := extractDepenencyPathFromErrors(result.Errs)
12258 if g, w := dependencyPath, wantDependencyPath; !slices.Equal(g, w) {
12259 t.Errorf("expected dependency path %q, got %q", w, g)
12260 }
12261 }
12262 }
12263
12264 addToSharedLibs := func(module, lib string) func(bp *bpmodify.Blueprint) {
12265 return func(bp *bpmodify.Blueprint) {
12266 m := bp.ModulesByName(module)
12267 props, err := m.GetOrCreateProperty(bpmodify.List, "shared_libs")
12268 if err != nil {
12269 panic(err)
12270 }
12271 props.AddStringToList(lib)
12272 }
12273 }
12274
12275 bpTemplate := `
12276 apex {
12277 name: "myapex",
12278 key: "myapex.key",
12279 native_shared_libs: ["mylib"],
12280 rust_dyn_libs: ["libmyrust"],
12281 binaries: ["mybin", "myrustbin"],
12282 jni_libs: ["libjni"],
12283 apps: ["myapp"],
12284 updatable: false,
12285 }
12286
12287 apex {
12288 name: "otherapex",
12289 key: "myapex.key",
12290 native_shared_libs: ["libotherapex"],
12291 updatable: false,
12292 }
12293
12294 apex_key {
12295 name: "myapex.key",
12296 public_key: "testkey.avbpubkey",
12297 private_key: "testkey.pem",
12298 }
12299
12300 cc_library {
12301 name: "mylib",
12302 srcs: ["foo.cpp"],
12303 apex_available: ["myapex"],
12304 }
12305
12306 cc_binary {
12307 name: "mybin",
12308 srcs: ["foo.cpp"],
12309 apex_available: ["myapex"],
12310 }
12311
12312 rust_library {
12313 name: "libmyrust",
12314 crate_name: "myrust",
12315 srcs: ["src/lib.rs"],
12316 rustlibs: ["libmyrust_transitive_dylib"],
12317 rlibs: ["libmyrust_transitive_rlib"],
12318 apex_available: ["myapex"],
12319 }
12320
12321 rust_library{
12322 name: "libmyrust_transitive_dylib",
12323 crate_name: "myrust_transitive_dylib",
12324 srcs: ["src/lib.rs"],
12325 apex_available: ["myapex"],
12326 }
12327
12328 rust_library {
12329 name: "libmyrust_transitive_rlib",
12330 crate_name: "myrust_transitive_rlib",
12331 srcs: ["src/lib.rs"],
12332 apex_available: ["myapex"],
12333 }
12334
12335 rust_binary {
12336 name: "myrustbin",
12337 srcs: ["src/main.rs"],
12338 apex_available: ["myapex"],
12339 }
12340
12341 cc_library {
12342 name: "libbar",
12343 sdk_version: "current",
12344 srcs: ["bar.cpp"],
12345 apex_available: ["myapex"],
12346 stl: "none",
12347 }
12348
12349 android_app {
12350 name: "myapp",
12351 jni_libs: ["libembeddedjni"],
12352 use_embedded_native_libs: true,
12353 sdk_version: "current",
12354 apex_available: ["myapex"],
12355 }
12356
12357 cc_library {
12358 name: "libembeddedjni",
12359 sdk_version: "current",
12360 srcs: ["bar.cpp"],
12361 apex_available: ["myapex"],
12362 stl: "none",
12363 }
12364
12365 cc_library {
12366 name: "libjni",
12367 sdk_version: "current",
12368 srcs: ["bar.cpp"],
12369 apex_available: ["myapex"],
12370 stl: "none",
12371 }
12372
12373 cc_library {
12374 name: "libotherapex",
12375 sdk_version: "current",
12376 srcs: ["otherapex.cpp"],
12377 apex_available: ["otherapex"],
12378 stubs: {
12379 symbol_file: "libotherapex.map.txt",
12380 versions: ["1", "2", "3"],
12381 },
12382 stl: "none",
12383 }
12384
12385 cc_library {
12386 name: "libplatform",
12387 sdk_version: "current",
12388 srcs: ["libplatform.cpp"],
12389 stubs: {
12390 symbol_file: "libplatform.map.txt",
12391 versions: ["1", "2", "3"],
12392 },
12393 stl: "none",
12394 system_shared_libs: [],
12395 }
12396 `
12397
12398 testCases := []struct {
12399 name string
12400 bpModifier func(bp *bpmodify.Blueprint)
12401 dependencyPath []string
12402 }{
12403 {
12404 name: "library dependency in other apex",
12405 bpModifier: addToSharedLibs("mylib", "libotherapex#impl"),
12406 dependencyPath: []string{"myapex", "mylib", "libotherapex"},
12407 },
12408 {
12409 name: "transitive library dependency in other apex",
12410 bpModifier: func(bp *bpmodify.Blueprint) {
12411 addToSharedLibs("mylib", "libbar")(bp)
12412 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12413 },
12414 dependencyPath: []string{"myapex", "mylib", "libbar", "libotherapex"},
12415 },
12416 {
12417 name: "library dependency in platform",
12418 bpModifier: addToSharedLibs("mylib", "libplatform#impl"),
12419 dependencyPath: []string{"myapex", "mylib", "libplatform"},
12420 },
12421 {
12422 name: "jni library dependency in other apex",
12423 bpModifier: addToSharedLibs("libjni", "libotherapex#impl"),
12424 dependencyPath: []string{"myapex", "libjni", "libotherapex"},
12425 },
12426 {
12427 name: "transitive jni library dependency in other apex",
12428 bpModifier: func(bp *bpmodify.Blueprint) {
12429 addToSharedLibs("libjni", "libbar")(bp)
12430 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12431 },
12432 dependencyPath: []string{"myapex", "libjni", "libbar", "libotherapex"},
12433 },
12434 {
12435 name: "jni library dependency in platform",
12436 bpModifier: addToSharedLibs("libjni", "libplatform#impl"),
12437 dependencyPath: []string{"myapex", "libjni", "libplatform"},
12438 },
12439 {
12440 name: "transitive jni library dependency in platform",
12441 bpModifier: func(bp *bpmodify.Blueprint) {
12442 addToSharedLibs("libjni", "libbar")(bp)
12443 addToSharedLibs("libbar", "libplatform#impl")(bp)
12444 },
12445 dependencyPath: []string{"myapex", "libjni", "libbar", "libplatform"},
12446 },
Spandan Das10c41362024-12-03 01:33:09 +000012447 {
12448 name: "app jni library dependency in other apex",
12449 bpModifier: addToSharedLibs("libembeddedjni", "libotherapex#impl"),
12450 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libotherapex"},
12451 },
12452 {
12453 name: "transitive app jni library dependency in other apex",
12454 bpModifier: func(bp *bpmodify.Blueprint) {
12455 addToSharedLibs("libembeddedjni", "libbar")(bp)
12456 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12457 },
12458 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libotherapex"},
12459 },
12460 {
12461 name: "app jni library dependency in platform",
12462 bpModifier: addToSharedLibs("libembeddedjni", "libplatform#impl"),
12463 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libplatform"},
12464 },
12465 {
12466 name: "transitive app jni library dependency in platform",
12467 bpModifier: func(bp *bpmodify.Blueprint) {
12468 addToSharedLibs("libembeddedjni", "libbar")(bp)
12469 addToSharedLibs("libbar", "libplatform#impl")(bp)
12470 },
12471 dependencyPath: []string{"myapex", "myapp", "libembeddedjni", "libbar", "libplatform"},
12472 },
Colin Crossb614cd42024-10-11 12:52:21 -070012473 {
12474 name: "binary dependency in other apex",
12475 bpModifier: addToSharedLibs("mybin", "libotherapex#impl"),
12476 dependencyPath: []string{"myapex", "mybin", "libotherapex"},
12477 },
12478 {
12479 name: "transitive binary dependency in other apex",
12480 bpModifier: func(bp *bpmodify.Blueprint) {
12481 addToSharedLibs("mybin", "libbar")(bp)
12482 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12483 },
12484 dependencyPath: []string{"myapex", "mybin", "libbar", "libotherapex"},
12485 },
12486 {
12487 name: "binary dependency in platform",
12488 bpModifier: addToSharedLibs("mybin", "libplatform#impl"),
12489 dependencyPath: []string{"myapex", "mybin", "libplatform"},
12490 },
12491 {
12492 name: "transitive binary dependency in platform",
12493 bpModifier: func(bp *bpmodify.Blueprint) {
12494 addToSharedLibs("mybin", "libbar")(bp)
12495 addToSharedLibs("libbar", "libplatform#impl")(bp)
12496 },
12497 dependencyPath: []string{"myapex", "mybin", "libbar", "libplatform"},
12498 },
12499
12500 {
12501 name: "rust library dependency in other apex",
12502 bpModifier: addToSharedLibs("libmyrust", "libotherapex#impl"),
12503 dependencyPath: []string{"myapex", "libmyrust", "libotherapex"},
12504 },
12505 {
12506 name: "transitive rust library dependency in other apex",
12507 bpModifier: func(bp *bpmodify.Blueprint) {
12508 addToSharedLibs("libmyrust", "libbar")(bp)
12509 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12510 },
12511 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libotherapex"},
12512 },
12513 {
12514 name: "rust library dependency in platform",
12515 bpModifier: addToSharedLibs("libmyrust", "libplatform#impl"),
12516 dependencyPath: []string{"myapex", "libmyrust", "libplatform"},
12517 },
12518 {
12519 name: "transitive rust library dependency in platform",
12520 bpModifier: func(bp *bpmodify.Blueprint) {
12521 addToSharedLibs("libmyrust", "libbar")(bp)
12522 addToSharedLibs("libbar", "libplatform#impl")(bp)
12523 },
12524 dependencyPath: []string{"myapex", "libmyrust", "libbar", "libplatform"},
12525 },
12526 {
12527 name: "transitive rust library dylib dependency in other apex",
12528 bpModifier: func(bp *bpmodify.Blueprint) {
12529 addToSharedLibs("libmyrust_transitive_dylib", "libotherapex#impl")(bp)
12530 },
12531 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libotherapex"},
12532 },
12533 {
12534 name: "transitive rust library dylib dependency in platform",
12535 bpModifier: func(bp *bpmodify.Blueprint) {
12536 addToSharedLibs("libmyrust_transitive_dylib", "libplatform#impl")(bp)
12537 },
12538 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_dylib", "libplatform"},
12539 },
12540 {
12541 name: "transitive rust library rlib dependency in other apex",
12542 bpModifier: func(bp *bpmodify.Blueprint) {
12543 addToSharedLibs("libmyrust_transitive_rlib", "libotherapex#impl")(bp)
12544 },
12545 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libotherapex"},
12546 },
12547 {
12548 name: "transitive rust library rlib dependency in platform",
12549 bpModifier: func(bp *bpmodify.Blueprint) {
12550 addToSharedLibs("libmyrust_transitive_rlib", "libplatform#impl")(bp)
12551 },
12552 dependencyPath: []string{"myapex", "libmyrust", "libmyrust_transitive_rlib", "libplatform"},
12553 },
12554 {
12555 name: "rust binary dependency in other apex",
12556 bpModifier: addToSharedLibs("myrustbin", "libotherapex#impl"),
12557 dependencyPath: []string{"myapex", "myrustbin", "libotherapex"},
12558 },
12559 {
12560 name: "transitive rust binary dependency in other apex",
12561 bpModifier: func(bp *bpmodify.Blueprint) {
12562 addToSharedLibs("myrustbin", "libbar")(bp)
12563 addToSharedLibs("libbar", "libotherapex#impl")(bp)
12564 },
12565 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libotherapex"},
12566 },
12567 {
12568 name: "rust binary dependency in platform",
12569 bpModifier: addToSharedLibs("myrustbin", "libplatform#impl"),
12570 dependencyPath: []string{"myapex", "myrustbin", "libplatform"},
12571 },
12572 {
12573 name: "transitive rust binary dependency in platform",
12574 bpModifier: func(bp *bpmodify.Blueprint) {
12575 addToSharedLibs("myrustbin", "libbar")(bp)
12576 addToSharedLibs("libbar", "libplatform#impl")(bp)
12577 },
12578 dependencyPath: []string{"myapex", "myrustbin", "libbar", "libplatform"},
12579 },
12580 }
12581
12582 for _, testCase := range testCases {
12583 t.Run(testCase.name, func(t *testing.T) {
12584 t.Parallel()
12585 bp, err := bpmodify.NewBlueprint("", []byte(bpTemplate))
12586 if err != nil {
12587 t.Fatal(err)
12588 }
12589 if testCase.bpModifier != nil {
12590 func() {
12591 defer func() {
12592 if r := recover(); r != nil {
12593 t.Fatalf("panic in bpModifier: %v", r)
12594 }
12595 }()
12596 testCase.bpModifier(bp)
12597 }()
12598 }
12599 android.GroupFixturePreparers(
12600 android.PrepareForTestWithAndroidBuildComponents,
12601 cc.PrepareForTestWithCcBuildComponents,
12602 java.PrepareForTestWithDexpreopt,
12603 rust.PrepareForTestWithRustDefaultModules,
12604 PrepareForTestWithApexBuildComponents,
12605 prepareForTestWithMyapex,
12606 prepareForTestWithOtherapex,
12607 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
12608 variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
12609 }),
12610 ).ExtendWithErrorHandler(android.FixtureCustomErrorHandler(checkErrors(testCase.dependencyPath))).
12611 RunTestWithBp(t, bp.String())
12612 })
12613 }
12614}